Sat May 18 02:57:46 1996 Ulrich Drepper <drepper@cygnus.com>
authorroland <roland>
Tue, 21 May 1996 22:52:23 +0000 (22:52 +0000)
committerroland <roland>
Tue, 21 May 1996 22:52:23 +0000 (22:52 +0000)
* login/setutent_r.c, login/setutent.c, login/endutent_r.c,
login/endutent.c, login/getutent_r.c, login/getutent.c,
login/getutid_r.c, login/getutid.c, login/getutline_r.c,
login/getutline.c, login/pututline_r.c, login/pututline.c:
New files.  Routines to handle utmp-style files.

12 files changed:
login/endutent.c [new file with mode: 0644]
login/endutent_r.c [new file with mode: 0644]
login/getutent.c [new file with mode: 0644]
login/getutent_r.c [new file with mode: 0644]
login/getutid.c [new file with mode: 0644]
login/getutid_r.c [new file with mode: 0644]
login/getutline.c [new file with mode: 0644]
login/getutline_r.c [new file with mode: 0644]
login/pututline.c [new file with mode: 0644]
login/pututline_r.c [new file with mode: 0644]
login/setutent.c [new file with mode: 0644]
login/setutent_r.c [new file with mode: 0644]

diff --git a/login/endutent.c b/login/endutent.c
new file mode 100644 (file)
index 0000000..9aed00d
--- /dev/null
@@ -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 (file)
index 0000000..b15f57a
--- /dev/null
@@ -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 (file)
index 0000000..3641146
--- /dev/null
@@ -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 (file)
index 0000000..ad8e9eb
--- /dev/null
@@ -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 (file)
index 0000000..6b29d38
--- /dev/null
@@ -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 (file)
index 0000000..351f96e
--- /dev/null
@@ -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 (file)
index 0000000..23ca6a8
--- /dev/null
@@ -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 (file)
index 0000000..62c8c2f
--- /dev/null
@@ -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/pututline.c b/login/pututline.c
new file mode 100644 (file)
index 0000000..a704e38
--- /dev/null
@@ -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 (file)
index 0000000..365a376
--- /dev/null
@@ -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 (file)
index 0000000..aab28c0
--- /dev/null
@@ -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 (file)
index 0000000..715101d
--- /dev/null
@@ -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;
+}