aboutsummaryrefslogtreecommitdiff
path: root/login
diff options
context:
space:
mode:
Diffstat (limited to 'login')
-rw-r--r--login/Makefile38
-rw-r--r--login/endutent.c31
-rw-r--r--login/endutent_r.c32
-rw-r--r--login/getutent.c36
-rw-r--r--login/getutent_r.c50
-rw-r--r--login/getutid.c36
-rw-r--r--login/getutid_r.c61
-rw-r--r--login/getutline.c36
-rw-r--r--login/getutline_r.c61
-rw-r--r--login/login.c63
-rw-r--r--login/login_tty.c75
-rw-r--r--login/logout.c72
-rw-r--r--login/logwtmp.c67
-rw-r--r--login/pututline.c34
-rw-r--r--login/pututline_r.c89
-rw-r--r--login/setutent.c31
-rw-r--r--login/setutent_r.c72
-rw-r--r--login/utmp.h96
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 */