aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-04-18 18:38:50 +0000
committerUlrich Drepper <drepper@redhat.com>2000-04-18 18:38:50 +0000
commit74f998221da8e1719ac95add005110676ebad6f2 (patch)
treeb1f20e33d9434f31470184d0888ed820dfd3b36d
parentd9317f3d9285a88347386e7a4505dad7329c1cee (diff)
downloadglibc-74f998221da8e1719ac95add005110676ebad6f2.tar.xz
glibc-74f998221da8e1719ac95add005110676ebad6f2.zip
Update.
2000-04-18 Ulrich Drepper <drepper@redhat.com> * login/programs/connection.c: Removed. * login/programs/database.c Removed. * login/programs/error.c: Removed. * login/programs/request.c: Removed. * login/programs/xtmp.c: Removed. * login/programs/xtmp.h: Removed. * login/Makefile: Remove rules for utmpd. * login/README.utmpd: Removed.
-rw-r--r--ChangeLog11
-rw-r--r--login/README.utmpd175
-rw-r--r--login/programs/connection.c180
-rw-r--r--login/programs/database.c543
-rw-r--r--login/programs/error.c104
-rw-r--r--login/programs/request.c646
-rw-r--r--login/programs/xtmp.c121
-rw-r--r--login/programs/xtmp.h55
8 files changed, 11 insertions, 1824 deletions
diff --git a/ChangeLog b/ChangeLog
index 053b2f6652..d9a68fa3bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2000-04-18 Ulrich Drepper <drepper@redhat.com>
+
+ * login/programs/connection.c: Removed.
+ * login/programs/database.c Removed.
+ * login/programs/error.c: Removed.
+ * login/programs/request.c: Removed.
+ * login/programs/xtmp.c: Removed.
+ * login/programs/xtmp.h: Removed.
+ * login/Makefile: Remove rules for utmpd.
+ * login/README.utmpd: Removed.
+
2000-04-18 Andreas Jaeger <aj@suse.de>
* sysdeps/mips/dl-machine.h (elf_machine_rel): Fix relocation.
diff --git a/login/README.utmpd b/login/README.utmpd
deleted file mode 100644
index b691c36f27..0000000000
--- a/login/README.utmpd
+++ /dev/null
@@ -1,175 +0,0 @@
-With the introduction of version 2 of the GNU C Library the format of
-the UTMP and WTMP files changed for some configurations (see Q&A `Why
-does getlogin() always return NULL on my Linux box?' of the FAQ).
-This version of the GNU C Library contains a solution for the problems
-this may cause, by providing an UTMP daemon `utmpd'.
-
-Do I need it?
-=============
-
-If your configuration is one of the following:
-
- i[3456]86-*-linux-gnu Linux-2.0 on Intel
- m68k-*-linux-gnu Linux-2.0 on Motorola 680x0
-
-you might need it, so please read on. If it is not, please read the
-section titled `Programming' at the end of this text.
-
-In principle, you only need the daemon if you want to keep using old
-programs linked against the previous version of the Linux C Library
-(libc5). In addition you will need the daemon if you are running
-Linux on Intel, and you are planning to use iBCS (Intel Binary
-Compatibility Standard). If you have no libc5 programs left on your
-system and you are not using iBCS, it is probably better not to
-install the daemon since it uses (a small amount of) memory and CPU
-time. But apart from that it shouldn't hurt to install `utmpd', so
-when in doubt install it anyway.
-
-
-Installation
-============
-
-The installation process (`make install') already places the `utmpd'
-binary in $(sbindir). The only thing you have to do is modifying your
-startup scripts to start the daemon. Unfortunately this is a bit of a
-hassle, since the layout of these scripts is not standardized. You
-should try to find the command that creates the file `/var/run/utmp'.
-This is usually done in a script named `/etc/rc', `/etc/init.d/boot'
-(Debian) or `/etc/rc.d/rc.S' (Slackware). You could try:
-
- grep utmp /etc/* /etc/init.d/* /etc/rc.d/*
-
-to find the right script. The creation of `/var/run/utmp' is usually
-done with a command like:
-
- : > /var/run/utmp
-
-or
-
- cat /dev/null > /var/run/utmp
-
-Now add a line before this command to create the file `/var/run/utmpx'
-e.g.
-
- : > /var/run/utmpx
-
-or
-
- cat /dev/null > /var/run/utmpx
-
-whatever you prefer, and after this command, add a line to start the
-daemon
-
- utmpd
-
-The entire fragment could look something like
-
- # Clean up /var/run and create /var/run/utmp so that we can login.
- ( cd /var/run && find . ! -type d -exec rm -f -- {} \; )
- : > /var/run/utmpx
- : > /var/run/utmp
- utmpd
-
-If the file `/var/log/wtmp' exists on your system, you will probably
-want to create the file `/var/log/wtmpx'. Programs linked against the
-GNU C Library will now write to `/var/log/wtmpx', while programs
-linked against the old library will continue to write to
-`/var/log/wtmp'. Of course this means that the information gets
-spread over two files. We hope to provide a better solution in the
-future.
-
-After a reboot, user accounting should be working again. If not,
-please refer to the section titled `Troubleshooting' below before
-submitting a bug report.
-
-
-What is `utmpd' doing?
-======================
-
-After installation there will be two files that store the user
-accounting information: `/var/run/utmp' and `/var/run/utmpx'. The
-file `/var/run/utmp' will be in the old format so libc5 programs will
-continue to work (even if they are broken and do not use the library
-functions to access the user accounting database). And on Intel, you
-can safely link `/var/run/utmp' to `/etc/utmp' for iBCS programs.
-Programs linked against the new GNU C Library (glibc2) will contact
-the daemon for all user accounting database access. The daemon will
-store its information in `/var/run/utmpx' and keeps this file in sync
-with `/var/run/utmp'. Entries added to `/var/run/utmpx' will be
-converted to the old format and will be added to `/var/run/utmp' and
-vice versa. This way both libc5 and glibc2 see the same information
-in the same fields of `struct utmp'. Of course libc5 programs see only
-part of the information that glibc2 programs see because not all
-members of the glibc2 `struct utmp' are present in the libc5 `struct
-utmp'. For the same reason libc5 will see a truncated version of
-those fields where the length of the glibc2 field is larger than the
-corresponding libc5 field (ut_user, ut_line, ut_host).
-
-
-Troubleshooting
-===============
-
-If user accounting is not working on your system, e.g. programs like
-`who' or `logname' return rubbish, or you cannot login, make
-sure that:
-
-* The file `/var/run/utmpx' exists.
-
-* The file `/var/log/wtmpx' exists.
-
-* No program linked against the GNU C Library (libc6) is accessing
- `/var/run/utmp' directly (see the section on `Programming' below).
-
-If that does not solve your problems, please use the `glibcbug' script
-to report the problem to <bugs@gnu.org>.
-
-The `utmpd' daemon uses `syslogd' to report problems. It uses the
-`daemon' facility and `warning' and `error' levels. Alternatively you
-could use the following option to ease debugging:
-
-`--debug'
- Use this option if you want the daemon to output its warnings and
- error messages to the terminal instead of sending them to the
- system logger (`syslogd'). When using this option the daemon does
- not auto-background itself.
-
-To use this option you should first kill the daemon that is already
-running, and start a fresh one with the desired option:
-
- kill `cat /var/run/utmpd.pid`
- utmpd --debug
-
-Please include any warnings or error messages from `utmpd' in your
-bug reports.
-
-
-Programming
-===========
-
-In order for the `utmpd' approach to work it is essential that NO
-program EVER accesses the UTMP and WTMP files directly. Instead, a
-program should use ONLY the available library functions:
-
- * utmpname() Select the database used (UTMP, WTMP, ...).
- * setutent() Open the database.
- * getutent() Read the next entry from the database.
- * getutid() Search for the next entry with a specific ID.
- * getutline() Search for the next entry for a specific line.
- * pututline() Write an entry to the database.
- * endutent() Close the database.
- * updwtmp() Add an entry to a database (WTMP, ...).
-
-For details, please refer to `The GNU C Library Reference Manual',
-which also contains information about some additional functions
-derived from BSD and XPG that may be of interest. The command
-
- info libc "User Accounting Database"
-
-should point you at the right location.
-
-If you encounter a program that reads from or, even worse, writes to
-the UTMP and WTMP files directly, please report this as a bug to the
-author of that program. Note that the files referred to by the macros
-`_PATH_UTMP' and `_PATH_WTMP' might even disappear in the future, so
-please do not use these, except in a call to `utmpname()' or
-`updwtmp()', not even to check their existence.
diff --git a/login/programs/connection.c b/login/programs/connection.c
deleted file mode 100644
index 4e1663189d..0000000000
--- a/login/programs/connection.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include "utmpd-private.h"
-
-
-/* Prototypes for the local functions. */
-static client_connection *alloc_connection (void);
-static void free_connection (client_connection *connection);
-static int set_nonblock_flag (int desc, int value);
-
-
-/* The head of the connection list. */
-static client_connection *connection_list = NULL;
-
-
-/* Accept connection on SOCK, with access permissions given by ACCESS.
- Returns a pointer to a newly allocated client_connection if
- successful, NULL if not. */
-client_connection *
-accept_connection (int sock, int access)
-{
- client_connection *connection;
-
- connection = alloc_connection ();
- if (connection == NULL)
- return NULL;
-
- connection->sock = accept (sock, NULL, NULL);
- connection->access = access;
- if (connection->sock < 0)
- {
- free_connection (connection);
- return NULL;
- }
-
- if (set_nonblock_flag (connection->sock, 1) < 0)
- {
- close_connection (connection);
- return NULL;
- }
-
- return connection;
-}
-
-
-/* Close CONNECTION. */
-void
-close_connection (client_connection *connection)
-{
- close (connection->sock);
- free_connection (connection);
-}
-
-
-/* Return the connection for SOCK. */
-client_connection *
-find_connection (int sock)
-{
- client_connection *connection;
-
- for (connection = connection_list; connection;
- connection = connection->next)
- {
- if (connection->sock == sock)
- return connection;
- }
-
- return NULL;
-}
-
-
-static client_connection *
-alloc_connection (void)
-{
- client_connection *connection;
- size_t read_bufsize = 1024;
- size_t write_bufsize = 1024;
-
- connection = (client_connection *)malloc (sizeof (client_connection));
- if (connection == NULL)
- return NULL;
-
- memset (connection, 0, sizeof (client_connection));
-
- /* Allocate read buffer. */
- connection->read_base = malloc (read_bufsize);
- connection->read_ptr = connection->read_base;
- connection->read_end = connection->read_base + read_bufsize;
- if (connection->read_base == NULL)
- {
- free (connection);
- return NULL;
- }
-
- /* Allocate write buffer. */
- connection->write_base = malloc (write_bufsize);
- connection->write_ptr = connection->write_base;
- connection->write_end = connection->write_base + write_bufsize;
- if (connection->write_base == NULL)
- {
- free (connection->read_base);
- free (connection);
- return NULL;
- }
-
- /* Link connection. */
- connection->next = connection_list;
- connection_list = connection;
- if (connection->next)
- connection->next->prev = connection;
-
- return connection;
-}
-
-
-static void
-free_connection (client_connection *connection)
-{
- /* Unlink connection. */
- if (connection->next)
- connection->next->prev = connection->prev;
- if (connection->prev)
- connection->prev->next = connection->next;
-
- /* Take care of the head of the list. */
- if (connection == connection_list)
- connection_list = connection->next;
-
- /* Free buffers. */
- if (connection->read_base)
- free (connection->read_base);
- if (connection->write_base)
- free (connection->write_base);
-
- free (connection);
-}
-
-
-/* Set the `O_NONBLOCK' flag of DESC if VALUE is nonzero,
- or clear the flag if VALUE is 0.
- Return 0 on success, or -1 on error with `errno' set. */
-static int
-set_nonblock_flag (int desc, int value)
-{
- int oldflags = fcntl (desc, F_GETFL, 0);
- /* If reading the flags failed, return error indication now. */
- if (oldflags == -1)
- return -1;
- /* Set just the flag we want to set. */
- if (value != 0)
- oldflags |= O_NONBLOCK;
- else
- oldflags &= ~O_NONBLOCK;
- /* Store modified flag word in the descriptor. */
- return fcntl (desc, F_SETFL, oldflags);
-}
diff --git a/login/programs/database.c b/login/programs/database.c
deleted file mode 100644
index 4267c11186..0000000000
--- a/login/programs/database.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <libintl.h>
-
-
-#include "utmpd-private.h"
-#include "xtmp.h"
-
-
-/* Prototypes for the local functions. */
-static int initialize_database (utmp_database *database);
-static int store_state_entry (utmp_database *database, int old_position,
- const struct utmp *old_entry);
-static int store_process_entry (utmp_database *database, int old_position,
- const struct utmp *old_entry);
-static int replace_entry (utmp_database *database, int old_position,
- int new_position, const struct utmp *entry);
-static int store_entry (utmp_database *database, int position,
- const struct utmp *entry);
-static int get_mtime (int filedes, time_t *timer);
-
-
-/* Open the database specified by FILE and merge it with the contents
- of the old format file specified by OLD_FILE. Returns a pointer to
- a newly allocated structure describing the database, or NULL on
- error. */
-utmp_database *
-open_database (const char *file, const char *old_file)
-{
- mode_t mode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
- utmp_database *database;
-
- /* Allocate memory. */
- database = (utmp_database *) malloc (sizeof (utmp_database));
- if (database == NULL)
- {
- error (0, 0, _("memory exhausted"));
- return NULL;
- }
-
- memset (database, 0, sizeof (utmp_database));
-
- /* Open database, create it if it doesn't exist already. */
- database->fd = open (file, O_RDWR | O_CREAT, mode);
- if (database->fd < 0)
- {
- error (0, errno, "%s", file);
- goto return_error;
- }
-
- database->file = strdup (file);
- if (database->file == NULL)
- {
- error (0, 0, _("memory exhausted"));
- goto return_error;
- }
-
- if (old_file)
- {
- database->old_fd = open (old_file, O_RDWR|O_CREAT, mode);
- if (database->old_fd < 0)
- {
- error (0, errno, "%s", old_file);
- goto return_error;
- }
-
- database->old_file = strdup (old_file);
- if (database->old_file == NULL)
- {
- error (0, 0, _("memory exhausted"));
- goto return_error;
- }
- }
-
- /* Initialize database. */
- if (initialize_database (database) < 0)
- goto return_error;
-
- return database;
-
-return_error:
- close_database (database);
-
- return NULL;
-}
-
-/* Synchronize DATABASE. */
-int
-synchronize_database (utmp_database *database)
-{
- assert (database);
-
- /* Check if there is a file in the old format, that we have to
- synchronize with. */
- if (database->old_file)
- {
- time_t curtime;
- time_t mtime;
-
- curtime = time (NULL);
-
- if (get_mtime (database->old_fd, &mtime) < 0)
- {
- error (0, errno, _("%s: cannot get modification time"),
- database->old_file);
- return -1;
- }
-
- if (mtime >= database->mtime)
- {
- int position = 0;
- struct utmp entry;
- struct utmp old_entry;
-
- while (1)
- {
- if (read_old_entry (database, position, &old_entry) < 0)
- break;
-
- if (read_entry (database, position, &entry) < 0
- || !compare_entry (&old_entry, &entry))
- {
- if (write_entry (database, position, &old_entry) < 0)
- {
- error (0, errno, "%s", database->file);
- return -1;
- }
- }
-
- position++;
- }
-
- database->mtime = curtime;
- }
-
- }
-
- return 0;
-}
-
-
-/* Close DATABASE. */
-void
-close_database (utmp_database *database)
-{
- assert (database);
-
- if (database->fd >= 0)
- close (database->fd);
-
- if (database->old_fd >= 0)
- close (database->old_fd);
-
- /* Free allocated memory. */
- if (database->file)
- free (database->file);
- if (database->old_file)
- free (database->old_file);
- free (database);
-}
-
-
-/* Read the entry at POSITION in DATABASE and store the result in
- ENTRY. Returns 0 if successful, -1 if not. */
-int
-read_entry (utmp_database *database, int position, struct utmp *entry)
-{
- ssize_t nbytes;
- off_t offset;
-
- offset = position * sizeof (struct utmp);
- if (lseek (database->fd, offset, SEEK_SET) < 0)
- return -1;
-
- nbytes = read (database->fd, entry, sizeof (struct utmp));
- if (nbytes != sizeof (struct utmp))
- return -1;
-
- return 0;
-}
-
-
-/* Write ENTRY at POSITION in DATABASE. Returns 0 if successful, -1
- on error. */
-int
-write_entry (utmp_database *database, int position,
- const struct utmp *entry)
-{
- int result = -1;
- struct flock fl;
- ssize_t nbytes;
- off_t offset;
-
- /* Try to lock the file. */
- memset (&fl, 0, sizeof (struct flock));
- fl.l_type = F_WRLCK;
- fl.l_whence = SEEK_SET;
- fcntl (database->fd, F_SETLKW, &fl);
-
- offset = position * sizeof (struct utmp);
- if (lseek (database->fd, offset, SEEK_SET) < 0)
- goto fail;
-
- nbytes = write (database->fd, entry, sizeof (struct utmp));
- if (nbytes != sizeof (struct utmp))
- {
- ftruncate (database->fd, offset);
- goto fail;
- }
-
- result = 0;
-
-fail:
- /* And unlock the file. */
- fl.l_type = F_UNLCK;
- fcntl (database->fd, F_SETLKW, &fl);
-
- return result;
-}
-
-
-/* Append ENTRY to DATABASE. Returns the position of the appended
- entry if successful, or -1 on error. */
-int
-append_entry (utmp_database *database, const struct utmp *entry)
-{
- int result = -1;
- struct flock fl;
- ssize_t nbytes;
- off_t offset;
-
- /* Try to lock the file. */
- memset (&fl, 0, sizeof (struct flock));
- fl.l_type = F_WRLCK;
- fl.l_whence = SEEK_SET;
- fcntl (database->fd, F_SETLKW, &fl);
-
- offset = lseek (database->fd, 0, SEEK_END);
- if (offset % sizeof (struct utmp) != 0)
- {
- offset -= offset % sizeof (struct utmp);
- ftruncate (database->fd, offset);
-
- if (lseek (database->fd, 0, SEEK_END) < 0)
- goto fail;
- }
-
- nbytes = write (database->fd, entry, sizeof (struct utmp));
- if (nbytes != sizeof (struct utmp))
- {
- ftruncate (database->fd, offset);
- goto fail;
- }
-
- result = offset / sizeof (struct utmp);
-
-fail:
- /* And unlock the file. */
- fl.l_type = F_UNLCK;
- fcntl (database->fd, F_SETLKW, &fl);
-
- return result;
-}
-
-
-int
-read_old_entry (utmp_database *database, int position,
- struct utmp *entry)
-{
- struct xtmp old_entry;
- ssize_t nbytes;
- off_t offset;
-
- offset = position * sizeof (struct xtmp);
- if (lseek (database->old_fd, offset, SEEK_SET) < 0)
- return -1;
-