pax_global_header00006660000000000000000000000064116504410070014510gustar00rootroot0000000000000052 comment=7ac51a652bfb8423604bb1a120568d44516c9de9 sessreg-1.0.7/000075500000000000000000000000001165044100700131665ustar00rootroot00000000000000sessreg-1.0.7/.gitignore000064400000000000000000000017751165044100700151700ustar00rootroot00000000000000# # X.Org module default exclusion patterns # The next section if for module specific patterns # # Do not edit the following section # GNU Build System (Autotools) aclocal.m4 autom4te.cache/ autoscan.log ChangeLog compile config.guess config.h config.h.in config.log config-ml.in config.py config.status config.status.lineno config.sub configure configure.scan depcomp .deps/ INSTALL install-sh .libs/ libtool libtool.m4 ltmain.sh lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 Makefile Makefile.in mdate-sh missing mkinstalldirs *.pc py-compile stamp-h? symlink-tree texinfo.tex ylwrap # Do not edit the following section # Edit Compile Debug Document Distribute *~ *.[0-9] *.[0-9]x *.bak *.bin core *.dll *.exe *-ISO*.bdf *-JIS*.bdf *-KOI8*.bdf *.kld *.ko *.ko.cmd *.lai *.l[oa] *.[oa] *.obj *.patch *.so *.pcf.gz *.pdb *.tar.bz2 *.tar.gz # # Add & Override patterns for sessreg # # Edit the following section as needed # For example, !report.pc overrides *.pc. See 'man gitignore' # filenames.sed sessreg sessreg-1.0.7/AUTHORS000064400000000000000000000002301165044100700142310ustar00rootroot00000000000000Original Author: Keith Packard, MIT X Consortium Lastlog support and dynamic utmp entry allocation by Andreas Stolcke sessreg-1.0.7/COPYING000064400000000000000000000043271165044100700142270ustar00rootroot00000000000000Copyright 1990, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sessreg-1.0.7/Makefile.am000064400000000000000000000031041165044100700152200ustar00rootroot00000000000000# Copyright 2005 Red Hat, Inc. # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of Red Hat not be used in # advertising or publicity pertaining to distribution of the software without # specific, written prior permission. Red Hat makes no # representations about the suitability of this software for any purpose. It # is provided "as is" without express or implied warranty. # # RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO # EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, # DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. SUBDIRS = man bin_PROGRAMS = sessreg AM_CFLAGS = $(CWARNFLAGS) $(SESSREG_CFLAGS) sessreg_SOURCES = \ sessreg.h \ sessreg.c if LINT ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) lint: $(LINT) $(ALL_LINT_FLAGS) $(sessreg_SOURCES) endif LINT MAINTAINERCLEANFILES = ChangeLog INSTALL .PHONY: ChangeLog INSTALL INSTALL: $(INSTALL_CMD) ChangeLog: $(CHANGELOG_CMD) dist-hook: ChangeLog INSTALL sessreg-1.0.7/README000064400000000000000000000014631165044100700140520ustar00rootroot00000000000000Sessreg is a simple program for managing utmp/wtmp entries for X sessions. It was originally written for use with xdm, but may also be used with other display managers such as gdm or kdm. All questions regarding this software should be directed at the Xorg mailing list: http://lists.freedesktop.org/mailman/listinfo/xorg Please submit bug reports to the Xorg bugzilla: https://bugs.freedesktop.org/enter_bug.cgi?product=xorg The master development code repository can be found at: git://anongit.freedesktop.org/git/xorg/app/sessreg http://cgit.freedesktop.org/xorg/app/sessreg For patch submission instructions, see: http://www.x.org/wiki/Development/Documentation/SubmittingPatches For more information on the git code manager, see: http://wiki.x.org/wiki/GitPage sessreg-1.0.7/autogen.sh000075500000000000000000000003041165044100700151640ustar00rootroot00000000000000#! /bin/sh srcdir=`dirname $0` test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir autoreconf -v --install || exit 1 cd $ORIGDIR || exit $? $srcdir/configure --enable-maintainer-mode "$@" sessreg-1.0.7/configure.ac000064400000000000000000000050451165044100700154600ustar00rootroot00000000000000dnl Copyright 2005 Red Hat, Inc. dnl dnl Permission to use, copy, modify, distribute, and sell this software and its dnl documentation for any purpose is hereby granted without fee, provided that dnl the above copyright notice appear in all copies and that both that dnl copyright notice and this permission notice appear in supporting dnl documentation, and that the name of Red Hat not be used in dnl advertising or publicity pertaining to distribution of the software without dnl specific, written prior permission. Red Hat makes no dnl representations about the suitability of this software for any purpose. It dnl is provided "as is" without express or implied warranty. dnl dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO dnl EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR dnl PERFORMANCE OF THIS SOFTWARE. dnl dnl Process this file with autoconf to create configure. # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([sessreg], [1.0.7], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [sessreg]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_HEADERS([config.h]) AC_USE_SYSTEM_EXTENSIONS AC_SYS_LARGEFILE # Initialize Automake AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE # Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS m4_ifndef([XORG_MACROS_VERSION], [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) XORG_MACROS_VERSION(1.8) XORG_DEFAULT_OPTIONS XORG_WITH_LINT # Checks for header files. AC_CHECK_HEADERS([lastlog.h pwd.h utmp.h utmpx.h sys/param.h]) # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_MEMBERS([ struct utmp.ut_host, struct utmp.ut_id, struct utmp.ut_pid, struct utmp.ut_type], [], [], [ #include #include ]) AC_CHECK_MEMBERS([struct utmpx.ut_syslen], [], [], [#include ]) AC_CHECK_TYPES([ struct lastlog], [], [],[ #include #ifdef HAVE_UTMP_H #include #endif #ifdef HAVE_LASTLOG_H #include #endif ]) # Checks for library functions. AC_CHECK_FUNCS([pututline updwtmpx utmpxname]) # Obtain compiler/linker options for depedencies PKG_CHECK_MODULES(SESSREG, xproto) AC_CONFIG_FILES([ Makefile man/Makefile]) AC_OUTPUT sessreg-1.0.7/man/000075500000000000000000000000001165044100700137415ustar00rootroot00000000000000sessreg-1.0.7/man/Makefile.am000064400000000000000000000012361165044100700157770ustar00rootroot00000000000000 appmandir = $(APP_MAN_DIR) appman_PRE = sessreg.man appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX)) EXTRA_DIST = $(appman_PRE) filenames.sed.c CLEANFILES = $(appman_DATA) filenames.sed SUFFIXES = .$(APP_MAN_SUFFIX) .man AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) filenames.sed: filenames.sed.c $(AM_V_GEN)$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(srcdir)/filenames.sed.c | \ grep 's|__' > $@ # String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure MAN_SUBSTS += -f filenames.sed sessreg.$(APP_MAN_SUFFIX): filenames.sed .man.$(APP_MAN_SUFFIX): $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ sessreg-1.0.7/man/filenames.sed.c000064400000000000000000000007221165044100700166230ustar00rootroot00000000000000#include "sessreg.h" #ifdef UTMPX_FILE # define UTF UTMPX_FILE # define UTM utmpx #else # define UTF UTMP_FILE # define UTM utmp #endif #ifdef WTMPX_FILE # define WTF WTMPX_FILE #else # define WTF WTMP_FILE #endif #ifndef TTYS_FILE # define TTYS_FILE "/etc/ttys" #endif #ifndef LLOG_FILE # define LLOG_FILE "/var/log/lastlog" #endif s|__utmp_manpage__|UTM|g s|__utmp_file__|UTF|g s|__wtmp_file__|WTF|g s|__ttys_file__|TTYS_FILE|g s|__lastlog_file__|LLOG_FILE|g sessreg-1.0.7/man/sessreg.man000064400000000000000000000125651165044100700161220ustar00rootroot00000000000000.\" $Xorg: sessreg.man,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ .\" Copyright 1994, 1998 The Open Group .\" .\" Permission to use, copy, modify, distribute, and sell this software and its .\" documentation for any purpose is hereby granted without fee, provided that .\" the above copyright notice appear in all copies and that both that .\" copyright notice and this permission notice appear in supporting .\" documentation. .\" .\" The above copyright notice and this permission notice shall be included .\" in all copies or substantial portions of the Software. .\" .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. .\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR .\" OTHER DEALINGS IN THE SOFTWARE. .\" .\" Except as contained in this notice, the name of The Open Group shall .\" not be used in advertising or otherwise to promote the sale, use or .\" other dealings in this Software without prior written authorization .\" from The Open Group. .\" .\" $XFree86: xc/programs/xdm/sessreg.man,v 1.7 2001/04/23 20:31:09 dawes Exp $ .\" .TH SESSREG __appmansuffix__ __xorgversion__ .SH NAME sessreg \- manage utmp/wtmp entries for non-init clients .SH SYNOPSIS .B sessreg [-w \fIwtmp-file\fP] [-u \fIutmp-file\fP] [-L \fIlastlog-file\fP] [-l \fIline-name\fP] [-h \fIhost-name\fP] [-s \fIslot-number\fP] [-x \fIXservers-file\fP] [-t \fIttys-file\fP] [-a] [-d] \fIuser-name\fP .SH DESCRIPTION .PP \fISessreg\fP is a simple program for managing utmp/wtmp and lastlog entries for xdm sessions. .PP System V has a better interface to utmp than BSD; it dynamically allocates entries in the file, instead of writing them at fixed positions indexed by position in .BR __ttys_file__ . .PP To manage BSD-style utmp files, \fIsessreg\fP has two strategies. In conjunction with xdm, the -x option counts the number of lines in .B __ttys_file__ and then adds to that the number of the line in the Xservers file which specifies the display. The display name must be specified as the "line-name" using the -l option. This sum is used as the "slot-number" in the utmp file that this entry will be written at. In the more general case, the -s option specifies the slot-number directly. If for some strange reason your system uses a file other than .B __ttys_file__ to manage init, the -t option can direct \fIsessreg\fP to look elsewhere for a count of terminal sessions. .PP Conversely, System V managers will not ever need to use these options (-x, -s and -t). To make the program easier to document and explain, \fIsessreg\fP accepts the BSD-specific flags in the System V environment and ignores them. .PP BSD and Linux also have a host-name field in the utmp file which doesn't exist in System V. This option is also ignored by the System V version of \fIsessreg\fP. .SH USAGE .PP In Xstartup, place a call like: .nf sessreg -a -l $DISPLAY -x /etc/X11/xdm/Xservers $USER .fi and in Xreset: .nf sessreg -d -l $DISPLAY -x /etc/X11/xdm/Xservers $USER .fi .SH OPTIONS .IP "\fB-w\fP \fIwtmp-file\fP" This specifies an alternate wtmp file, instead of .BR __wtmp_file__ . The special name "none" disables writing records to the wtmp file. .IP "\fB-u\fP \fIutmp-file\fP" This specifies an alternate utmp file, instead of .BR __utmp_file__ . The special name "none" disables writing records to the utmp file. .IP "\fB-L\fP \fIlastlog-file\fP" This specifies an alternate lastlog file, instead of .BR __lastlog_file__ , if the platform supports lastlog files. The special name "none" disables writing records to the lastlog file. .IP "\fB-l\fP \fIline-name\fP" This describes the "line" name of the entry. For terminal sessions, this is the final pathname segment of the terminal device filename (e.g. ttyd0). For X sessions, it should probably be the local display name given to the users session (e.g. :0). If none is specified, the terminal name will be determined with ttyname(__libmansuffix__) and stripped of leading components. .IP "\fB-h\fP \fIhost-name\fP" This is set for BSD hosts to indicate that the session was initiated from a remote host. In typical xdm usage, this options is not used. .IP "\fB-s\fP \fIslot-number\fP" Each potential session has a unique slot number in BSD systems, most are identified by the position of the \fIline-name\fP in the .BR __ttys_file__ file. This option overrides the default position determined with ttyslot(__libmansuffix__). This option is inappropriate for use with xdm, the -x option is more useful. .IP "\fB-x\fP \fIXservers-file\fP" As X sessions are one-per-display, and each display is entered in this file, this options sets the \fIslot-number\fP to be the number of lines in the \fIttys-file\fP plus the index into this file that the \fIline-name\fP is found. .IP "\fB-t\fP \fIttys-file\fP" This specifies an alternate file which the \fI-x\fP option will use to count the number of terminal sessions on a host. .IP "\fB-a\fP" This session should be added to utmp/wtmp. .IP "\fB-d\fP" This session should be deleted from utmp/wtmp. One of -a/-d must be specified. .SH "SEE ALSO" .BR xdm (__appmansuffix__), .BR __utmp_manpage__ (__filemansuffix__) .SH AUTHOR Keith Packard, MIT X Consortium sessreg-1.0.7/sessreg.c000064400000000000000000000377261165044100700150240ustar00rootroot00000000000000/* * Copyright 1990, 1998 The Open Group * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of The Open Group shall * not be used in advertising or otherwise to promote the sale, use or * other dealings in this Software without prior written authorization * from The Open Group. * */ /* * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * Author: Keith Packard, MIT X Consortium * Lastlog support and dynamic utmp entry allocation * by Andreas Stolcke */ /* * sessreg * * simple wtmp/utmp frobber * * usage: sessreg [ -w ] [ -u ] * [ -l ] * [ -L ] / #ifdef USE_LASTLOG * [ -h ] / BSD only * [ -s ] [ -x Xservers-file ] / BSD only * [ -t ] / BSD only * [ -a ] [ -d ] user-name * * one of -a or -d must be specified */ #include "sessreg.h" #include #include #include #include #include #ifdef USE_UTMP static void set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int addp); #endif #ifdef USE_UTMPX static void set_utmpx (struct utmpx *u, const char *line, const char *user, const char *host, time_t date, int addp); #endif static int wflag, uflag, lflag; static const char *wtmp_file, *utmp_file; static char *line; #ifdef USE_UTMPX #ifdef HAVE_UPDWTMPX static const char *wtmpx_file = NULL; #endif #ifdef HAVE_UTMPXNAME static const char *utmpx_file = NULL; #endif #endif static int utmp_none, wtmp_none; /* * BSD specific variables. To make life much easier for Xstartup/Xreset * maintainers, these arguments are accepted but ignored for sysV */ static int hflag, xflag, tflag; static char *host_name = NULL; #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) static int sflag; static int slot_number; #endif static char *xservers_file, *ttys_file; static char *user_name; static int aflag, dflag; #ifdef USE_LASTLOG static const char *llog_file; static int llog_none, Lflag; #endif static char *program_name; #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) static int findslot (char *line_name, char *host_name, int addp, int slot); static int Xslot (char *ttys_file, char *servers_file, char *tty_line, char *host_name, int addp); #endif static int usage (int x) { if (x) { fprintf (stderr, "%s: usage %s {-a -d} [-w wtmp-file] [-u utmp-file]", program_name, program_name); #ifdef USE_LASTLOG fprintf (stderr, " [-L lastlog-file]"); #endif fprintf (stderr, "\n"); fprintf (stderr, " [-t ttys-file] [-l line-name] [-h host-name]\n"); fprintf (stderr, " [-s slot-number] [-x servers-file] user-name\n"); exit (1); } return x; } static char * getstring (char ***avp, int *flagp) { char **a = *avp; usage ((*flagp)++); if (*++*a) return *a; ++a; usage (!*a); *avp = a; return *a; } #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) static int syserr (int x, const char *s) { if (x == -1) { perror (s); exit (1); } return x; } #endif static int sysnerr (int x, const char *s) { if (x == 0) { perror (s); exit (1); } return x; } int main (int argc, char **argv) { #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) int utmp; #endif #ifndef USE_UTMPX int wtmp; #endif time_t current_time; #ifdef USE_UTMP struct utmp utmp_entry; #endif #ifdef USE_UTMPX struct utmpx utmpx_entry; #endif program_name = argv[0]; while (*++argv && **argv == '-') { switch (*++*argv) { case 'w': wtmp_file = getstring (&argv, &wflag); if (!strcmp (wtmp_file, "none")) wtmp_none = 1; break; case 'u': utmp_file = getstring (&argv, &uflag); if (!strcmp (utmp_file, "none")) utmp_none = 1; break; #ifdef USE_LASTLOG case 'L': llog_file = getstring (&argv, &Lflag); if (!strcmp (llog_file, "none")) llog_none = 1; break; #endif case 't': ttys_file = getstring (&argv, &tflag); break; case 'l': line = getstring (&argv, &lflag); break; case 'h': host_name = getstring (&argv, &hflag); break; case 's': #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) slot_number = atoi (getstring (&argv, &sflag)); #endif break; case 'x': xservers_file = getstring (&argv, &xflag); break; case 'a': aflag++; break; case 'd': dflag++; break; default: usage (1); } } usage (!(user_name = *argv++)); usage (*argv != NULL); /* * complain if neither aflag nor dflag are set, * or if both are set. */ usage (!(aflag ^ dflag)); usage (xflag && !lflag); /* set up default file names */ if (!wflag) { wtmp_file = WTMP_FILE; #if defined(USE_UTMPX) && defined(HAVE_UPDWTMPX) wtmpx_file = WTMPX_FILE; #endif } #ifndef NO_UTMP if (!uflag) { utmp_file = UTMP_FILE; #if defined(USE_UTMPX) && defined(HAVE_UTMPXNAME) utmpx_file = UTMPX_FILE; #endif } #else utmp_none = 1; #endif #ifdef USE_LASTLOG if (!Lflag) llog_file = LLOG_FILE; #endif #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) if (!tflag) ttys_file = TTYS_FILE; if (!sflag && !utmp_none) { if (xflag) sysnerr (slot_number = Xslot (ttys_file, xservers_file, line, host_name, aflag), "Xslot"); else sysnerr (slot_number = ttyslot (), "ttyslot"); } #endif if (!lflag) { sysnerr ((line = ttyname (0)) != NULL, "ttyname"); if (strncmp(line, "/dev/", 5) == 0) line += 5; } time (¤t_time); #ifdef USE_UTMP set_utmp (&utmp_entry, line, user_name, host_name, current_time, aflag); #endif #ifdef USE_UTMPX /* need to set utmpxname() before calling set_utmpx() for UtmpxIdOpen to work */ # ifdef HAVE_UTMPXNAME if (utmpx_file != NULL) { utmpxname (utmpx_file); } # endif set_utmpx (&utmpx_entry, line, user_name, host_name, current_time, aflag); #endif if (!utmp_none) { #ifdef USE_UTMPX # ifdef HAVE_UTMPXNAME if (utmpx_file != NULL) # endif { setutxent (); (void) getutxid (&utmpx_entry); pututxline (&utmpx_entry); endutxent (); } #endif #ifdef USE_UTMP # ifdef HAVE_PUTUTLINE utmpname (utmp_file); setutent (); (void) getutid (&utmp_entry); pututline (&utmp_entry); endutent (); # else utmp = open (utmp_file, O_RDWR); if (utmp != -1) { syserr ((int) lseek (utmp, (long) slot_number * sizeof (struct utmp), 0), "lseek"); sysnerr (write (utmp, (char *) &utmp_entry, sizeof (utmp_entry)) == sizeof (utmp_entry), "write utmp entry"); close (utmp); } # endif #endif /* USE_UTMP */ } if (!wtmp_none) { #ifdef USE_UTMPX # ifdef HAVE_UPDWTMPX if (wtmpx_file != NULL) { updwtmpx(wtmpx_file, &utmpx_entry); } # endif #else wtmp = open (wtmp_file, O_WRONLY|O_APPEND); if (wtmp != -1) { sysnerr (write (wtmp, (char *) &utmp_entry, sizeof (utmp_entry)) == sizeof (utmp_entry), "write wtmp entry"); close (wtmp); } #endif } #ifdef USE_LASTLOG if (aflag && !llog_none) { int llog; struct passwd *pwd = getpwnam(user_name); sysnerr( pwd != NULL, "get user id"); llog = open (llog_file, O_RDWR); if (llog != -1) { struct lastlog ll; sysnerr (lseek(llog, (long) pwd->pw_uid*sizeof(ll), 0) != -1, "seeking lastlog entry"); memset(&ll, 0, sizeof(ll)); ll.ll_time = current_time; if (line) (void) strncpy (ll.ll_line, line, sizeof (ll.ll_line)); if (host_name) (void) strncpy (ll.ll_host, host_name, sizeof (ll.ll_host)); sysnerr (write (llog, (char *) &ll, sizeof (ll)) == sizeof (ll), "write lastlog entry"); close (llog); } } #endif return 0; } /* * fill in the appropriate records of the utmp entry */ #ifdef USE_UTMP static void set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int addp) { memset (u, 0, sizeof (*u)); if (line) (void) strncpy (u->ut_line, line, sizeof (u->ut_line)); else memset (u->ut_line, 0, sizeof (u->ut_line)); if (addp && user) (void) strncpy (u->ut_name, user, sizeof (u->ut_name)); else memset (u->ut_name, 0, sizeof (u->ut_name)); #ifdef HAVE_STRUCT_UTMP_UT_ID if (line) { int i; /* * this is a bit crufty, but * follows the apparent conventions in * the ttys file. ut_id is only 4 bytes * long, and the last 4 bytes of the line * name are written into it, left justified. */ i = strlen (line); if (i >= sizeof (u->ut_id)) i -= sizeof (u->ut_id); else i = 0; (void) strncpy (u->ut_id, line + i, sizeof (u->ut_id)); } else memset (u->ut_id, 0, sizeof (u->ut_id)); #endif #ifdef HAVE_STRUCT_UTMP_UT_PID if (addp) u->ut_pid = getppid (); else u->ut_pid = 0; #endif #ifdef HAVE_STRUCT_UTMP_UT_TYPE if (addp) u->ut_type = USER_PROCESS; else u->ut_type = DEAD_PROCESS; #endif #ifdef HAVE_STRUCT_UTMP_UT_HOST if (addp && host) (void) strncpy (u->ut_host, host, sizeof (u->ut_host)); else memset (u->ut_host, 0, sizeof (u->ut_host)); #endif u->ut_time = date; } #endif /* USE_UTMP */ #ifdef USE_UTMPX static int UtmpxIdOpen( char *utmpId ) { struct utmpx *u; /* pointer to entry in utmp file */ int status = 1; /* return code */ setutxent(); while ( (u = getutxent()) != NULL ) { if ( (strncmp(u->ut_id, utmpId, 4) == 0 ) && u->ut_type != DEAD_PROCESS ) { status = 0; break; } } endutxent(); return (status); } static void set_utmpx (struct utmpx *u, const char *line, const char *user, const char *host, time_t date, int addp) { static const char letters[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (line) { if(strcmp(line, ":0") == 0) (void) strcpy(u->ut_line, "console"); else (void) strncpy (u->ut_line, line, sizeof (u->ut_line)); strncpy(u->ut_host, line, sizeof(u->ut_host)); #ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN u->ut_syslen = strlen(line); #endif } else memset (u->ut_line, 0, sizeof (u->ut_line)); if (addp && user) (void) strncpy (u->ut_user, user, sizeof (u->ut_user)); else memset (u->ut_user, 0, sizeof (u->ut_user)); if (line) { int i; /* * this is a bit crufty, but * follows the apparent conventions in * the ttys file. ut_id is only 4 bytes * long, and the last 4 bytes of the line * name are written into it, left justified. */ i = strlen (line); if (i >= sizeof (u->ut_id)) i -= sizeof (u->ut_id); else i = 0; (void) strncpy (u->ut_id, line + i, sizeof (u->ut_id)); /* make sure there is no entry using identical ut_id */ if (!UtmpxIdOpen(u->ut_id) && addp) { int limit = sizeof(letters) - 1; int t = 0; u->ut_id[1] = line[i]; u->ut_id[2] = line[i+1]; u->ut_id[3] = line[i+2]; do { u->ut_id[0] = letters[t]; t++; } while (!UtmpxIdOpen(u->ut_id) && (t < limit)); } if (!addp && strstr(line, ":") != NULL) { struct utmpx *tmpu; while ( (tmpu = getutxent()) != NULL ) { if ( (strcmp(tmpu->ut_host, line) == 0 ) && tmpu->ut_type != DEAD_PROCESS ) { strncpy(u->ut_id, tmpu->ut_id, sizeof(u->ut_id)); break; } } endutxent(); } } else memset (u->ut_id, 0, sizeof (u->ut_id)); if (addp) { u->ut_pid = getppid (); u->ut_type = USER_PROCESS; } else { u->ut_pid = 0; u->ut_type = DEAD_PROCESS; } u->ut_tv.tv_sec = date; u->ut_tv.tv_usec = 0; } #endif /* USE_UTMPX */ #if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) /* * compute the slot-number for an X display. This is computed * by counting the lines in /etc/ttys and adding the line-number * that the display appears on in Xservers. This is a poor * design, but is limited by the non-existant interface to utmp. * If host_name is non-NULL, assume it contains the display name, * otherwise use the tty_line argument (i.e., the tty name). */ static int Xslot (char *ttys_file, char *servers_file, char *tty_line, char *host_name, int addp) { FILE *ttys, *servers; int c; int slot = 1; int column0 = 1; char servers_line[1024]; char disp_name[512]; int len; char *pos; /* remove screen number from the display name */ memset(disp_name, 0, sizeof(disp_name)); strncpy(disp_name, host_name ? host_name : tty_line, sizeof(disp_name)-1); pos = strrchr(disp_name, ':'); if (pos) { pos = strchr(pos, '.'); if (pos) *pos = '\0'; } sysnerr ((int)(long)(ttys = fopen (ttys_file, "r")), ttys_file); while ((c = getc (ttys)) != EOF) if (c == '\n') { ++slot; column0 = 1; } else column0 = 0; if (!column0) ++slot; (void) fclose (ttys); sysnerr ((int)(long)(servers = fopen (servers_file, "r")), servers_file); len = strlen (disp_name); column0 = 1; while (fgets (servers_line, sizeof (servers_line), servers)) { if (column0 && *servers_line != '#') { if (!strncmp (disp_name, servers_line, len) && (servers_line[len] == ' ' || servers_line[len] == '\t')) return slot; ++slot; } if (servers_line[strlen(servers_line)-1] != '\n') column0 = 0; else column0 = 1; } /* * display not found in Xservers file - allocate utmp entry dinamically */ return findslot (tty_line, host_name, addp, slot); } /* * find a free utmp slot for the X display. This allocates a new entry * past the regular tty entries if necessary, reusing existing entries * (identified by (line,hostname)) if possible. */ static int findslot (char *line_name, char *host_name, int addp, int slot) { int utmp; struct utmp entry; int found = 0; int freeslot = -1; syserr(utmp = open (utmp_file, O_RDONLY), "open utmp"); /* * first, try to locate a previous entry for this display * also record location of a free slots in case we need a new one */ syserr ((int) lseek (utmp, (long) slot * sizeof (struct utmp), 0), "lseek"); if (!host_name) host_name = ""; while (read (utmp, (char *) &entry, sizeof (entry)) == sizeof (entry)) { if (strncmp(entry.ut_line, line_name, sizeof(entry.ut_line)) == 0 #ifdef HAVE_STRUCT_UTMP_UT_HOST && strncmp(entry.ut_host, host_name, sizeof(entry.ut_host)) == 0 #endif ) { found = 1; break; } if (freeslot < 0 && *entry.ut_name == '\0') freeslot = slot; ++slot; } close (utmp); if (found) return slot; else if (!addp) return 0; /* trying to delete a non-existing entry */ else if (freeslot < 0) return slot; /* first slot past current entries */ else return freeslot; } #endif sessreg-1.0.7/sessreg.h000064400000000000000000000065071165044100700150220ustar00rootroot00000000000000/* * Copyright 1990, 1998 The Open Group * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of The Open Group shall * not be used in advertising or otherwise to promote the sale, use or * other dealings in this Software without prior written authorization * from The Open Group. * */ /* * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #ifdef HAVE_UTMP_H # include # define USE_UTMP #endif #ifdef HAVE_UTMPX_H # include # define USE_UTMPX #endif #ifdef HAVE_SYS_PARAM_H # include #endif #if defined(HAVE_STRUCT_LASTLOG) && defined(HAVE_PWD_H) # ifdef HAVE_LASTLOG_H # include # endif # include # define USE_LASTLOG #endif #ifdef CSRG_BASED #if !defined(__FreeBSD__) && !defined(__OpenBSD__) /* *BSD doesn't like a ':0' type entry in utmp */ #define NO_UTMP #endif #endif #ifndef WTMP_FILE # ifdef _PATH_WTMP # define WTMP_FILE _PATH_WTMP # else # define WTMP_FILE "/usr/adm/wtmp" # endif #endif #ifndef UTMP_FILE # ifdef _PATH_UTMP # define UTMP_FILE _PATH_UTMP # else # define UTMP_FILE "/etc/utmp" # endif #endif #ifndef LLOG_FILE # ifdef _PATH_LASTLOG # define LLOG_FILE _PATH_LASTLOG # else # define LLOG_FILE "/usr/adm/lastlog" # endif #endif #ifndef TTYS_FILE # define TTYS_FILE "/etc/ttys" #endif