diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-08-16 19:42:40 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-08-16 19:42:40 +0000 |
commit | 1918f9d183df1ef5887104179af96adef6997c75 (patch) | |
tree | 3c238944d5b5f1a69580233f81e6fb1f603c1b53 | |
parent | 130913a5575a600fd021519436fd8b570195f014 (diff) | |
download | glibc-1918f9d183df1ef5887104179af96adef6997c75.tar.gz glibc-1918f9d183df1ef5887104179af96adef6997c75.tar.xz glibc-1918f9d183df1ef5887104179af96adef6997c75.zip |
Rewrite to use jump table correctly.
-rw-r--r-- | login/getutent_r.c | 190 | ||||
-rw-r--r-- | login/getutline_r.c | 12 | ||||
-rw-r--r-- | login/updwtmp.c | 42 |
3 files changed, 92 insertions, 152 deletions
diff --git a/login/getutent_r.c b/login/getutent_r.c index 580dcffb21..b9de362536 100644 --- a/login/getutent_r.c +++ b/login/getutent_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com> and Paul Janzen <pcj@primenet.com>, 1996. @@ -18,102 +18,126 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <assert.h> -#include <db.h> -#include <fcntl.h> #include <libc-lock.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> #include <utmp.h> -#include <sys/stat.h> #include "utmp-private.h" -/* The various backends we have. */ -static int __setutent_unknown (int reset); -static int __getutent_r_unknown (struct utmp *buffer, struct utmp **result); -static struct utmp *__pututline_unknown (const struct utmp *data); -static void __endutent_unknown (void); +/* Functions defined here. */ +static int setutent_unknown (void); +static int getutent_r_unknown (struct utmp *buffer, struct utmp **result); +static int getutid_r_unknown (const struct utmp *line, struct utmp *buffer, + struct utmp **result); +static int getutline_r_unknown (const struct utmp *id, struct utmp *buffer, + struct utmp **result); +static struct utmp *pututline_unknown (const struct utmp *data); +static void endutent_unknown (void); - -/* We have three jump tables: unknown, db, or file. */ -static struct utfuncs unknown_functions = +/* Initial Jump table. */ +struct utfuncs __libc_utmp_unknown_functions = { - __setutent_unknown, - __getutent_r_unknown, - NULL, - NULL, - __pututline_unknown, - __endutent_unknown, + setutent_unknown, + getutent_r_unknown, + getutid_r_unknown, + getutline_r_unknown, + pututline_unknown, + endutent_unknown, NULL }; /* Currently selected backend. */ -struct utfuncs *__libc_utmp_jump_table = &unknown_functions; - -/* The tables from the services. */ -extern struct utfuncs __libc_utmp_db_functions; -extern struct utfuncs __libc_utmp_file_functions; - +struct utfuncs *__libc_utmp_jump_table = &__libc_utmp_unknown_functions; /* We need to protect the opening of the file. */ __libc_lock_define_initialized (, __libc_utmp_lock) -void -__setutent (void) + +static int +setutent_unknown (void) { - __libc_lock_lock (__libc_utmp_lock); + int result; - (void) (*__libc_utmp_jump_table->setutent) (1); + result = (*__libc_utmp_file_functions.setutent) (); + if (result) + __libc_utmp_jump_table = &__libc_utmp_file_functions; - __libc_lock_unlock (__libc_utmp_lock); + return result; } -weak_alias (__setutent, setutent) static int -__setutent_unknown (int reset) +getutent_r_unknown (struct utmp *buffer, struct utmp **result) { - /* We have to test whether it is still not decided which backend to use. */ - assert (__libc_utmp_jump_table == &unknown_functions); - - /* See whether utmp db file exists. */ - if ((*__libc_utmp_db_functions.setutent) (reset)) - __libc_utmp_jump_table = &__libc_utmp_db_functions; - else - { - /* Either the db file does not exist or we have other - problems. So use the normal file. */ - (*__libc_utmp_file_functions.setutent) (reset); - __libc_utmp_jump_table = &__libc_utmp_file_functions; - } - - return 0; + /* The backend was not yet initialized. */ + if (setutent_unknown ()) + return (*__libc_utmp_jump_table->getutent_r) (buffer, result); + + /* Not available. */ + *result = NULL; + return -1; } -void -__endutent (void) +static int +getutid_r_unknown (const struct utmp *id, struct utmp *buffer, + struct utmp **result) { - __libc_lock_lock (__libc_utmp_lock); + /* The backend was not yet initialized. */ + if (setutent_unknown ()) + return (*__libc_utmp_jump_table->getutid_r) (id, buffer, result); - (*__libc_utmp_jump_table->endutent) (); + /* Not available. */ + *result = NULL; + return -1; +} - __libc_lock_unlock (__libc_utmp_lock); + +static int +getutline_r_unknown (const struct utmp *line, struct utmp *buffer, + struct utmp **result) +{ + /* The backend was not yet initialized. */ + if (setutent_unknown ()) + return (*__libc_utmp_jump_table->getutline_r) (line, buffer, result); + + /* Not available. */ + *result = NULL; + return -1; +} + + +static struct utmp * +pututline_unknown (const struct utmp *data) +{ + /* The backend was not yet initialized. */ + if (setutent_unknown ()) + return (*__libc_utmp_jump_table->pututline) (data); + + /* Not available. */ + return NULL; } -weak_alias (__endutent, endutent) static void -__endutent_unknown (void) +endutent_unknown (void) { - /* Huh, how do we came here? Nothing to do. */ + /* Nothing to do. */ } +void +__setutent (void) +{ + __libc_lock_lock (__libc_utmp_lock); + + (*__libc_utmp_jump_table->setutent) (); + + __libc_lock_unlock (__libc_utmp_lock); +} +weak_alias (__setutent, setutent) + + int __getutent_r (struct utmp *buffer, struct utmp **result) { @@ -130,16 +154,6 @@ __getutent_r (struct utmp *buffer, struct utmp **result) weak_alias (__getutent_r, getutent_r) -static int -__getutent_r_unknown (struct utmp *buffer, struct utmp **result) -{ - /* It is not yet initialized. */ - __setutent_unknown (0); - - return (*__libc_utmp_jump_table->getutent_r) (buffer, result); -} - - struct utmp * __pututline (const struct utmp *data) { @@ -156,44 +170,14 @@ __pututline (const struct utmp *data) weak_alias (__pututline, pututline) -static struct utmp * -__pututline_unknown (const struct utmp *data) -{ - /* It is not yet initialized. */ - __setutent_unknown (0); - - return (*__libc_utmp_jump_table->pututline) (data); -} - - -int -__utmpname (const char *file) +void +__endutent (void) { - int result = -1; - __libc_lock_lock (__libc_utmp_lock); - /* Close the old file. */ (*__libc_utmp_jump_table->endutent) (); - - /* Store new names. */ - if ((*__libc_utmp_file_functions.utmpname) (file) == 0 - && !(*__libc_utmp_db_functions.utmpname) (file) == 0) - { - /* Try to find out whether we are supposed to work with a db - file or not. Do this by looking for the extension ".db". */ - const char *ext = strrchr (file, '.'); - - if (ext != NULL && strcmp (ext, ".db") == 0) - __libc_utmp_jump_table = &__libc_utmp_db_functions; - else - __libc_utmp_jump_table = &unknown_functions; - - result = 0; - } + __libc_utmp_jump_table = &__libc_utmp_unknown_functions; __libc_lock_unlock (__libc_utmp_lock); - - return result; } -weak_alias (__utmpname, utmpname) +weak_alias (__endutent, endutent) diff --git a/login/getutline_r.c b/login/getutline_r.c index 2285248ece..7a40d19284 100644 --- a/login/getutline_r.c +++ b/login/getutline_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com> and Paul Janzen <pcj@primenet.com>, 1996. @@ -20,8 +20,6 @@ #include <errno.h> #include <libc-lock.h> -#include <string.h> -#include <unistd.h> #include <utmp.h> #include "utmp-private.h" @@ -38,15 +36,11 @@ int __getutline_r (const struct utmp *line, struct utmp *buffer, struct utmp **result) { - int retval = -1; + int retval; __libc_lock_lock (__libc_utmp_lock); - /* Not yet initialized. */ - if ((*__libc_utmp_jump_table->setutent) (0)) - retval = (*__libc_utmp_jump_table->getutline_r) (line, buffer, result); - else - *result = NULL; + retval = (*__libc_utmp_jump_table->getutline_r) (line, buffer, result); __libc_lock_unlock (__libc_utmp_lock); diff --git a/login/updwtmp.c b/login/updwtmp.c index fb0c74c9cf..47f87f96bf 100644 --- a/login/updwtmp.c +++ b/login/updwtmp.c @@ -17,12 +17,8 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <errno.h> -#include <fcntl.h> #include <unistd.h> #include <utmp.h> -#include <sys/file.h> -#include <sys/stat.h> #include "utmp-private.h" @@ -30,40 +26,6 @@ void updwtmp (const char *wtmp_file, const struct utmp *utmp) { - struct stat st; - size_t written; - int fd; - - /* Open WTMP file. */ - fd = __open (wtmp_file, O_WRONLY | O_APPEND); - if (fd < 0) - return; - - /* Try to lock the file. */ - if (__flock (fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS) - { - /* Oh, oh. The file is already locked. Wait a bit and try again. */ - sleep (1); - - /* This time we ignore the error. */ - __flock (fd, LOCK_EX | LOCK_NB); - } - - /* Remember original size of log file: */ - if (__fstat (fd, &st) < 0) - goto done; - - /* Write the entry. If we can't write all the bytes, reset the file - size back to the original size. That way, no partial entries - will remain. */ - written = __write (fd, utmp, sizeof (struct utmp)); - if (written > 0 && written != sizeof (struct utmp)) - ftruncate (fd, st.st_size); - -done: - /* And unlock the file. */ - __flock (fd, LOCK_UN); - - /* Close WTMP file. */ - __close (fd); + (*__libc_utmp_file_functions.updwtmp) (wtmp_file, utmp); } + |