about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-04-11 12:29:29 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2021-04-11 12:29:29 +0000
commit00ced4001b769e6f0c9c1dab7d43802bb6be36d4 (patch)
tree0e1d5ae98725ca179bc409a950422b01132cae02 /src
parentdb0eeb9fd5212ceff4935c3942f2bc85475bf28c (diff)
downloadutmps-00ced4001b769e6f0c9c1dab7d43802bb6be36d4.tar.gz
utmps-00ced4001b769e6f0c9c1dab7d43802bb6be36d4.tar.xz
utmps-00ced4001b769e6f0c9c1dab7d43802bb6be36d4.zip
Add WTMP_FILE; make getutx*() stay on found record
Diffstat (limited to 'src')
-rw-r--r--src/include/utmps/utmpx.h3
-rw-r--r--src/utmps/utmps-utmpd.c26
2 files changed, 27 insertions, 2 deletions
diff --git a/src/include/utmps/utmpx.h b/src/include/utmps/utmpx.h
index dd68945..f0414fb 100644
--- a/src/include/utmps/utmpx.h
+++ b/src/include/utmps/utmpx.h
@@ -67,8 +67,9 @@ extern void logwtmp (char const *, char const *, char const *) ;
 #define UT_NAMESIZE UTMPS_UT_NAMESIZE
 #define UT_HOSTSIZE UTMPS_UT_HOSTSIZE
 
-/* Unused, but some packages (ex: procps-ng) require this macro to be present */
+/* Unused, but some packages (ex: procps-ng) require these macros to be present */
 #define UTMPX_FILE "/run/utmps/utmp"
+#define WTMPX_FILE "/run/utmps/wtmp"
 
 /* More old GNU/crap compatibility */
 #define ut_name ut_user
diff --git a/src/utmps/utmps-utmpd.c b/src/utmps/utmps-utmpd.c
index 17f4cab..af77a06 100644
--- a/src/utmps/utmps-utmpd.c
+++ b/src/utmps/utmps-utmpd.c
@@ -104,6 +104,11 @@ static int idmatch (unsigned short type, char const *id, struct utmpx const *b)
   return 0 ;
 }
 
+static inline int onestepback (void)
+{
+  return lseek(fd, -(off_t)sizeof(struct utmpx), SEEK_CUR) >= 0 ;
+}
+
 static void do_getent (void)
 {
   struct utmpx b ;
@@ -116,6 +121,12 @@ static void do_getent (void)
     answer(ESRCH) ;
     return ;
   }
+  if (!onestepback())
+  {
+    unlockit() ;
+    answer(errno) ;
+    return ;
+  }
   unlockit() ;
   utmps_utmpx_unpack(buf+1, &b) ;
   utmps_utmpx_pack(buf+1, &b) ;
@@ -145,11 +156,18 @@ static void do_getid (void)
     utmps_utmpx_unpack(sbuf+1, &b) ;
     if (idmatch(type, rbuf + USHORT_PACK, &b)) break ;
   }
+  if (!onestepback())
+  {
+    unlockit() ;
+    answer(errno) ;
+    return ;
+  }
   unlockit() ;
   buffer_putnoflush(buffer_1small, sbuf, 1 + sizeof(struct utmpx)) ;
   flush1() ;
 }
 
+
 static void do_getline (void)
 {
   char rbuf[UTMPS_UT_LINESIZE] ;
@@ -171,6 +189,12 @@ static void do_getline (void)
     if ((b.ut_type == LOGIN_PROCESS || b.ut_type == USER_PROCESS)
       && !strncmp(rbuf, b.ut_line, UTMPS_UT_LINESIZE - 1)) break ;
   }
+  if (!onestepback())
+  {
+    unlockit() ;
+    answer(errno) ;
+    return ;
+  }
   unlockit() ;
   buffer_putnoflush(buffer_1small, sbuf, 1 + sizeof(struct utmpx)) ;
   flush1() ;
@@ -197,7 +221,7 @@ static void do_putline (uid_t uid, gid_t gid)
     utmps_utmpx_unpack(tmp, &b) ;
     if (idmatch(u.ut_type, u.ut_id, &b) && !strncmp(u.ut_line, b.ut_line, UTMPS_UT_LINESIZE - 1))
     {
-      if (lseek(fd, -(off_t)sizeof(struct utmpx), SEEK_CUR) < 0)
+      if (!onestepback())
       {
         unlockit() ;
         answer(errno) ;