diff options
Diffstat (limited to 'login')
-rw-r--r-- | login/Makefile | 38 | ||||
-rw-r--r-- | login/endutent.c | 31 | ||||
-rw-r--r-- | login/endutent_r.c | 32 | ||||
-rw-r--r-- | login/getutent.c | 36 | ||||
-rw-r--r-- | login/getutent_r.c | 50 | ||||
-rw-r--r-- | login/getutid.c | 36 | ||||
-rw-r--r-- | login/getutid_r.c | 61 | ||||
-rw-r--r-- | login/getutline.c | 36 | ||||
-rw-r--r-- | login/getutline_r.c | 61 | ||||
-rw-r--r-- | login/login.c | 63 | ||||
-rw-r--r-- | login/login_tty.c | 75 | ||||
-rw-r--r-- | login/logout.c | 72 | ||||
-rw-r--r-- | login/logwtmp.c | 67 | ||||
-rw-r--r-- | login/pututline.c | 34 | ||||
-rw-r--r-- | login/pututline_r.c | 89 | ||||
-rw-r--r-- | login/setutent.c | 31 | ||||
-rw-r--r-- | login/setutent_r.c | 72 | ||||
-rw-r--r-- | login/utmp.h | 96 |
18 files changed, 980 insertions, 0 deletions
diff --git a/login/Makefile b/login/Makefile new file mode 100644 index 0000000000..d3e6ac8aa5 --- /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 0000000000..9aed00d7a7 --- /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 <drepper@cygnus.com>, 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 <utmp.h> + + +/* 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 0000000000..b15f57a964 --- /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 <drepper@cygnus.com>, 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 <unistd.h> +#include <utmp.h> + + +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 0000000000..36411469a0 --- /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 <drepper@cygnus.com>, 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 <utmp.h> + + +/* 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 0000000000..ad8e9eb7c2 --- /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 <drepper@cygnus.com>, 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 <unistd.h> +#include <utmp.h> + + +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 0000000000..6b29d38fd0 --- /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 <drepper@cygnus.com>, 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 <utmp.h> + + +/* 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 0000000000..351f96e65e --- /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 <drepper@cygnus.com>, 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 <errno.h> +#include <unistd.h> +#include <utmp.h> + + +/* 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 0000000000..23ca6a8107 --- /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 <drepper@cygnus.com>, 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 <utmp.h> + + +/* 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 0000000000..62c8c2fd66 --- /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 <drepper@cygnus.com>, 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 <errno.h> +#include <unistd.h> +#include <utmp.h> + + +/* 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 0000000000..5b71082c52 --- /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 <sys/types.h> + +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <utmp.h> +#include <stdio.h> + +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 0000000000..e4e075c6ed --- /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 <sys/param.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <fcntl.h> + +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 0000000000..40ae25456f --- /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 <sys/types.h> +#include <sys/time.h> + +#include <fcntl.h> +#include <utmp.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +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 0000000000..7734ca9624 --- /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 <sys/types.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <time.h> +#include <string.h> + +#include <unistd.h> +#include <utmp.h> + +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 0000000000..a704e380fa --- /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 <drepper@cygnus.com>, 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 <utmp.h> + + +/* 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 0000000000..365a37672e --- /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 <drepper@cygnus.com>, 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 <alloca.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <utmp.h> +#include <sys/file.h> + + +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 0000000000..aab28c0015 --- /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 <drepper@cygnus.com>, 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 <utmp.h> + +/* 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 0000000000..715101d659 --- /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 <drepper@cygnus.com>, 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 <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <utmp.h> + +/* 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 0000000000..2ba3da8e0b --- /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 <features.h> + +#include <sys/types.h> + +/* Get system dependent values and data structures. */ +#include <utmpbits.h> + + +/* 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 */ |