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