summary refs log tree commit diff
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  */