summaryrefslogtreecommitdiff
path: root/app/sessreg/sessreg.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2011-10-31 13:49:19 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2011-10-31 13:49:19 +0000
commit3fc75a8fac14d2c00b6eda459a656337f6ffd12d (patch)
tree7748811d2d647519c50f11a886a112d757c8e0a1 /app/sessreg/sessreg.c
parent8c3210c84218a028afd7ad61f5d0d63788b508b2 (diff)
Update to sessreg 1.0.7
Diffstat (limited to 'app/sessreg/sessreg.c')
-rw-r--r--app/sessreg/sessreg.c302
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 (&current_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;
}