X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Frcvtty.c;h=29f2dd9d639845cbdfaef1d1ece030ede7e43299;hb=706236baa4c4670b5a074092dec5dec63ff50663;hp=f92201271b326eb7db043c037c425da0d065b860;hpb=8563731b02ce9d750806f6b1769af8b399d964e8;p=mmh diff --git a/uip/rcvtty.c b/uip/rcvtty.c index f922012..29f2dd9 100644 --- a/uip/rcvtty.c +++ b/uip/rcvtty.c @@ -2,26 +2,29 @@ /* * rcvtty.c -- a rcvmail program (a lot like rcvalert) handling IPC ttys * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. + */ + +/* Changed to use getutent() and friends. Assumes that when getutent() exists, + * a number of other things also exist. Please check. + * Ruud de Rooij Sun, 28 May 2000 17:28:55 +0200 */ #include #include +#include #include #include -#include -#include +#include +#include #include #include -#include -#ifndef UTMP_FILE -# ifdef _PATH_UTMP -# define UTMP_FILE _PATH_UTMP -# else -# define UTMP_FILE "/etc/utmp" -# endif -#endif +#ifdef HAVE_GETUTXENT +#include +#endif /* HAVE_GETUTXENT */ #define SCANFMT \ "%2(hour{dtimenow}):%02(min{dtimenow}): %<(size)%5(size) %>%<{encrypted}E%>\ @@ -48,7 +51,7 @@ static struct swit switches[] = { #define VERSIONSW 8 { "version", 0 }, #define HELPSW 9 - { "help", 4 }, + { "help", 0 }, { NULL, 0 } }; @@ -68,7 +71,7 @@ char *getusername(void); /* * static prototypes */ -static RETSIGTYPE alrmser (int); +static void alrmser (int); static int message_fd (char **); static int header_fd (void); static void alert (char *, int); @@ -80,9 +83,7 @@ main (int argc, char **argv) int md, vecp = 0; char *cp, *user, buf[BUFSIZ], tty[BUFSIZ]; char **argp, **arguments, *vec[MAXARGS]; - struct utmp ut; - register FILE *uf; - + struct utmpx *utp; #ifdef LOCALE setlocale(LC_ALL, ""); #endif @@ -108,10 +109,10 @@ main (int argc, char **argv) case HELPSW: snprintf (buf, sizeof(buf), "%s [command ...]", invo_name); print_help (buf, switches, 1); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case BIFFSW: biff = 1; @@ -156,28 +157,29 @@ main (int argc, char **argv) exit (RCV_MBX); user = getusername(); - if ((uf = fopen (UTMP_FILE, "r")) == NULL) - exit (RCV_MBX); - while (fread ((char *) &ut, sizeof(ut), 1, uf) == 1) - if (ut.ut_name[0] != 0 - && strncmp (user, ut.ut_name, sizeof(ut.ut_name)) == 0) { - strncpy (tty, ut.ut_line, sizeof(ut.ut_line)); +#if HAVE_GETUTXENT + setutxent(); + while ((utp = getutxent()) != NULL) { + if (utp->ut_type == USER_PROCESS && utp->ut_user[0] != 0 + && utp->ut_line[0] != 0 + && strncmp (user, utp->ut_user, sizeof(utp->ut_user)) == 0) { + strncpy (tty, utp->ut_line, sizeof(utp->ut_line)); alert (tty, md); - } + } + } + endutxent(); +#endif /* HAVE_GETUTXENT */ - fclose (uf); exit (RCV_MOK); return 0; /* dead code to satisfy the compiler */ } -static RETSIGTYPE +static void alrmser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGALRM, alrmser); -#endif + NMH_UNUSED (i); longjmp (myctx, 1); } @@ -191,14 +193,8 @@ message_fd (char **vec) char tmpfil[BUFSIZ]; struct stat st; -#ifdef HAVE_MKSTEMP fd = mkstemp (strncpy (tmpfil, "/tmp/rcvttyXXXXX", sizeof(tmpfil))); -#else - unlink (mktemp (strncpy (tmpfil, "/tmp/rcvttyXXXXX", sizeof(tmpfil)))); - if ((fd = open (tmpfil, O_RDWR | O_CREAT | O_TRUNC, 0600)) == NOTOK) - return header_fd (); unlink (tmpfil); -#endif if ((child_id = vfork()) == NOTOK) { /* fork error */ @@ -231,7 +227,7 @@ message_fd (char **vec) * Ruthlessly kill the child and anything * else in its process group. */ - KILLPG(child_id, SIGKILL); + killpg(child_id, SIGKILL); } close (fd); return header_fd (); @@ -253,12 +249,12 @@ static int header_fd (void) { int fd; - char *nfs, tmpfil[BUFSIZ]; + char *nfs; + char *tfile = NULL; - strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil)); - if ((fd = open (tmpfil, O_RDWR | O_CREAT | O_TRUNC, 0600)) == NOTOK) - return NOTOK; - unlink (tmpfil); + tfile = m_mktemp2(NULL, invo_name, &fd, NULL); + if (tfile == NULL) return NOTOK; + unlink (tfile); rewind (stdin);