summaryrefslogtreecommitdiff
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
parentdb0eeb9fd5212ceff4935c3942f2bc85475bf28c (diff)
downloadutmps-00ced4001b769e6f0c9c1dab7d43802bb6be36d4.tar.xz
Add WTMP_FILE; make getutx*() stay on found record
-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) ;