about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--login/login.c35
-rw-r--r--login/logout.c2
3 files changed, 36 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index f44123a8eb..168cd6724e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Fri Jul  5 17:34:47 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* login/logout.c (logout): Do nothing if getutline_r returns ESRCH.
+
+	* login/pututline_r.c (pututline_r): Since we assign RESULT from
+	lseek now, check that it's >= 0, not == 0.
+
+Wed Jul  3 13:28:04 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+	* login/login.c (login): Make a copy of *UT, fill in various
+	fields that we supply (ut_line, ut_type, ut_pid), and use the copy
+	in place of UT.
+
+	* login/getutline_r.c (getutline_r): When we return ESRCH, mark
+	UTMP_DATA->ubuf invalid (by setting UTMP_DATA->loc_utmp to 0).
+
 Fri Jul  5 12:22:51 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
 	* hurd/hurdsig.c (_hurd_internal_post_signal): In case of handled
diff --git a/login/login.c b/login/login.c
index bbd3be92ce..76f27a0875 100644
--- a/login/login.c
+++ b/login/login.c
@@ -87,6 +87,13 @@ login (const struct utmp *ut)
   int found_tty;
   const char *ttyp;
   struct utmp_data data = { -1 };
+  struct utmp copy = *ut;
+
+  /* Fill in those fields we supply.  */
+#if _HAVE_UT_TYPE - 0
+  copy.ut_type = USER_PROCESS;
+#endif
+  copy.ut_pid = getpid ();
 
   /* Seek tty.  */
   found_tty = tty_name (STDIN_FILENO, &tty, sizeof (_tty));
@@ -97,39 +104,35 @@ login (const struct utmp *ut)
 
   if (found_tty >= 0)
     {
+      /* We only want to insert the name of the tty without path.  */
+      ttyp = basename (tty);
+
+      /* Position to record for this tty.  */
+      strncpy (copy.ut_line, ttyp, UT_LINESIZE);
+
       /* Tell that we want to use the UTMP file.  */
       if (utmpname (_PATH_UTMP) != 0)
 	{
-	  struct utmp tmp;
 	  struct utmp *old;
 
 	  /* Open UTMP file.  */
 	  setutent_r (&data);
 
-	  /* We only want to insert the name of the tty without path.  */
-	  ttyp = basename (tty);
-
-	  /* Position to record for this tty.  */
-#if _HAVE_UT_TYPE - 0
-	  tmp.ut_type = USER_PROCESS;
-#endif
-	  strncpy (tmp.ut_line, ttyp, UT_LINESIZE);
-
 	  /* Read the record.  */
-	  if (getutline_r (&tmp, &old, &data) >= 0)
+	  if (getutline_r (&copy, &old, &data) >= 0)
 	    {
 #if _HAVE_UT_TYPE - 0
 	      /* We have to fake the old entry because this `login'
 		 function does not fit well into the UTMP file
 		 handling scheme.  */
-	      old->ut_type = ut->ut_type;
+	      old->ut_type = copy.ut_type;
 #endif
-	      pututline_r (ut, &data);
+	      pututline_r (&copy, &data);
 	    }
 	  else if (errno == ESRCH)
 	    /* We didn't find anything.  pututline_r will add UT at the end
 	       of the file in this case.  */
-	    pututline_r (ut, &data);
+	    pututline_r (&copy, &data);
 
 	  /* Close UTMP file.  */
 	  endutent_r (&data);
@@ -153,9 +156,9 @@ login (const struct utmp *ut)
 	  /* We have to fake the old entry because this `login'
 	     function does not fit well into the UTMP file handling
 	     scheme.  */
-	  data.ubuf.ut_type = ut->ut_type;
+	  data.ubuf.ut_type = copy.ut_type;
 #endif
-	  pututline_r (ut, &data);
+	  pututline_r (&copy, &data);
 	}
 
       /* Close WTMP file.  */
diff --git a/login/logout.c b/login/logout.c
index 1b8dc317ff..bf45451eef 100644
--- a/login/logout.c
+++ b/login/logout.c
@@ -44,7 +44,7 @@ logout (const char *line)
   strncpy (tmp.ut_line, line, sizeof tmp.ut_line);
 
   /* Read the record.  */
-  if (getutline_r (&tmp, &ut, &data) >= 0 || errno == ESRCH)
+  if (getutline_r (&tmp, &ut, &data) >= 0)
     {
       /* Clear information about who & from where.  */
       bzero (ut->ut_name, sizeof ut->ut_name);