aboutsummaryrefslogtreecommitdiff
path: root/riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c')
-rw-r--r--riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c b/riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c
new file mode 100644
index 0000000..c4bde50
--- /dev/null
+++ b/riemann.fmi.uni-sofia.bg/ngetty/ngetty-1.1/cleanutmp.c
@@ -0,0 +1,72 @@
+/* cleanutmp.c
+ chown root.utmp cleanutmp
+ chmod 2711 cleanutmp
+ */
+
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "lib.h"
+
+void ops(int n, const char *s0, const char *s1) {
+ write(2,s0,str_len(s0));
+ write(2,s1,str_len(s1));
+ write(2,"\n",1);
+ _exit(n);
+}
+
+#ifdef USE_LIBC_UTMP
+int main () {
+ struct utmp_type *ut, u;
+ setutent();
+
+ while (f_getutent()) {
+ if (ut->ut_type != USER_PROCESS) continue;
+ if (kill(ut->ut_pid, 0) && errno == ESRCH) {
+ u = *ut;
+ u.ut_type = DEAD_PROCESS;
+ u.ut_tv.tv_sec = time(0);
+
+ f_setutent();
+ if (0==f_pututline(&u))
+ ops(2,"error writing to: ", Utmp_File);
+ f_updwtmp(Wtmp_File, &u);
+ }
+ }
+ f_endutent();
+ return 0;
+}
+
+#else
+int main() {
+ int fd,wfd;
+ struct utmp_type ut[1];
+ off_t pos=0;
+
+ if ((fd = open(Utmp_File,O_RDWR)) <0 &&
+ (fd = open(Utmp_File,O_RDONLY)) <0)
+ ops(1,"error opening: ", Utmp_File);
+
+ while (utmp_io(fd,ut,F_RDLCK)) {
+ pos += UTMP_SIZE;
+ if (ut->ut_type != USER_PROCESS) continue;
+ if (kill(ut->ut_pid, 0) && errno == ESRCH) {
+ ut->ut_type = DEAD_PROCESS;
+ ut->ut_tv.tv_sec = time(0);
+
+ pos -= UTMP_SIZE;
+ if (lseek(fd, pos, SEEK_SET) != pos ||
+ !utmp_io(fd,ut,F_WRLCK))
+ ops(2,"error writing to: ", Utmp_File);
+ pos += UTMP_SIZE;
+
+ wfd=open(Wtmp_File, O_WRONLY|O_APPEND);
+ write(wfd, ut, UTMP_SIZE);
+ close(wfd);
+ }
+ }
+ close(fd);
+ return 0;
+}
+#endif