<https://schmonz.com/qmail/qbiffutmpx> diff --git a/Makefile b/Makefile index 0f0e31a..ae8d229 100644 --- a/Makefile +++ b/Makefile @@ -685,6 +685,13 @@ chkshsgr warn-shsgr tryshsgr.c compile load hasshsgr.h rm -f tryshsgr.o tryshsgr +hasutmpx.h: \ +tryutmpx.c compile load + ( ( ./compile tryutmpx.c && ./load tryutmpx ) >/dev/null \ + 2>&1 \ + && echo \#define HASUTMPX 1 || exit 0 ) > hasutmpx.h + rm -f tryutmpx.o tryutmpx + haswaitp.h: \ trywaitp.c compile load ( ( ./compile trywaitp.c && ./load trywaitp ) >/dev/null \ @@ -1071,7 +1078,8 @@ qbiff.1 qbiff.o: \ compile qbiff.c readwrite.h stralloc.h gen_alloc.h substdio.h subfd.h \ -substdio.h open.h byte.h str.h headerbody.h hfield.h env.h exit.h +substdio.h open.h byte.h str.h headerbody.h hfield.h env.h exit.h \ +hasutmpx.h ./compile qbiff.c qmail-clean: \ diff --git a/TARGETS b/TARGETS index facdad7..c37a453 100644 --- a/TARGETS +++ b/TARGETS @@ -388,3 +388,4 @@ man setup check +hasutmpx.h diff --git a/qbiff.c b/qbiff.c index 4e9f1d8..f21b6bf 100644 --- a/qbiff.c +++ b/qbiff.c @@ -1,5 +1,9 @@ #include <sys/types.h> #include <sys/stat.h> +#include "hasutmpx.h" +#ifdef HASUTMPX +#include <utmpx.h> +#else #include <utmp.h> #ifndef UTMP_FILE #ifdef _PATH_UTMP @@ -8,6 +12,7 @@ #define UTMP_FILE "/etc/utmp" #endif #endif +#endif #include "readwrite.h" #include "stralloc.h" #include "substdio.h" @@ -20,15 +25,22 @@ #include "env.h" #include "exit.h" +#ifndef HASUTMPX substdio ssutmp; char bufutmp[sizeof(struct utmp) * 16]; int fdutmp; +#endif substdio sstty; char buftty[1024]; int fdtty; +#ifdef HASUTMPX +struct utmpx *ut; +char line[sizeof(ut->ut_line) + 1]; +#else struct utmp ut; char line[sizeof(ut.ut_line) + 1]; +#endif stralloc woof = {0}; stralloc tofrom = {0}; stralloc text = {0}; @@ -63,7 +75,11 @@ void main() if (!(user = env_get("USER"))) _exit(0); if (!(sender = env_get("SENDER"))) _exit(0); if (!(userext = env_get("LOCAL"))) _exit(0); +#ifdef HASUTMPX + if (str_len(user) > sizeof(ut->ut_user)) _exit(0); +#else if (str_len(user) > sizeof(ut.ut_name)) _exit(0); +#endif if (!stralloc_copys(&tofrom,"*** TO <")) _exit(0); if (!stralloc_cats(&tofrom,userext)) _exit(0); @@ -88,6 +104,7 @@ void main() if (!stralloc_cat(&woof,&text)) _exit(0); if (!stralloc_cats(&woof,"\015\n")) _exit(0); +#ifndef HASUTMPX fdutmp = open_read(UTMP_FILE); if (fdutmp == -1) _exit(0); substdio_fdbuf(&ssutmp,read,fdutmp,bufutmp,sizeof(bufutmp)); @@ -97,6 +114,13 @@ void main() { byte_copy(line,sizeof(ut.ut_line),ut.ut_line); line[sizeof(ut.ut_line)] = 0; +#else + while ((ut = getutxent())) + if (ut->ut_type == USER_PROCESS && !str_diffn(ut->ut_user,user,sizeof(ut->ut_user))) + { + byte_copy(line,sizeof(ut->ut_line),ut->ut_line); + line[sizeof(ut->ut_line)] = 0; +#endif if (line[0] == '/') continue; if (!line[0]) continue; if (line[str_chr(line,'.')]) continue; diff --git a/tryutmpx.c b/tryutmpx.c new file mode 100644 index 0000000..551b597 --- /dev/null +++ b/tryutmpx.c @@ -0,0 +1,6 @@ +#include <utmpx.h> + +void main() +{ + ; +}