changeset 981:96f79ccdd4fa

.
author Jim Meyering <jim@meyering.net>
date Sun, 13 Jul 1997 02:54:48 +0000
parents a563e4042d34
children ea65b688ec7b
files lib/readutmp.c lib/readutmp.h
diffstat 2 files changed, 179 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/readutmp.c	Sun Jul 13 02:54:48 1997 +0000
@@ -0,0 +1,95 @@
+/* GNU's read utmp module.
+   Copyright (C) 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* Written by jla; revised by djm */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* STDC_HEADERS || HAVE_STRING_H */
+
+#include "readutmp.h"
+#include "error.h"
+
+char *xmalloc ();
+
+STRUCT_UTMP *utmp_contents = 0;
+
+/* Copy UT->ut_name into storage obtained from malloc.  Then remove any
+   trailing spaces from the copy, NUL terminate it, and return the copy.  */
+
+char *
+extract_trimmed_name (ut)
+  const STRUCT_UTMP *ut;
+{
+  char *p, *trimmed_name;
+
+  trimmed_name = xmalloc (sizeof (ut->ut_name) + 1);
+  strncpy (trimmed_name, ut->ut_name, sizeof (ut->ut_name));
+  /* Append a trailing space character.  Some systems pad names shorter than
+     the maximum with spaces, others pad with NULs.  Remove any spaces.  */
+  trimmed_name[sizeof (ut->ut_name)] = ' ';
+  p = strchr (trimmed_name, ' ');
+  if (p != NULL)
+    *p = '\0';
+  return trimmed_name;
+}
+
+/* Read the utmp file FILENAME into UTMP_CONTENTS and return the
+   number of entries it contains. */
+
+int
+read_utmp (filename)
+  const char *filename;
+{
+  FILE *utmp;
+  struct stat file_stats;
+  size_t n_read;
+  size_t size;
+
+  if (utmp_contents)
+    {
+      free (utmp_contents);
+      utmp_contents = 0;
+    }
+
+  utmp = fopen (filename, "r");
+  if (utmp == NULL)
+    error (1, errno, "%s", filename);
+
+  fstat (fileno (utmp), &file_stats);
+  size = file_stats.st_size;
+  if (size > 0)
+    utmp_contents = (STRUCT_UTMP *) xmalloc (size);
+  else
+    {
+      fclose (utmp);
+      return 0;
+    }
+
+  /* Use < instead of != in case the utmp just grew.  */
+  n_read = fread (utmp_contents, 1, size, utmp);
+  if (ferror (utmp) || fclose (utmp) == EOF
+      || n_read < size)
+    error (1, errno, "%s", filename);
+
+  return size / sizeof (STRUCT_UTMP);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/readutmp.h	Sun Jul 13 02:54:48 1997 +0000
@@ -0,0 +1,84 @@
+/* Declarations for GNU's read utmp module.
+   Copyright (C) 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* Written by jla; revised by djm */
+
+#ifndef __READUTMP_H__
+# define __READUTMP_H__
+
+# include <stdio.h>
+# include <sys/types.h>
+
+# ifdef HAVE_UTMPX_H
+#  include <utmpx.h>
+#  define STRUCT_UTMP struct utmpx
+#  define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
+# else
+#  include <utmp.h>
+#  define STRUCT_UTMP struct utmp
+#  define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
+# endif
+
+# include <time.h>
+# ifdef HAVE_SYS_PARAM_H
+#  include <sys/param.h>
+# endif
+
+# include <errno.h>
+# ifndef errno
+extern int errno;
+# endif
+
+# if !defined (UTMP_FILE) && defined (_PATH_UTMP)
+#  define UTMP_FILE _PATH_UTMP
+# endif
+
+# if !defined (WTMP_FILE) && defined (_PATH_WTMP)
+#  define WTMP_FILE _PATH_WTMP
+# endif
+
+# ifdef UTMPX_FILE /* Solaris, SysVr4 */
+#  undef UTMP_FILE
+#  define UTMP_FILE UTMPX_FILE
+# endif
+
+# ifdef WTMPX_FILE /* Solaris, SysVr4 */
+#  undef WTMP_FILE
+#  define WTMP_FILE WTMPX_FILE
+# endif
+
+# ifndef UTMP_FILE
+#  define UTMP_FILE "/etc/utmp"
+# endif
+
+# ifndef WTMP_FILE
+#  define WTMP_FILE "/etc/wtmp"
+# endif
+
+extern STRUCT_UTMP * utmp_contents;
+
+# undef PARAMS
+# if defined (__STDC__) && __STDC__
+#  define PARAMS(Args) Args
+# else
+#  define PARAMS(Args) ()
+# endif
+
+extern char * extract_trimmed_name PARAMS((const STRUCT_UTMP *ut));
+extern int read_utmp PARAMS((const char *filename));
+
+#endif /* __READUTMP_H__ */