From b8fe19fa809ac786b7d3dbb464cb1b3f887dc69d Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 22 May 1996 02:11:55 +0000 Subject: Wed May 22 01:48:54 1996 Ulrich Drepper * stdlib/strtol.c [!QUAD] (ULONG_MAX, LONG_MAX): Define these macros if they are not available. (WEAKNAME): New macro to declare argument as weak. Define function with __ prefix and add normal name as weak alias. * sysdeps/posix/euidaccess.c (S_IROTH, S_IWOTH, S_IXOTH): Defines these macros if not already available based on R_OK, W_OK, and X_OK. Tue May 21 18:48:46 1996 Roland McGrath * misc/sys/syslog.h (__need___va_list): Define this instead of __need_va_list before including . * Makerules (o-iterator): Use $(object-suffixes-left) instead of $(object-suffixes) to produce repetitions; this is used for other lists than just that one. [versioned]: Use $(o-iterator) properly. * sysdeps/unix/sysv/linux/Implies: Include `gnu'. * sysdeps/mach/hurd/Implies: Likewise. Sat May 18 02:57:46 1996 Ulrich Drepper * login/Makefile: New file. This directory contains functions for user administration. * Makefile (subdirs): Add login. * misc/Makefile (headers): Remove utmp.h. Now in login/utmp.h. (extra-libs, libutil-routines): Ditto. * misc/login.c, misc/login_tty.c, misc/logout.c, misc/logwtmp.c, misc/utmp.h: Moved to misc/. * login/login.c, login/login_tty.c, login/logout.c, login/logwtmp.c, login/utmp.h: Moved to here from misc/. * login/utmp.h: Split file. Definitions of data structures and constants are now in the system dependent utmpbits.h file. * login/setutent_r.c, login/setutent.c, login/endutent_r.c, login/endutent.c, login/getutent_r.c, login/getutent.c, login/getutid_r.c, login/getutid.c, login/getutline_r.c, login/getutline.c, login/pututline_r.c, login/pututline.c: New files. Routines to handle utmp-style files. * sysdeps/gnu/utmpbits.h: New file. Contains GNU/Linux specific definitions of utmp data structures and constants. * sysdeps/unix/sysv/utmpbits.h: Renamed from sysdeps/unix/sysv/utmp.h. * sysdeps/generic/utmpbits.h: New file. Generic (BSDish) version of definitions of utmp data structures and constants. Fri May 17 00:01:31 1996 Ulrich Drepper * locale/C-monetary.c: Default value for mon_decimal_point should be '.'. * stdio-common/printf.h: Remove Linux libc compatibility stuff. Add `extra' flag. Currently used in __printf_fp. * stdio-common/printf_fp.c (__guess_grouping): Renamed from `guess_grouping' and extend visibility to extern. This function is now used in `strfmon'. (__printf_fp): Recognize new bit flag in info struct. This triggers to use the grouping information and decimal point from the LC_MONETARY category instead of the LC_NUMERIC category. * stdio-common/vfprintf.c (process_arg): Correct major bug. In `complicated' loop we must not use the varargs because the args are already available in the ARGS_VALUE array. * stdlib/Makefile (headers): Add monetary.h. (routines): Add strfmon. * stdlib/monetary.h: New file. Header for strfmon function. * stdlib/strfmon.c: New file. Implement strfmon function to print monetary amounts according to current locale's rules. * sysdeps/unix/sysv/linux/i386/sys/vm86.h: The kernel header is now (>= Linux-1.3.100) called . --- login/Makefile | 38 +++++++++++++++++++++ login/endutent.c | 31 +++++++++++++++++ login/endutent_r.c | 32 ++++++++++++++++++ login/getutent.c | 36 ++++++++++++++++++++ login/getutent_r.c | 50 ++++++++++++++++++++++++++++ login/getutid.c | 36 ++++++++++++++++++++ login/getutid_r.c | 61 ++++++++++++++++++++++++++++++++++ login/getutline.c | 36 ++++++++++++++++++++ login/getutline_r.c | 61 ++++++++++++++++++++++++++++++++++ login/login.c | 63 +++++++++++++++++++++++++++++++++++ login/login_tty.c | 75 +++++++++++++++++++++++++++++++++++++++++ login/logout.c | 72 ++++++++++++++++++++++++++++++++++++++++ login/logwtmp.c | 67 +++++++++++++++++++++++++++++++++++++ login/pututline.c | 34 +++++++++++++++++++ login/pututline_r.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ login/setutent.c | 31 +++++++++++++++++ login/setutent_r.c | 72 ++++++++++++++++++++++++++++++++++++++++ login/utmp.h | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 980 insertions(+) create mode 100644 login/Makefile create mode 100644 login/endutent.c create mode 100644 login/endutent_r.c create mode 100644 login/getutent.c create mode 100644 login/getutent_r.c create mode 100644 login/getutid.c create mode 100644 login/getutid_r.c create mode 100644 login/getutline.c create mode 100644 login/getutline_r.c create mode 100644 login/login.c create mode 100644 login/login_tty.c create mode 100644 login/logout.c create mode 100644 login/logwtmp.c create mode 100644 login/pututline.c create mode 100644 login/pututline_r.c create mode 100644 login/setutent.c create mode 100644 login/setutent_r.c create mode 100644 login/utmp.h (limited to 'login') diff --git a/login/Makefile b/login/Makefile new file mode 100644 index 0000000..d3e6ac8 --- /dev/null +++ b/login/Makefile @@ -0,0 +1,38 @@ +# Copyright (C) 1996 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# 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. + +# +# Sub-makefile for login portion of the library. +# + +subdir := login + +headers := utmp.h utmpbits.h + +routines := setutent endutent getutent getutid getutline pututline \ + setutent_r endutent_r getutent_r getutid_r getutline_r \ + pututline_r + +# Build the -lutil library with these extra functions. +extra-libs := libutil +libutil-routines:= login login_tty logout logwtmp pty + + +include ../Rules + +override CFLAGS += -D_THREAD_SAFE diff --git a/login/endutent.c b/login/endutent.c new file mode 100644 index 0000000..9aed00d --- /dev/null +++ b/login/endutent.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + + +/* The global data defined in setutent.c. */ +extern struct utmp_data __utmp_data; + + +void +endutent (void) +{ + endutent_r (&__utmp_data); +} diff --git a/login/endutent_r.c b/login/endutent_r.c new file mode 100644 index 0000000..b15f57a --- /dev/null +++ b/login/endutent_r.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include + + +void +endutent_r (struct utmp_data *utmp_data) +{ + if (utmp_data->ut_fd != -1) + { + close (utmp_data->ut_fd); + utmp_data->ut_fd = -1; + } +} diff --git a/login/getutent.c b/login/getutent.c new file mode 100644 index 0000000..3641146 --- /dev/null +++ b/login/getutent.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + + +/* The global data defined in setutent.c. */ +extern struct utmp_data __utmp_data; + + +struct utmp * +getutent (void) +{ + struct utmp *result; + + if (getutent_r (&result, &__utmp_data) < 0) + return NULL; + + return result; +} diff --git a/login/getutent_r.c b/login/getutent_r.c new file mode 100644 index 0000000..ad8e9eb --- /dev/null +++ b/login/getutent_r.c @@ -0,0 +1,50 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include + + +int +getutent_r (struct utmp **utmp, struct utmp_data *utmp_data) +{ + /* Open utmp file if not already done. */ + if (utmp_data->ut_fd == -1) + { + setutent_r (utmp_data); + if (utmp_data->ut_fd == -1) + return -1; + } + + /* Position file correctly. */ + if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) + return -1; + + /* Read the next entry. */ + if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) + != sizeof (struct utmp)) + return -1; + + /* Update position pointer. */ + utmp_data->loc_utmp += sizeof (struct utmp); + + *utmp = &utmp_data->ubuf; + + return 0; +} diff --git a/login/getutid.c b/login/getutid.c new file mode 100644 index 0000000..6b29d38 --- /dev/null +++ b/login/getutid.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + + +/* The global data defined in setutent.c. */ +extern struct utmp_data __utmp_data; + + +struct utmp * +getutid (const struct utmp *id) +{ + struct utmp *result; + + if (getutid_r (id, &result, &__utmp_data) < 0) + return NULL; + + return (struct utmp *) result; +} diff --git a/login/getutid_r.c b/login/getutid_r.c new file mode 100644 index 0000000..351f96e --- /dev/null +++ b/login/getutid_r.c @@ -0,0 +1,61 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include +#include + + +/* For implementing this function we don't use the getutent_r function + because we can avoid the reposition on every new entry this way. */ +int +getutid_r (const struct utmp *id, struct utmp **utmp, + struct utmp_data *utmp_data) +{ + /* Open utmp file if not already done. */ + if (utmp_data->ut_fd == -1) + { + setutent_r (utmp_data); + if (utmp_data->ut_fd == -1) + return -1; + } + + /* Position file correctly. */ + if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) + return -1; + + do + { + /* Read the next entry. */ + if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) + != sizeof (struct utmp)) + { + errno = ESRCH; + return -1; + } + + /* Update position pointer. */ + utmp_data->loc_utmp += sizeof (struct utmp); + } + while (id->ut_type != utmp_data->ubuf.ut_type); + + *utmp = &utmp_data->ubuf; + + return 0; +} diff --git a/login/getutline.c b/login/getutline.c new file mode 100644 index 0000000..23ca6a8 --- /dev/null +++ b/login/getutline.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + + +/* The global data defined in setutent.c. */ +extern struct utmp_data __utmp_data; + + +struct utmp * +getutline (const struct utmp *line) +{ + struct utmp *result; + + if (getutline_r (line, &result, &__utmp_data) < 0) + return NULL; + + return (struct utmp *) result; +} diff --git a/login/getutline_r.c b/login/getutline_r.c new file mode 100644 index 0000000..62c8c2f --- /dev/null +++ b/login/getutline_r.c @@ -0,0 +1,61 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include +#include + + +/* For implementing this function we don't use the getutent_r function + because we can avoid the reposition on every new entry this way. */ +int +getutline_r (const struct utmp *line, struct utmp **utmp, + struct utmp_data *utmp_data) +{ + /* Open utmp file if not already done. */ + if (utmp_data->ut_fd == -1) + { + setutent_r (utmp_data); + if (utmp_data->ut_fd == -1) + return -1; + } + + /* Position file correctly. */ + if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) + return -1; + + do + { + /* Read the next entry. */ + if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) + != sizeof (struct utmp)) + { + errno = ESRCH; + return -1; + } + + /* Update position pointer. */ + utmp_data->loc_utmp += sizeof (struct utmp); + } + while (line->ut_line != utmp_data->ubuf.ut_line); + + *utmp = &utmp_data->ubuf; + + return 0; +} diff --git a/login/login.c b/login/login.c new file mode 100644 index 0000000..5b71082 --- /dev/null +++ b/login/login.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)login.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include + +#include +#include +#include +#include +#include + +void +login(ut) + const struct utmp *ut; +{ + register int fd; + int tty; + + tty = ttyslot(); + if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) { + (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), L_SET); + (void)write(fd, ut, sizeof(struct utmp)); + (void)close(fd); + } + if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { + (void)write(fd, ut, sizeof(struct utmp)); + (void)close(fd); + } +} diff --git a/login/login_tty.c b/login/login_tty.c new file mode 100644 index 0000000..e4e075c --- /dev/null +++ b/login/login_tty.c @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)login_tty.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include + +int +login_tty(fd) + int fd; +{ + (void) setsid(); +#ifdef TIOCSCTTY + if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1) + return (-1); +#else + { + /* This might work. */ + char *fdname = ttyname (fd); + int newfd; + if (fdname) + { + if (fd != 0) + (void) close (0); + if (fd != 1) + (void) close (1); + if (fd != 2) + (void) close (2); + newfd = open (fdname, O_RDWR); + (void) close (newfd); + } + } +#endif + (void) dup2(fd, 0); + (void) dup2(fd, 1); + (void) dup2(fd, 2); + if (fd > 2) + (void) close(fd); + return (0); +} diff --git a/login/logout.c b/login/logout.c new file mode 100644 index 0000000..40ae254 --- /dev/null +++ b/login/logout.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)logout.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#include +#include +#include +#include +#include + +typedef struct utmp UTMP; + +int +logout(line) + register const char *line; +{ + register int fd; + UTMP ut; + int rval; + + if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) + return(0); + rval = 0; + while (read(fd, &ut, sizeof(UTMP)) == sizeof(UTMP)) { + if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE)) + continue; + bzero(ut.ut_name, UT_NAMESIZE); + bzero(ut.ut_host, UT_HOSTSIZE); + (void)time(&ut.ut_time); + (void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR); + (void)write(fd, &ut, sizeof(UTMP)); + rval = 1; + } + (void)close(fd); + return(rval); +} diff --git a/login/logwtmp.c b/login/logwtmp.c new file mode 100644 index 0000000..7734ca9 --- /dev/null +++ b/login/logwtmp.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)logwtmp.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include + +#include +#include + +void +logwtmp(line, name, host) + const char *line, *name, *host; +{ + struct utmp ut; + struct stat buf; + int fd; + + if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0) + return; + if (fstat(fd, &buf) == 0) { + (void) strncpy(ut.ut_line, line, sizeof(ut.ut_line)); + (void) strncpy(ut.ut_name, name, sizeof(ut.ut_name)); + (void) strncpy(ut.ut_host, host, sizeof(ut.ut_host)); + (void) time(&ut.ut_time); + if (write(fd, (char *)&ut, sizeof(struct utmp)) != + sizeof(struct utmp)) + (void) ftruncate(fd, buf.st_size); + } + (void) close(fd); +} diff --git a/login/pututline.c b/login/pututline.c new file mode 100644 index 0000000..a704e38 --- /dev/null +++ b/login/pututline.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + + +/* The global data defined in setutent.c. */ +extern struct utmp_data __utmp_data; + + +struct utmp * +pututline (const struct utmp *utmp) +{ + if (pututline_r (utmp, &__utmp_data) < 0) + return NULL; + + return (struct utmp *) utmp; +} diff --git a/login/pututline_r.c b/login/pututline_r.c new file mode 100644 index 0000000..365a376 --- /dev/null +++ b/login/pututline_r.c @@ -0,0 +1,89 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include +#include +#include +#include +#include +#include + + +int +pututline_r (const struct utmp *utmp_ptr, struct utmp_data *utmp_data) +{ + /* Open utmp file if not already done. */ + if (utmp_data->ut_fd == -1) + { + setutent_r (utmp_data); + if (utmp_data->ut_fd == -1) + return -1; + } + + /* Seek position to write. */ + if (utmp_data->ubuf.ut_type != utmp_ptr->ut_type) + { + /* We must not overwrite the data in UTMP_DATA. */ + struct utmp_data *data_tmp = alloca (sizeof (utmp_data)); + struct utmp *dummy; + + memcpy (data_tmp, utmp_data, sizeof (utmp_data)); + utmp_data = data_tmp; + + if (getutid_r (utmp_ptr, &dummy, utmp_data) < 0) + { + if (errno != ESRCH) + return -1; + + utmp_data->loc_utmp = lseek (utmp_data->ut_fd, 0, SEEK_END); + if (utmp_data->loc_utmp == -1) + return -1; + } + } + + /* Position file correctly. */ + if (utmp_data->loc_utmp > 0 + && lseek (utmp_data->ut_fd, utmp_data->loc_utmp - sizeof (struct utmp), + SEEK_SET) < 0) + return -1; + + /* XXX An alternative solution would be to call an SUID root program + which write the new value. */ + + /* Try to lock the file. */ + if (flock (utmp_data->ut_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. */ + (void) flock (utmp_data->ut_fd, LOCK_EX | LOCK_NB); + } + + /* Write the new data. */ + if (write (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) + != sizeof (struct utmp)) + return -1; + + /* And unlock the file. */ + (void) flock (utmp_data->ut_fd, LOCK_UN); + + return 0; +} diff --git a/login/setutent.c b/login/setutent.c new file mode 100644 index 0000000..aab28c0 --- /dev/null +++ b/login/setutent.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 + +/* Global variable with values for non-reentrent functions. If must + be initialized so that field `ut_fd' is set to -1. */ +struct utmp_data __utmp_data = { ut_fd: -1 }; + + +void +setutent (void) +{ + setutent_r (&__utmp_data); +} diff --git a/login/setutent_r.c b/login/setutent_r.c new file mode 100644 index 0000000..715101d --- /dev/null +++ b/login/setutent_r.c @@ -0,0 +1,72 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +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 +#include +#include +#include +#include + +/* This is the default name. */ +static const char default_utmp_name[] = _PATH_UTMP; + +/* Current file name. */ +static const char *utmp_file_name = (const char *) default_utmp_name; + + +void +setutent_r (struct utmp_data *utmp_data) +{ + /* Before the UTMP_DATA is used before the first time the UT_FD + field must be set to -1. */ + if (utmp_data->ut_fd == -1) + { + utmp_data->ut_fd = open (utmp_file_name, O_RDWR); + if (utmp_data->ut_fd == -1) + { + /* Hhm, read-write access did not work. Try read-only. */ + utmp_data->ut_fd = open (utmp_file_name, O_RDONLY); + if (utmp_data->ut_fd == -1) + { + perror (_("while opening UTMP file")); + return; + } + } + } + + /* Remember we are at beginning of file. */ + utmp_data->loc_utmp = 0; + utmp_data->ubuf.ut_type = -1; +} + + +int +utmpname (const char *file) +{ + char *fname = strdup (file); + if (fname == NULL) + return 0; + + if (utmp_file_name != default_utmp_name) + free ((void *) utmp_file_name); + + utmp_file_name = fname; + + return 1; +} diff --git a/login/utmp.h b/login/utmp.h new file mode 100644 index 0000000..2ba3da8 --- /dev/null +++ b/login/utmp.h @@ -0,0 +1,96 @@ +/* Copyright (C) 1993, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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 _UTMP_H_ + +#define _UTMP_H_ 1 +#include + +#include + +/* Get system dependent values and data structures. */ +#include + + +/* Write the given entry into utmp and wtmp. */ +extern void login __P ((__const struct utmp *)); + +/* Write the utmp entry to say the user on UT_LINE has logged out. */ +extern int logout __P ((__const char *ut_line)); + +/* Append to wtmp an entry for the current time and the given info. */ +extern void logwtmp __P ((__const char *ut_line, __const char *ut_name, + __const char *ut_host)); + +/* Change name of the examine utmp file. */ +extern int utmpname __P ((__const char *__file)); + +/* Read next entry from a utmp-like file. */ +extern struct utmp *getutent __P ((void)); + +/* Rest the input stream to the beginning of the file. */ +extern void setutent __P ((void)); + +/* Close the current open file. */ +extern void endutent __P ((void)); + +/* Search forward from the current point in the utmp file until the + next entry with a ut_type matching ID->ut_type. */ +extern struct utmp *getutid __P ((__const struct utmp *__id)); + +/* Search forward from the current point in the utmp file until the + next entry with a ut_line matching LINE->ut_line. */ +extern struct utmp *getutline __P ((__const struct utmp *__line)); + +/* Write out entry pointed to by UTMP_PTR into the utmp file. */ +extern struct utmp *pututline __P ((__const struct utmp *__utmp_ptr)); + + +#if defined(_REENTRANT) || defined(_THREAD_SAFE) +/* Define the data structure needed for the reentrent version. */ +struct utmp_data +{ + int ut_fd; + off_t loc_utmp; + struct utmp ubuf; +}; + + +/* Reentrent versions of the file for handling utmp files. */ +extern int getutent_r __P ((struct utmp **__utmp, + struct utmp_data *__utmp_data)); + +extern void setutent_r __P ((struct utmp_data *__utmp_data)); + +extern void endutent_r __P ((struct utmp_data *__utmp_data)); + +extern int getutid_r __P ((__const struct utmp *__id, struct utmp **__utmp, + struct utmp_data *__utmp_data)); + +extern int getutline_r __P ((__const struct utmp *__line, struct utmp **__utmp, + struct utmp_data *__utmp_data)); + +extern int pututline_r __P ((__const struct utmp *__utmp_ptr, + struct utmp_data *__utmp_data)); + +#endif /* _REENTRENT || _THREAD_SAFE */ + +__END_DECLS + +#endif /* utmp.h */ -- cgit v1.1