main (int argc, char **argv)
{
int fd, status;
- FILE *fp = stdin;
+ FILE *fp;
char *cp, *mdlvr = NULL, buf[BUFSIZ];
char mailbox[BUFSIZ], tmpfil[BUFSIZ];
char **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (*argv, '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 0);
if (addr == NULL)
addr = getusername ();
- if (user == NULL)
- user = (cp = strchr(addr, '.')) ? ++cp : addr;
+ if (user == NULL) {
+ user = getusername ();
+ }
if ((pw = getpwnam (user)) == NULL)
adios (NULL, "no such local user as %s", user);
if (chdir (pw->pw_dir) == -1)
- chdir ("/");
+ if (chdir ("/") < 0) {
+ advise ("/", "chdir");
+ }
umask (0077);
if (geteuid() == 0) {
- setgid (pw->pw_gid);
+ if (setgid (pw->pw_gid) != 0) {
+ adios ("setgid", "unable to set group to %ld", (long) pw->pw_gid);
+ }
initgroups (pw->pw_name, pw->pw_gid);
- setuid (pw->pw_uid);
+ if (setuid (pw->pw_uid) != 0) {
+ adios ("setuid", "unable to set user to %ld", (long) pw->pw_uid);
+ }
}
-
+
if (info == NULL)
info = "";
if (debug)
debug_printf ("retrieving message from file \"%s\"\n", file);
if ((fd = copy_message (tempfd, tmpfil, 1)) == -1)
- adios (NULL, "unable to create temporary file");
+ adios(NULL, "unable to create temporary file in %s",
+ get_temp_dir());
close (tempfd);
} else {
/* getting message from stdin */
if (debug)
debug_printf ("retrieving message from stdin\n");
if ((fd = copy_message (fileno (stdin), tmpfil, 1)) == -1)
- adios (NULL, "unable to create temporary file");
+ adios(NULL, "unable to create temporary file in %s",
+ get_temp_dir());
}
if (debug)
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);
+ (void) m_unlink (tmpfil);
if (!(fp = fdopen (fd, "r+")))
adios (NULL, "unable to access temporary file");
*/
static int
-usr_pipe (int fd, char *cmd, char *pgm, char **vec, int suppress)
+usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress)
{
+ volatile int fd = fd_arg;
pid_t child_id;
int i, bytes, seconds, status;
struct stat st;
/* child process */
if (fd != 0)
dup2 (fd, 0);
- freopen ("/dev/null", "w", stdout);
- freopen ("/dev/null", "w", stderr);
+ if (freopen ("/dev/null", "w", stdout) == NULL) {
+ advise ("stdout", "freopen");
+ }
+ if (freopen ("/dev/null", "w", stderr) == NULL) {
+ advise ("stderr", "freopen");
+ }
if (fd != 3)
dup2 (fd, 3);
closefds (4);
tfile = m_mktemp2(NULL, invo_name, &fd1, NULL);
if (tfile == NULL) return -1;
- fchmod(fd1, 0600);
strncpy (tmpfil, tfile, BUFSIZ);
if (!fold) {
if (write (fd1, buffer, i) != i) {
you_lose:
close (fd1);
- unlink (tmpfil);
+ (void) m_unlink (tmpfil);
return -1;
}
if (i == -1)
rewind (in);
for (;;) {
+ int failed_to_lock = 0;
int bufsz = sizeof buf;
state = m_getfld (&gstate, name, buf, &bufsz, in);
switch (state) {
* This will fail if your Maildelivery file doesn't
* exist.
*/
- if ((lockfd = lkopendata(file, O_RDWR, 0)) == -1) {
+ if ((lockfd = lkopendata(file, O_RDWR, 0, &failed_to_lock))
+ == -1) {
advise (file, "unable to perform file locking on");
free (cp);
fclose (in);
free (cp);
fclose (in);
return result;
- break;
case BODY:
case FILEEOF: