about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/watch.c26
-rw-r--r--configure.ac2
3 files changed, 28 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f3879afc3..d3ce452bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-23  Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
+
+	* 40604: configure.ac, Src/watch.c: revert to the old method if
+	getutent() is not available
+
 2017-02-21  Barton E. Schaefer  <schaefer@zsh.org>
 
 	* Julien Nicoulaud: 40586:
diff --git a/Src/watch.c b/Src/watch.c
index 6103ef15f..cd7dc643d 100644
--- a/Src/watch.c
+++ b/Src/watch.c
@@ -91,6 +91,9 @@
 #  define setutent setutxent
 #  define getutent getutxent
 #  define endutent endutxent
+#  ifndef HAVE_GETUTENT
+#   define HAVE_GETUTENT 1
+#  endif
 # endif
 
 /*
@@ -482,21 +485,32 @@ ucmp(WATCH_STRUCT_UTMP *u, WATCH_STRUCT_UTMP *v)
 static int
 readwtab(WATCH_STRUCT_UTMP **head, int initial_sz)
 {
-    WATCH_STRUCT_UTMP *uptr, *tmp;
+    WATCH_STRUCT_UTMP *uptr;
     int wtabmax = initial_sz < 2 ? 32 : initial_sz;
     int sz = 0;
+# ifdef HAVE_GETUTENT
+    WATCH_STRUCT_UTMP *tmp;
+# else
+    FILE *in;
+# endif
 
     uptr = *head = (WATCH_STRUCT_UTMP *)
 	zalloc(wtabmax * sizeof(WATCH_STRUCT_UTMP));
+# ifdef HAVE_GETUTENT
     setutent();
     while ((tmp = getutent()) != NULL) {
+	memcpy(uptr, tmp, sizeof (WATCH_STRUCT_UTMP));
+# else
+    if (!(in = fopen(WATCH_UTMP_FILE, "r")))
+	return 0;
+    while (fread(uptr, sizeof(WATCH_STRUCT_UTMP), 1, in)) {
+# endif
 # ifdef USER_PROCESS
-	if   (tmp->ut_type == USER_PROCESS)
+	if (uptr->ut_type == USER_PROCESS)
 # else /* !USER_PROCESS */
-	if   (tmp->ut_name[0])
+	if (uptr->ut_name[0])
 # endif /* !USER_PROCESS */
 	{
-	    memcpy(uptr, tmp, sizeof (WATCH_STRUCT_UTMP));
 	    uptr++;
 	    if (++sz == wtabmax) {
 		uptr = (WATCH_STRUCT_UTMP *)
@@ -512,7 +526,11 @@ readwtab(WATCH_STRUCT_UTMP **head, int initial_sz)
 	    }
 	}
     }
+# ifdef HAVE_GETUTENT
     endutent();
+# else
+    fclose(in);
+# endif
 
     if (sz)
 	qsort((void *) *head, sz, sizeof(WATCH_STRUCT_UTMP),
diff --git a/configure.ac b/configure.ac
index c6ece6709..0551a69f0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1325,7 +1325,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
 	       cygwin_conv_path \
 	       nanosleep \
 	       srand_deterministic \
-	       setutxent getutxent endutxent)
+	       setutxent getutxent endutxent getutent)
 AC_FUNC_STRCOLL
 
 AH_TEMPLATE([REALPATH_ACCEPTS_NULL],