From 7eeb7bff6efdd659aa33517dc743f2203d9af35a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 27 Jun 2020 09:44:11 -0700 Subject: [PATCH] =?utf8?q?getloadavg:=20don=E2=80=99t=20depend=20on=20fope?= =?utf8?q?n-gnu?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is for Emacs, which does not need fopen-gnu for anything else, and which would need it only on a NetBSD platform where getloadavg does not work (does that even happen?). * lib/getloadavg.c (getloadavg) [__NetBSD__]: Use open, not fopen. * modules/getloadavg (Depends-on): Remove fopen-gnu. --- ChangeLog | 7 +++++++ lib/getloadavg.c | 21 ++++++++++++++------- modules/getloadavg | 1 - 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd194e0c4d..19e609e31c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2020-06-27 Paul Eggert + getloadavg: don’t depend on fopen-gnu + This is for Emacs, which does not need fopen-gnu for anything else, + and which would need it only on a NetBSD platform where getloadavg + does not work (does that even happen?). + * lib/getloadavg.c (getloadavg) [__NetBSD__]: Use open, not fopen. + * modules/getloadavg (Depends-on): Remove fopen-gnu. + * tests/test-getloadavg.c (main): Fix typo. 2020-06-27 Bruno Haible diff --git a/lib/getloadavg.c b/lib/getloadavg.c index aeb7070cc7..468e250670 100644 --- a/lib/getloadavg.c +++ b/lib/getloadavg.c @@ -567,15 +567,22 @@ getloadavg (double loadavg[], int nelem) unsigned long int load_ave[3], scale; int count; - FILE *fp; - - fp = fopen (NETBSD_LDAV_FILE, "re"); - if (fp == NULL) - return -1; - count = fscanf (fp, "%lu %lu %lu %lu\n", + char readbuf[4 * INT_BUFSIZE_BOUND (unsigned long int) + 1]; + int fd = open (NETBSD_LDAV_FILE, O_RDONLY | O_CLOEXEC); + if (fd < 0) + return fd; + int nread = read (fd, readbuf, sizeof readbuf - 1); + int err = errno; + close (fd); + if (nread < 0) + { + errno = err; + return -1; + } + readbuf[nread] = '\0'; + count = sscanf (readbuf, "%lu %lu %lu %lu\n", &load_ave[0], &load_ave[1], &load_ave[2], &scale); - (void) fclose (fp); if (count != 4) { errno = ENOTSUP; diff --git a/modules/getloadavg b/modules/getloadavg index a5a3c4e03c..8adb9a7848 100644 --- a/modules/getloadavg +++ b/modules/getloadavg @@ -7,7 +7,6 @@ m4/getloadavg.m4 Depends-on: extensions -fopen-gnu intprops open stdbool -- 2.39.5