diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-06-14 00:55:24 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-06-14 00:55:24 +0000 |
commit | afa0569f3ba820fe6baf60e72d8c1d6e923e4e98 (patch) | |
tree | c55508731f6a3858cfd1adaf6563aa40cab13fec /login | |
parent | 490dc9aa62445bdc3f5a84addd459398b9fdbe15 (diff) | |
download | glibc-afa0569f3ba820fe6baf60e72d8c1d6e923e4e98.tar.gz glibc-afa0569f3ba820fe6baf60e72d8c1d6e923e4e98.tar.xz glibc-afa0569f3ba820fe6baf60e72d8c1d6e923e4e98.zip |
Update.
* crypt/Makefile (distribute): Add ufc-crypt.h, crypt-private.h, ufc.c, speeds.c, README.ufc-crypt, and Banner. * sysdeps/sparc/Subdirs: New file. * locale/Makefile (distribute): Add weightwc.h and programs/localedef.h. * time/Makefile (distribute): Add datemsk. * sysdeps/ia64/Dist: Add softpipe.h. * sysdeps/unix/sysv/aix/Dist: New file. * posix/setpgrp.c: Moved to... * sysdeps/generic/setpgrp.c: ...here. New file. * io/mknod.c: Moved to... * sysdeps/generic/mknod.c: ...here. New file. * sysdeps/unix/sysv/linux/ia64/Dist: New file. * sysdeps/unix/sysv/linux/sparc/Dist: Add sys/procfs.h. * sysdeps/unix/sysv/linux/arm/Dist: Add oldgetrlimit64.c. * sysdeps/powerpc/Dist: Add fprrest.S, fprsave.S, gprsave1.S, gprsave0.S, gprrest1.S, and gprrest0.S. * sysdeps/generic/Dist: Add bp-thunks.h, bp-sym.h, and bp-start.h. * posix/Makefile (routines): Add spawnattr_getsigmask, spawnattr_getschedpolicy, spawnattr_getschedparam, spawnattr_setsigmask, spawnattr_setschedpolicy, and spawnattr_setschedparam. * posix/Versions: Add posix_spawnattr_getschedpolicy, posix_spawnattr_setschedpolicy, posix_spawnattr_getschedparam, and posix_spawnattr_setschedparam. * posix/spawnattr_setschedparam.c: Fix typo. * posix/spawnattr_setsigmask.c (posix_spawnattr_setsigmask): Correct typo. * login/programs/utmpd.c: Removed. * login/programs/utmpd.h: Removed. * login/programs/utmpd-private.h: Removed. * Makefile (distribute): Add include/db_185.h and include/db.h. * iconvdata/Makefile (distribute): Add iso-ir-165.c and iso-ir-165.h. * elf/Makefile (distribute): Add missing files. * dlfcn/Makefile: Add back rules to include eval in libdl.so. * elf/eval.c: Moved to... * dlfcn/eval.c: ...here. New file. * Makefile (distribute): Also distribute ChangeLog.1?.
Diffstat (limited to 'login')
-rw-r--r-- | login/programs/utmpd-private.h | 110 | ||||
-rw-r--r-- | login/programs/utmpd.c | 419 | ||||
-rw-r--r-- | login/programs/utmpd.h | 140 |
3 files changed, 0 insertions, 669 deletions
diff --git a/login/programs/utmpd-private.h b/login/programs/utmpd-private.h deleted file mode 100644 index b22e58f700..0000000000 --- a/login/programs/utmpd-private.h +++ /dev/null @@ -1,110 +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. */ - -#ifndef _UTMPD_PRIVATE_H -#define _UTMPD_PRIVATE_H 1 - -#include <time.h> -#include <utmp.h> - - -/* The number of connections we allow. */ -#ifndef MAX_CONNECTIONS -#define MAX_CONNECTIONS 16 -#endif - - -typedef struct utmp_database -{ - int fd; - int old_fd; - char *file; - char *old_file; - time_t mtime; -} utmp_database; - - -/* The databases we handle. */ -extern utmp_database *utmp_db; -extern utmp_database *wtmp_db; - - -typedef struct client_connection -{ - int sock; - /* Access permissions. */ - int access; - - /* Read pointer. */ - void *read_base; - void *read_ptr; - void *read_end; - - /* Write buffer. */ - void *write_base; - void *write_ptr; - void *write_end; - - /* Database to use for this connection. */ - utmp_database *database; - /* Position pointer. */ - int position; - - /* Last read entry. */ - struct utmp last_entry; - - /* Pointers to the next and previous connections in the list. */ - struct client_connection *next; - struct client_connection *prev; -} client_connection; - - -/* This variable indicates if we have forked. If set, we log messages - via the system logger. Otherwise we simply print the program name - and the message to standard error. */ -extern int forked; - - -/* Database functions. */ -utmp_database *open_database (const char *file, const char *old_file); -int synchronize_database (utmp_database *database); -void close_database (utmp_database *database); -int read_entry (utmp_database *database, int position, struct utmp *entry); -int write_entry (utmp_database *database, int position, - const struct utmp *entry); -int append_entry (utmp_database *database, const struct utmp *entry); -int read_old_entry (utmp_database *database, int position, struct utmp *entry); -int write_old_entry (utmp_database *database, int position, - const struct utmp *entry); - -/* Connection oriented functions. */ -client_connection *accept_connection (int sock, int access); -client_connection *find_connection (int sock); -void close_connection (client_connection *connection); -int read_data (client_connection *connection); -int write_data (client_connection *connection); - -int proc_utmp_eq (const struct utmp *entry, const struct utmp *match); - -void error (int status, int errnum, const char *message, ...); -void warning (int errnum, const char *message, ...); - - -#endif /* utmpd-private.h */ - diff --git a/login/programs/utmpd.c b/login/programs/utmpd.c deleted file mode 100644 index ec16b9e778..0000000000 --- a/login/programs/utmpd.c +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (C) 1997, 1998, 1999 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 <errno.h> -#include <fcntl.h> -#include <getopt.h> -#include <libintl.h> -#include <locale.h> -#include <pwd.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <string.h> -#include <sys/param.h> -#include <sys/select.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/un.h> -#include <syslog.h> -#include <unistd.h> - -#include "utmpd.h" -#include "utmpd-private.h" - -#ifndef DEFAULT_USER -#define DEFAULT_USER "daemon" -#endif - -/* Get libc version number. */ -#include <version.h> - -#define PACKAGE _libc_intl_domainname - -/* Long options. */ -static const struct option long_options[] = -{ - { "debug", no_argument, NULL, 'd' }, - { "help", no_argument, NULL, 'h' }, - { "version", no_argument, NULL, 'V' }, - { NULL, 0, NULL, 0} -}; - -/* The UTMP database. */ -utmp_database *utmp_db; - -/* The socket for read only requests. */ -int ro_sock = -1; - -/* The socket for read/write requests. */ -int rw_sock = -1; - - -/* Prototypes for the local functions. */ -static void usage (int status) __attribute__ ((noreturn)); -static void drop_priviliges (void); -static int make_socket (const char *name); -static void handle_requests (void) __attribute__ ((noreturn)); -static void termination_handler (int signum); -static int check_pid (const char *file); -static int write_pid (const char *file); - - -int -main (int argc, char *argv[]) -{ - mode_t mask; - int debug; - int do_help; - int do_version; - int opt; - - /* Set locale via LC_ALL. */ - setlocale (LC_ALL, ""); - - /* Set the text message domain. */ - textdomain (PACKAGE); - - /* Initialize local variables. */ - debug = 0; - do_help = 0; - do_version = 0; - - while ((opt = getopt_long (argc, argv, "dhV", long_options, NULL)) != -1) - switch (opt) - { - case '\0': /* Long option. */ - break; - case 'h': - do_help = 1; - break; - case 'd': - debug = 1; - break; - case 'V': - do_version = 1; - break; - default: - usage (EXIT_FAILURE); - } - - /* Version information is reequested. */ - if (do_version) - { - printf ("utmpd (GNU %s) %s\n", PACKAGE, VERSION); - printf (_("\ -Copyright (C) %s Free Software Foundation, Inc.\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -"), "1999"); - printf (_("Written by %s.\n"), "Mark Kettenis"); - - exit (EXIT_SUCCESS); - } - - /* Help is requested. */ - if (do_help) - usage (EXIT_SUCCESS); - - signal (SIGINT, termination_handler); - signal (SIGQUIT, termination_handler); - signal (SIGTERM, termination_handler); - - /* Check if we are already running. */ - if (check_pid (_PATH_UTMPDPID)) - error (EXIT_FAILURE, 0, _("already running")); - - /* Cleanup files created by a previous `bind'. */ - unlink (_PATH_UTMPD_RO); - unlink (_PATH_UTMPD_RW); - - /* Open UTMP database. */ - utmp_db = open_database (_PATH_UTMP "x", _PATH_UTMP); - if (utmp_db == NULL) - exit (EXIT_FAILURE); - - /* Create sockets, with the right permissions. */ - mask = umask (S_IXUSR | S_IXGRP | S_IXOTH); - ro_sock = make_socket (_PATH_UTMPD_RO); - umask (S_IXUSR | S_IRWXG | S_IRWXO); - rw_sock = make_socket (_PATH_UTMPD_RW); - umask (mask); - - /* Set the sockets up to accept connections. */ - if (listen (ro_sock, MAX_CONNECTIONS) < 0 - || listen (rw_sock, MAX_CONNECTIONS) < 0) - error (EXIT_FAILURE, errno, - _("cannot enable socket to accept connections")); - - /* Behave like a daemon. */ - if (!debug) - { - openlog ("utmpd", LOG_CONS | LOG_ODELAY, LOG_DAEMON); - - if (daemon (0, 0) < 0) - error (EXIT_FAILURE, errno, _("cannot auto-background")); - forked = 1; - - if (write_pid (_PATH_UTMPDPID) < 0) - warning (errno, "%s", _PATH_UTMPDPID); - - /* Ignore job control signals. */ - signal (SIGTTOU, SIG_IGN); - signal (SIGTTIN, SIG_IGN); - signal (SIGTSTP, SIG_IGN); - } - - /* Drop priviliges. */ - drop_priviliges (); - - /* Handle incoming requests. */ - handle_requests (); -} - - -/* Display usage information and exit. */ -static void -usage (int status) -{ - if (status != EXIT_SUCCESS) - fprintf (stderr, _("Try `%s --help' for more information.\n"), - program_invocation_name); - else - { - printf (_("\ -Usage: %s [OPTION]...\n\ - -d, --debug do not fork and display messages on the current tty\n\ - -h, --help display this help and exit\n\ - -V, --version output version information and exit\n"), - program_invocation_name); - fputs (_("\ -Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n"), - stdout); - } - - exit (status); -} - - -/* Drop priviliges. */ -static void -drop_priviliges (void) -{ - struct passwd *pw; - - pw = getpwnam (DEFAULT_USER); - if (pw) - { - seteuid (pw->pw_uid); - setegid (pw->pw_gid); - } -} - - -/* Make a socket in the file namespace using the filename NAME as the - socket's address. */ -static int -make_socket (const char *name) -{ - struct sockaddr_un addr; - size_t size; - int sock; - - /* Create the socket. */ - sock = socket (PF_UNIX, SOCK_STREAM, 0); - if (sock < 0) - error (EXIT_FAILURE, errno, _("cannot create socket")); - - /* Bind a name to the socket. */ - addr.sun_family = AF_UNIX; - strcpy (addr.sun_path, name); - - /* The size of the address is the offset of the start - of the filename, plus its length, plus one for the - terminating null byte. */ - size = (offsetof (struct sockaddr_un, sun_path) - + strlen (addr.sun_path)); - - - if (bind (sock, (struct sockaddr *) &addr, size) < 0) - error (EXIT_FAILURE, errno, "%s", name); - - return sock; -} - - -/* Hanlde incoming requests. */ -static -void handle_requests (void) -{ - client_connection *connection; - fd_set active_read_fd_set; - fd_set active_write_fd_set; - fd_set read_fd_set; - fd_set write_fd_set; - int fd; - int maxfd; /* Highest used fd to optimize select/loop. */ - - /* Initialize the set of active sockets. */ - FD_ZERO (&active_read_fd_set); - FD_ZERO (&active_write_fd_set); - FD_SET (rw_sock, &active_read_fd_set); - FD_SET (ro_sock, &active_read_fd_set); - - maxfd = MAX (rw_sock, ro_sock); - - while (1) - { - /* Block until input arrives on one or more active sockets. */ - read_fd_set = active_read_fd_set; - write_fd_set = active_write_fd_set; - if (select (maxfd + 1, &read_fd_set, &write_fd_set, NULL, NULL) < 0) - error (EXIT_FAILURE, errno, _("cannot get input on sockets")); - - /* Service all the sockets with input pending. */ - for (fd = 0; fd <= maxfd; ++fd) - { - if (FD_ISSET (fd, &read_fd_set)) - { - if (fd == ro_sock || fd == rw_sock) - { - int access = ((fd == rw_sock) ? (R_OK | W_OK) : R_OK); - - connection = accept_connection (fd, access); - if (connection == NULL) - error (0, errno, _("cannot accept connection")); - - FD_SET (connection->sock, &active_read_fd_set); - maxfd = MAX (maxfd, connection->sock); - } - else - { - connection = find_connection (fd); - if (connection == NULL) - error (EXIT_FAILURE, 0, _("cannot find connection")); - - if (read_data (connection) < 0) - { - close_connection (connection); - FD_CLR (fd, &active_read_fd_set); - FD_CLR (fd, &active_write_fd_set); - } - - if (connection->write_ptr > connection->write_base) - FD_SET (fd, &active_write_fd_set); - } - } - if (FD_ISSET (fd, &write_fd_set) && - fd != rw_sock && fd != ro_sock) - { - connection = find_connection (fd); - if (connection == NULL) - error (EXIT_FAILURE, 0, _("cannot find connection")); - - if (write_data (connection) < 0) - { - close_connection (connection); - FD_CLR (fd, &active_read_fd_set); - FD_CLR (fd, &active_write_fd_set); - } - - if (connection->write_ptr == connection->write_base) - FD_CLR (fd, &active_write_fd_set); - } - } - - /* Check if maxfd can be lowered. */ - for (; maxfd >= 0; --maxfd) - { - if (FD_ISSET (maxfd, &active_read_fd_set) - || FD_ISSET (maxfd, &active_write_fd_set)) - break; - } - } -} - - -/* Cleanup. */ -static void -termination_handler (int signum) -{ - /* Close sockets. */ - close (ro_sock); - close (rw_sock); - - /* Restore user id. */ - seteuid (getuid ()); - - /* Clean up the files created by `bind'. */ - unlink (_PATH_UTMPD_RO); - unlink (_PATH_UTMPD_RW); - - if (utmp_db) - close_database (utmp_db); - - /* Clean up pid file. */ - unlink (_PATH_UTMPDPID); - - exit (EXIT_SUCCESS); -} - - -/* Returns 1 if the process in pid file FILE is running, 0 if not. */ -static int -check_pid (const char *file) -{ - FILE *fp; - - fp = fopen (_PATH_UTMPDPID, "r"); - if (fp) - { - pid_t pid; - - fscanf (fp, "%d", &pid); - fclose (fp); - - if (kill (pid, 0) == 0) - return 1; - } - - return 0; -} - -/* Write the current process id to the file FILE. Returns 0 if - successful, -1 if not. */ -static int -write_pid (const char *file) -{ - FILE *fp; - - fp = fopen (_PATH_UTMPDPID, "w"); - if (fp == NULL) - return -1; - - fprintf (fp, "%d\n", getpid ()); - if (ferror (fp)) - return -1; - - fclose (fp); - - return 0; -} diff --git a/login/programs/utmpd.h b/login/programs/utmpd.h deleted file mode 100644 index ef92a1490b..0000000000 --- a/login/programs/utmpd.h +++ /dev/null @@ -1,140 +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. */ - -#ifndef _UTMPD_H -#define _UTMPD_H 1 - -/* This is an *internal* header. */ - -#include <stddef.h> -#include <utmp.h> - - -/* Paths to daemon sockets. */ -#define _PATH_UTMPD_RO "/var/run/utmpd.ro" -#define _PATH_UTMPD_RW "/var/run/utmpd.rw" - - -/* Path to PID file. */ -#define _PATH_UTMPDPID "/var/run/utmpd.pid" - - -/* Version number of the daemon interface. */ -#define UTMPD_VERSION 1 - - -/* Services provided. */ -typedef enum -{ - UTMPD_REQ_SETUTENT, - UTMPD_REQ_GETUTENT, - UTMPD_REQ_ENDUTENT, - UTMPD_REQ_GETUTLINE, - UTMPD_REQ_GETUTID, - UTMPD_REQ_PUTUTLINE, - UTMPD_REQ_UPDWTMP -} request_type; - - -/* Header common to all requests. */ -typedef struct -{ - /* Version number of the daemon interface. */ - int version; - /* Number of bytes in this request. */ - size_t size; - /* Service requested. */ - request_type type; -} request_header; - -typedef struct -{ - request_header header; - /* File to use. */ - char file[0]; -} setutent_request; - -typedef struct -{ - request_header header; -} getutent_request, endutent_request; - -typedef struct -{ - request_header header; - /* Entry to match. */ - struct utmp line; -} getutline_request; - -typedef struct -{ - request_header header; - /* Entry to match. */ - struct utmp id; -} getutid_request; - -typedef struct -{ - request_header header; - /* Entry to write. */ - struct utmp utmp; -} pututline_request; - -typedef struct -{ - request_header header; - /* Entry to write. */ - struct utmp utmp; - /* File to use. */ - char file[0]; -} updwtmp_request; - - -/* Header common to all replies. */ -typedef struct -{ - /* Version number of the daemon interface. */ - int version; - /* Number of bytes in this reply. */ - size_t size; - /* Answer to the request. */ - request_type type; -} reply_header; - -typedef struct -{ - reply_header header; - /* Error code. */ - int errnum; - /* Return value. */ - int result; -} setutent_reply, endutent_reply, pututline_reply, updwtmp_reply; - -typedef struct -{ - reply_header header; - /* Found entry. */ - struct utmp entry; - /* Error code. */ - int errnum; - /* Return value. */ - int result; -} getutent_reply, getutline_reply, getutid_reply; - -#endif /* utmpd.h */ |