Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: fix watch implementation (and Re: UTF-8 locales on BSDs do not support collation correctly)



After the commit d3cf881 (worker/40333), watch.c fails to
compile on OpenBSD (worker/40416), simply because
OpenBSD does not have getutent() (nor getutxent()).

We need to use the old way (open/fread/close) to read
the utmp/utmpx file on systems like OpenBSD.


diff --git a/Src/watch.c b/Src/watch.c
index 6103ef1..f033805 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
+#  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 c6ece67..0551a69 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],






Messages sorted by: Reverse Date, Date, Thread, Author