X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=74f1b57e8c87fd343913b7d8b3b574b76e926a15;hp=c1ee80fbb367cb2954d668436424128c406e3365;hb=6c42153ad9362cc676ea66563bf400d7511b3b68;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/uip/slocal.c b/uip/slocal.c index c1ee80f..74f1b57 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -3,6 +3,10 @@ * slocal.c -- asynchronously filter and deliver new mail * * $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. */ /* @@ -17,26 +21,49 @@ * */ +/* 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 #include +#ifdef INITGROUPS_HEADER +#include INITGROUPS_HEADER +#else +/* On AIX 4.1, initgroups() is defined and even documented (giving the parameter + types as char* and int), but doesn't have a prototype in any of the system + header files. AIX 4.3, SunOS 4.1.3, and ULTRIX 4.2A have the same + problem. */ +extern int initgroups(char*, int); +#endif + + +#ifdef HAVE_DB1_NDBM_H +#include +#else +#include +#endif + #include -#ifndef UTMP_FILE -# ifdef _PATH_UTMP -# define UTMP_FILE _PATH_UTMP -# else -# define UTMP_FILE "/etc/utmp" +#ifndef HAVE_GETUTENT +# ifndef UTMP_FILE +# ifdef _PATH_UTMP +# define UTMP_FILE _PATH_UTMP +# else +# define UTMP_FILE "/etc/utmp" +# endif # endif #endif @@ -70,7 +97,7 @@ static struct swit switches[] = { #define VERSIONSW 13 { "version", 0 }, #define HELPSW 14 - { "help", 4 }, + { "help", 0 }, { NULL, 0 } }; @@ -334,18 +361,29 @@ main (int argc, char **argv) if ((fd = copy_message (fileno (stdin), tmpfil, 1)) == -1) adios (NULL, "unable to create temporary file"); } + if (debug) debug_printf ("temporary file=\"%s\"\n", tmpfil); - else - unlink (tmpfil); + + /* Delete the temp file now or a copy of every single message passed through + slocal will be left in the /tmp directory until deleted manually! This + unlink() used to be under an 'else' of the 'if (debug)' above, but since + some people like to always run slocal with -debug and log the results, + the /tmp directory would get choked over time. Of course, now that we + always delete the temp file, the "temporary file=" message above is + somewhat pointless -- someone watching debug output wouldn't have a + chance to 'tail -f' or 'ln' the temp file before it's unlinked. The best + thing would be to delay this unlink() until later if debug == 1, but I'll + leave that for someone who cares about the temp-file-accessing + functionality (they'll have to watch out for cases where we adios()). */ + unlink (tmpfil); if (!(fp = fdopen (fd, "r+"))) adios (NULL, "unable to access temporary file"); /* * If no sender given, extract it - * from envelope information. - */ + * from envelope information. */ if (sender == NULL) get_sender (envelope, &sender); @@ -373,7 +411,7 @@ main (int argc, char **argv) /* deliver the message */ status = localmail (fd, mdlvr); - done (status != -1 ? RCV_MOK : RCV_MBX); + return done (status != -1 ? RCV_MOK : RCV_MBX); } @@ -740,7 +778,7 @@ parse (int fd) for (p = hdrs; p->p_name; p++) { if (!strcasecmp (p->p_name, name)) { if (!(p->p_flags & P_HID)) { - if ((cp = p->p_value)) + if ((cp = p->p_value)) { if (p->p_flags & P_ADR) { dp = cp + strlen (cp) - 1; if (*dp == '\n') @@ -749,6 +787,7 @@ parse (int fd) } else { cp = add ("\t", cp); } + } p->p_value = add (lp, cp); } free (lp); @@ -903,6 +942,32 @@ lookup (struct pair *pairs, char *key) * logged in. */ +#ifdef HAVE_GETUTENT +static int +logged_in (void) +{ + struct utmp * utp; + + if (utmped) + return utmped; + + setutent(); + + while ((utp = getutent()) != NULL) { + if (utp->ut_type == USER_PROCESS + && utp->ut_user[0] != 0 + && strncmp (user, utp->ut_user, sizeof(utp->ut_user)) == 0) { + if (debug) + continue; + endutent(); + return (utmped = DONE); + } + } + + endutent(); + return (utmped = NOTOK); +} +#else static int logged_in (void) { @@ -928,7 +993,7 @@ logged_in (void) fclose (uf); return (utmped = NOTOK); } - +#endif #define check(t,a,b) if (t < a || t > b) return -1 #define cmpar(h1,m1,h2,m2) if (h1 < h2 || (h1 == h2 && m1 < m2)) return 0