diff options
Diffstat (limited to 'libc/misc/utmp/utent.c')
-rw-r--r-- | libc/misc/utmp/utent.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libc/misc/utmp/utent.c b/libc/misc/utmp/utent.c index b865cc271..945571733 100644 --- a/libc/misc/utmp/utent.c +++ b/libc/misc/utmp/utent.c @@ -64,20 +64,22 @@ void setutent(void) } if (ret < 0) { bummer: - UNLOCK; static_fd = -1; close(static_fd); +unlock_and_ret: + UNLOCK; return; } } lseek(static_fd, 0, SEEK_SET); - UNLOCK; - return; + goto unlock_and_ret; } libc_hidden_def(setutent) static struct utmp *__getutent(int utmp_fd) { + struct utmp *ret = NULL; + if (utmp_fd == -1) { setutent(); } @@ -86,13 +88,13 @@ static struct utmp *__getutent(int utmp_fd) } LOCK; - if (read(utmp_fd, (char *) &static_utmp, sizeof(struct utmp)) != sizeof(struct utmp)) + if (read(utmp_fd, (char *) &static_utmp, sizeof(struct utmp)) == sizeof(struct utmp)) { - return NULL; + ret = &static_utmp; } UNLOCK; - return &static_utmp; + return ret; } void endutent(void) @@ -163,15 +165,12 @@ struct utmp *pututline (const struct utmp *utmp_entry) the file pointer where they want it, everything will work out. */ lseek(static_fd, (off_t) - sizeof(struct utmp), SEEK_CUR); - if (getutid(utmp_entry) != NULL) { + if (getutid(utmp_entry) != NULL) lseek(static_fd, (off_t) - sizeof(struct utmp), SEEK_CUR); - if (write(static_fd, utmp_entry, sizeof(struct utmp)) != sizeof(struct utmp)) - return NULL; - } else { + else lseek(static_fd, (off_t) 0, SEEK_END); - if (write(static_fd, utmp_entry, sizeof(struct utmp)) != sizeof(struct utmp)) - return NULL; - } + if (write(static_fd, utmp_entry, sizeof(struct utmp)) != sizeof(struct utmp)) + utmp_entry = NULL; UNLOCK; return (struct utmp *)utmp_entry; |