diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2011-10-31 13:49:19 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2011-10-31 13:49:19 +0000 |
commit | 3fc75a8fac14d2c00b6eda459a656337f6ffd12d (patch) | |
tree | 7748811d2d647519c50f11a886a112d757c8e0a1 /app/sessreg/sessreg.c | |
parent | 8c3210c84218a028afd7ad61f5d0d63788b508b2 (diff) |
Update to sessreg 1.0.7
Diffstat (limited to 'app/sessreg/sessreg.c')
-rw-r--r-- | app/sessreg/sessreg.c | 302 |
1 files changed, 150 insertions, 152 deletions
diff --git a/app/sessreg/sessreg.c b/app/sessreg/sessreg.c index 3dc2992b3..03c05b67b 100644 --- a/app/sessreg/sessreg.c +++ b/app/sessreg/sessreg.c @@ -6,10 +6,10 @@ * 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. @@ -17,7 +17,7 @@ * 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 @@ -25,7 +25,8 @@ * */ -/* Copyright 2005 Sun Microsystems, Inc. All rights reserved. +/* + * 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"), @@ -60,47 +61,42 @@ * * usage: sessreg [ -w <wtmp-file> ] [ -u <utmp-file> ] * [ -l <line> ] - * [ -L <lastlog-file> ] / #ifndef NO_LASTLOG + * [ -L <lastlog-file> ] / #ifdef USE_LASTLOG * [ -h <host-name> ] / BSD only * [ -s <slot-number> ] [ -x Xservers-file ] / BSD only * [ -t <ttys-file> ] / BSD only - * [ -a ] [ -d ] user-name + * [ -a ] [ -d ] user-name * * one of -a or -d must be specified */ #include "sessreg.h" -# include <X11/Xos.h> -# include <X11/Xfuncs.h> -# include <stdio.h> -# include <stdlib.h> - -#if defined(__SVR4) || defined(SVR4) || defined(linux) || defined(__GLIBC__) -# define SYSV -#endif - +#include <X11/Xos.h> +#include <X11/Xfuncs.h> +#include <stdio.h> +#include <stdlib.h> #include <time.h> -#define Time_t time_t #ifdef USE_UTMP static void set_utmp (struct utmp *u, char *line, char *user, char *host, - Time_t date, int addp); + 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); + const char *host, time_t date, int addp); #endif static int wflag, uflag, lflag; -static char *wtmp_file, *utmp_file, *line; +static const char *wtmp_file, *utmp_file; +static char *line; #ifdef USE_UTMPX #ifdef HAVE_UPDWTMPX -static char *wtmpx_file = NULL; +static const char *wtmpx_file = NULL; #endif #ifdef HAVE_UTMPXNAME -static char *utmpx_file = NULL; +static const char *utmpx_file = NULL; #endif #endif static int utmp_none, wtmp_none; @@ -108,22 +104,23 @@ 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, sflag, xflag, tflag; +static int hflag, xflag, tflag; static char *host_name = NULL; -#ifdef USE_UTMP +#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; -#ifndef NO_LASTLOG -static char *llog_file; +#ifdef USE_LASTLOG +static const char *llog_file; static int llog_none, Lflag; #endif static char *program_name; -#ifndef SYSV +#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); @@ -134,7 +131,7 @@ usage (int x) { if (x) { fprintf (stderr, "%s: usage %s {-a -d} [-w wtmp-file] [-u utmp-file]", program_name, program_name); -#ifndef NO_LASTLOG +#ifdef USE_LASTLOG fprintf (stderr, " [-L lastlog-file]"); #endif fprintf (stderr, "\n"); @@ -159,7 +156,7 @@ getstring (char ***avp, int *flagp) return *a; } -#ifndef SYSV +#if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) static int syserr (int x, const char *s) { @@ -184,14 +181,13 @@ sysnerr (int x, const char *s) int main (int argc, char **argv) { -#if defined(USE_UTMP) && !defined(SYSV) +#if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) int utmp; #endif - char *line_tmp; -#ifndef USE_UTMPX +#ifndef USE_UTMPX int wtmp; -#endif - Time_t current_time; +#endif + time_t current_time; #ifdef USE_UTMP struct utmp utmp_entry; #endif @@ -212,7 +208,7 @@ main (int argc, char **argv) if (!strcmp (utmp_file, "none")) utmp_none = 1; break; -#ifndef NO_LASTLOG +#ifdef USE_LASTLOG case 'L': llog_file = getstring (&argv, &Lflag); if (!strcmp (llog_file, "none")) @@ -229,7 +225,7 @@ main (int argc, char **argv) host_name = getstring (&argv, &hflag); break; case 's': -#ifdef USE_UTMP +#if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) slot_number = atoi (getstring (&argv, &sflag)); #endif break; @@ -271,11 +267,11 @@ main (int argc, char **argv) #else utmp_none = 1; #endif -#ifndef NO_LASTLOG +#ifdef USE_LASTLOG if (!Lflag) llog_file = LLOG_FILE; #endif -#if defined(USE_UTMP) && !defined(SYSV) && !defined(linux) && !defined(__QNX__) +#if defined(USE_UTMP) && !defined(HAVE_PUTUTLINE) if (!tflag) ttys_file = TTYS_FILE; if (!sflag && !utmp_none) { @@ -286,12 +282,9 @@ main (int argc, char **argv) } #endif if (!lflag) { - sysnerr ((line_tmp = ttyname (0)) != NULL, "ttyname"); - line = strrchr(line_tmp, '/'); - if (line) - line = line + 1; - else - line = line_tmp; + sysnerr ((line = ttyname (0)) != NULL, "ttyname"); + if (strncmp(line, "/dev/", 5) == 0) + line += 5; } time (¤t_time); #ifdef USE_UTMP @@ -303,27 +296,27 @@ main (int argc, char **argv) UtmpxIdOpen to work */ # ifdef HAVE_UTMPXNAME if (utmpx_file != NULL) { - utmpxname (utmpx_file); + utmpxname (utmpx_file); } # endif set_utmpx (&utmpx_entry, line, user_name, host_name, current_time, aflag); -#endif +#endif if (!utmp_none) { #ifdef USE_UTMPX -# ifdef HAVE_UTMPX_NAME - if (utmpx_file != NULL) +# ifdef HAVE_UTMPXNAME + if (utmpx_file != NULL) # endif - { - setutxent (); - (void) getutxid (&utmpx_entry); - pututxline (&utmpx_entry); - endutxent (); - } + { + setutxent (); + (void) getutxid (&utmpx_entry); + pututxline (&utmpx_entry); + endutxent (); + } #endif #ifdef USE_UTMP -# ifdef SYSV +# ifdef HAVE_PUTUTLINE utmpname (utmp_file); setutent (); (void) getutid (&utmp_entry); @@ -334,7 +327,7 @@ main (int argc, char **argv) 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"); + == sizeof (utmp_entry), "write utmp entry"); close (utmp); } # endif @@ -351,25 +344,25 @@ main (int argc, char **argv) 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"); + == sizeof (utmp_entry), "write wtmp entry"); close (wtmp); } -#endif +#endif } -#ifndef NO_LASTLOG +#ifdef USE_LASTLOG if (aflag && !llog_none) { - int llog; - struct passwd *pwd = getpwnam(user_name); + int llog; + struct passwd *pwd = getpwnam(user_name); - sysnerr( pwd != NULL, "get user id"); - llog = open (llog_file, O_RDWR); + 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"); - bzero((char *)&ll, sizeof(ll)); + != -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)); @@ -377,7 +370,7 @@ main (int argc, char **argv) (void) strncpy (ll.ll_host, host_name, sizeof (ll.ll_host)); sysnerr (write (llog, (char *) &ll, sizeof (ll)) - == sizeof (ll), "write lastlog entry"); + == sizeof (ll), "write lastlog entry"); close (llog); } } @@ -391,18 +384,18 @@ main (int argc, char **argv) #ifdef USE_UTMP static void -set_utmp (struct utmp *u, char *line, char *user, char *host, Time_t date, int addp) +set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int addp) { - bzero (u, sizeof (*u)); + memset (u, 0, sizeof (*u)); if (line) (void) strncpy (u->ut_line, line, sizeof (u->ut_line)); else - bzero (u->ut_line, sizeof (u->ut_line)); + memset (u->ut_line, 0, sizeof (u->ut_line)); if (addp && user) (void) strncpy (u->ut_name, user, sizeof (u->ut_name)); else - bzero (u->ut_name, sizeof (u->ut_name)); -#ifdef SYSV + memset (u->ut_name, 0, sizeof (u->ut_name)); +#ifdef HAVE_STRUCT_UTMP_UT_ID if (line) { int i; /* @@ -419,20 +412,25 @@ set_utmp (struct utmp *u, char *line, char *user, char *host, Time_t date, int a i = 0; (void) strncpy (u->ut_id, line + i, sizeof (u->ut_id)); } else - bzero (u->ut_id, sizeof (u->ut_id)); - if (addp) { + memset (u->ut_id, 0, sizeof (u->ut_id)); +#endif +#ifdef HAVE_STRUCT_UTMP_UT_PID + if (addp) u->ut_pid = getppid (); - u->ut_type = USER_PROCESS; - } else { + 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 -#if (!defined(SYSV) && !defined(__QNX__)) || defined(linux) +#ifdef HAVE_STRUCT_UTMP_UT_HOST if (addp && host) (void) strncpy (u->ut_host, host, sizeof (u->ut_host)); else - bzero (u->ut_host, sizeof (u->ut_host)); + memset (u->ut_host, 0, sizeof (u->ut_host)); #endif u->ut_time = date; } @@ -446,105 +444,105 @@ UtmpxIdOpen( char *utmpId ) 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) + const char *host, time_t date, int addp) { static const char letters[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if (line) + if (line) { - if(strcmp(line, ":0") == 0) - (void) strcpy(u->ut_line, "console"); - else - (void) strncpy (u->ut_line, line, sizeof (u->ut_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)); -#if HAVE_UTMPX_UT_SYSLEN - u->ut_syslen = strlen(line); +#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN + u->ut_syslen = strlen(line); #endif } - else - bzero (u->ut_line, sizeof (u->ut_line)); - if (addp && user) - (void) strncpy (u->ut_user, user, sizeof (u->ut_user)); - else - bzero (u->ut_user, 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)); + 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, + 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 - bzero (u->ut_id, 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; - } + 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(SYSV) +#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 @@ -572,9 +570,9 @@ Xslot (char *ttys_file, char *servers_file, char *tty_line, char *host_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'; + pos = strchr(pos, '.'); + if (pos) + *pos = '\0'; } sysnerr ((int)(long)(ttys = fopen (ttys_file, "r")), ttys_file); while ((c = getc (ttys)) != EOF) @@ -635,13 +633,13 @@ findslot (char *line_name, char *host_name, int addp, int slot) while (read (utmp, (char *) &entry, sizeof (entry)) == sizeof (entry)) { if (strncmp(entry.ut_line, line_name, - sizeof(entry.ut_line)) == 0 -#ifndef __QNX__ - && + 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; } |