Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/who abstract out utmp loading.



details:   https://anonhg.NetBSD.org/src/rev/2c378a097367
branches:  trunk
changeset: 534683:2c378a097367
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Aug 01 23:23:07 2002 +0000

description:
abstract out utmp loading.

diffstat:

 usr.bin/who/Makefile    |    3 +-
 usr.bin/who/utmpentry.c |  269 ++++++++++++++++++++++++++++++++++++++++++++++++
 usr.bin/who/utmpentry.h |   50 ++++++++
 usr.bin/who/who.c       |  211 ++-----------------------------------
 4 files changed, 334 insertions(+), 199 deletions(-)

diffs (truncated from 613 to 300 lines):

diff -r 7693407cf800 -r 2c378a097367 usr.bin/who/Makefile
--- a/usr.bin/who/Makefile      Thu Aug 01 23:20:20 2002 +0000
+++ b/usr.bin/who/Makefile      Thu Aug 01 23:23:07 2002 +0000
@@ -1,7 +1,8 @@
-#      $NetBSD: Makefile,v 1.6 2002/07/28 21:46:34 christos Exp $
+#      $NetBSD: Makefile,v 1.7 2002/08/01 23:23:07 christos Exp $
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
 
 PROG=  who
+SRCS=  who.c utmpentry.c
 CPPFLAGS+=     -DSUPPORT_UTMPX -DSUPPORT_UTMP
 
 .include <bsd.prog.mk>
diff -r 7693407cf800 -r 2c378a097367 usr.bin/who/utmpentry.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/who/utmpentry.c   Thu Aug 01 23:23:07 2002 +0000
@@ -0,0 +1,269 @@
+/*     $NetBSD: utmpentry.c,v 1.1 2002/08/01 23:23:08 christos Exp $   */
+
+/*-
+ * Copyright (c) 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: utmpentry.c,v 1.1 2002/08/01 23:23:08 christos Exp $");
+#endif
+
+#include <sys/stat.h>
+
+#include <time.h>
+#include <string.h>
+#include <err.h>
+#include <stdlib.h>
+
+#ifdef SUPPORT_UTMP
+#include <utmp.h>
+#endif
+#ifdef SUPPORT_UTMPX
+#include <utmpx.h>
+#endif
+
+#include "utmpentry.h"
+
+
+#ifdef SUPPORT_UTMP
+static void getentry(struct utmpentry *, struct utmp *);
+static time_t utmptime = 0;
+#endif
+#ifdef SUPPORT_UTMPX
+static void getentryx(struct utmpentry *, struct utmpx *);
+static time_t utmpxtime = 0;
+#endif
+#if defined(SUPPORT_UTMPX) && defined(SUPPORT_UTMP)
+static int setup(const char *);
+static void adjust_size(struct utmpentry *e);
+#endif
+
+int maxname = 8, maxline = 8, maxhost = 16;
+static int numutmp = 0;
+static struct utmpentry *ehead;
+
+#if defined(SUPPORT_UTMPX) && defined(SUPPORT_UTMP)
+static void
+adjust_size(struct utmpentry *e)
+{
+       int max;
+
+       if ((max = strlen(e->name)) > maxname)
+               maxname = max;
+       if ((max = strlen(e->line)) > maxline)
+               maxline = max;
+       if ((max = strlen(e->host)) > maxhost)
+               maxhost = max;
+}
+
+static int
+setup(const char *fname)
+{
+       int what = 3;
+       struct stat st;
+
+       if (fname == NULL) {
+#ifdef SUPPORT_UTMPX
+               setutent();
+#endif
+#ifdef SUPPORT_UTMP
+               setutxent();
+#endif
+       } else {
+               size_t len = strlen(fname);
+               if (len == 0)
+                       errx(1, "Filename cannot be 0 length.");
+               what = fname[len - 1] == 'x' ? 1 : 2;
+               if (what == 1) {
+#ifdef SUPPORT_UTMPX
+                       if (utmpxname(fname) == 0)
+                               err(1, "Cannot open `%s'", fname);
+#else
+                       errx(1, "utmpx support not compiled in");
+#endif
+               } else {
+#ifdef SUPPORT_UTMPX
+                       if (utmpname(fname) == 0)
+                               err(1, "Cannot open `%s'", fname);
+#else
+                       errx(1, "utmp support not compiled in");
+#endif
+               }
+       }
+#ifdef SUPPORT_UTMPX
+       if (what & 1) {
+               (void)stat(fname ? fname : _PATH_UTMPX, &st);
+               if (st.st_mtime > utmpxtime)
+                       utmpxtime = st.st_mtime;
+               else
+                       what &= ~1;
+       }
+#endif
+#ifdef SUPPORT_UTMP
+       if (what & 2) {
+               (void)stat(fname ? fname : _PATH_UTMP, &st);
+               if (st.st_mtime > utmptime)
+                       utmptime = st.st_mtime;
+               else
+                       what &= ~2;
+       }
+#endif
+                       
+       return what;
+}
+#endif
+
+void
+freeutentries(struct utmpentry *ep)
+{
+       if (ep == ehead) {
+               ehead = NULL;
+               numutmp = 0;
+       }
+       while (ep) {
+               struct utmpentry *sep;
+               ep = ep->next;
+               free(sep);
+       }
+}
+
+int
+getutentries(const char *fname, struct utmpentry **epp)
+{
+#ifdef SUPPORT_UTMPX
+       struct utmpx *utx;
+#endif
+#ifdef SUPPORT_UTMP
+       struct utmp *ut;
+#endif
+       struct utmpentry *ep, *ehead = NULL;
+#if defined(SUPPORT_UTMP) && defined(SUPPORT_UTMPX)
+       int what = setup(fname);
+       struct utmpentry **nextp = &ehead;
+#endif
+       if (what == 0) {
+               *epp = ehead;
+               return numutmp;
+       } else {
+               ehead = NULL;
+               numutmp = 0;
+       }
+
+#ifdef SUPPORT_UTMPX
+       while ((what & 1) && (utx = getutxent()) != NULL) {
+               if (fname == NULL && utx->ut_type != USER_PROCESS)
+                       continue;
+               if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL)
+                       err(1, NULL);
+               getentryx(ep, utx);
+               *nextp = ep;
+               nextp = &(ep->next);
+       }
+#endif
+
+#ifdef SUPPORT_UTMP
+       while ((what & 2) && (ut = getutent()) != NULL) {
+               if (fname == NULL && (*ut->ut_name == '\0' ||
+                   *ut->ut_line == '\0'))
+                       continue;
+               /* Don't process entries that we have utmpx for */
+               for (ep = ehead; ep != NULL; ep = ep->next) {
+                       if (strncmp(ep->line, ut->ut_line,
+                           sizeof(ut->ut_line)) == 0)
+                               break;
+               }
+               if (ep != NULL)
+                       continue;
+               if ((ep = calloc(1, sizeof(struct utmpentry))) == NULL)
+                       err(1, NULL);
+               getentry(ep, ut);
+               *nextp = ep;
+               nextp = &(ep->next);
+       }
+#endif
+       numutmp = 0;
+#if defined(SUPPORT_UTMP) && defined(SUPPORT_UTMPX)
+       if (ehead != NULL) {
+               struct utmpentry *from = ehead, *save;
+               
+               ehead = NULL;
+               while (from != NULL) {
+                       for (nextp = &ehead;
+                           (*nextp) && strcmp(from->line, (*nextp)->line) > 0;
+                           nextp = &(*nextp)->next)
+                               continue;
+                       save = from;
+                       from = from->next;
+                       save->next = *nextp;
+                       *nextp = save;
+                       numutmp++;
+               }
+       }
+#endif
+       *epp = ehead;
+       return numutmp;
+}
+
+#ifdef SUPPORT_UTMP
+static void
+getentry(struct utmpentry *e, struct utmp *up)
+{
+       (void)strncpy(e->name, up->ut_name, sizeof(up->ut_name));
+       e->name[sizeof(e->name) - 1] = '\0';
+       (void)strncpy(e->line, up->ut_line, sizeof(up->ut_line));
+       e->line[sizeof(e->line) - 1] = '\0';
+       (void)strncpy(e->host, up->ut_host, sizeof(up->ut_host));
+       e->name[sizeof(e->host) - 1] = '\0';
+       e->tv.tv_sec = up->ut_time;
+       e->tv.tv_usec = 0;
+       adjust_size(e);
+}
+#endif
+
+#ifdef SUPPORT_UTMPX
+static void
+getentryx(struct utmpentry *e, struct utmpx *up)
+{
+       (void)strncpy(e->name, up->ut_name, sizeof(up->ut_name));
+       e->name[sizeof(e->name) - 1] = '\0';
+       (void)strncpy(e->line, up->ut_line, sizeof(up->ut_line));
+       e->line[sizeof(e->line) - 1] = '\0';
+       (void)strncpy(e->host, up->ut_host, sizeof(up->ut_host));
+       e->name[sizeof(e->host) - 1] = '\0';
+       e->tv = up->ut_tv;
+       adjust_size(e);
+}
+#endif
diff -r 7693407cf800 -r 2c378a097367 usr.bin/who/utmpentry.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/who/utmpentry.h   Thu Aug 01 23:23:07 2002 +0000
@@ -0,0 +1,50 @@
+/*     $Header: /cvsroot/src/usr.bin/who/utmpentry.h,v 1.1 2002/08/01 23:23:08 christos Exp $  */
+
+/*-
+ * Copyright (c) 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without



Home | Main Index | Thread Index | Old Index