diff options
author | Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp> | 2017-02-23 00:34:45 +0900 |
---|---|---|
committer | Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp> | 2017-02-23 00:34:45 +0900 |
commit | 8328b792861038159b1db5362fabd38134bbe795 (patch) | |
tree | fb10f31bc20dc831f29eabe0ebded72fc585f474 /Src | |
parent | 1b0541c52fa20be241a7e601e7650731741d5797 (diff) | |
download | zsh-8328b792861038159b1db5362fabd38134bbe795.tar.gz zsh-8328b792861038159b1db5362fabd38134bbe795.tar.xz zsh-8328b792861038159b1db5362fabd38134bbe795.zip |
40604: revert to the old method if getutent() is not available
Diffstat (limited to 'Src')
-rw-r--r-- | Src/watch.c | 26 |
1 files changed, 22 insertions, 4 deletions
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), |