Print this page
374 cron should send more useful mail

*** 70,79 **** --- 70,80 ---- #include <time.h> #include <unistd.h> #include <libzoneinfo.h> #include "cron.h" + #include "cron_scf.h" /* * #define DEBUG */
*** 144,153 **** --- 145,155 ---- #define CLOCK_DRIFT "clock time drifted backwards after event!\n" #define PIDERR "unexpected pid returned %d (ignored)" #define CRONTABERR "Subject: Your crontab file has an error in it\n\n" #define CRONOUT "Subject: Output from \"cron\" command\n\n" + #define CRONOUTNEW "Subject: Cron <%s@%s>: %s\n\n" #define MALLOCERR "out of space, cannot create new string\n" #define DIDFORK didfork #define NOFORK !didfork
*** 355,364 **** --- 357,372 ---- static int refresh; static sigset_t defmask, sigmask; /* + * Configuration from smf(5) + */ + static int legacy_subject; + static int extra_headers; + + /* * BSM hooks */ extern int audit_cron_session(char *, char *, uid_t, gid_t, char *); extern void audit_cron_new_job(char *, int, void *); extern void audit_cron_bad_user(char *);
*** 673,682 **** --- 681,691 ---- { #ifdef DEBUG (void) fprintf(stderr, "in initialize\n"); #endif if (firstpass) { + int val; /* for mail(1), make sure messages come from root */ if (putenv("LOGNAME=root") != 0) { crabort("cannot expand env variable", REMOVE_FIFO|CONSOLE_MSG); }
*** 703,713 **** --- 712,737 ---- * init respawning this quickly */ } crabort("cannot start cron; FIFO exists", CONSOLE_MSG); } + switch (init_scf()) { + case 0: + val = get_config_boolean("legacy_subject"); + legacy_subject = (val < 0 ? 0 : val); + val = get_config_boolean("extra_headers"); + extra_headers = (val < 0 ? 1 : val); + break; + case -2: + crabort("cron not running under smf(5)", + REMOVE_FIFO|CONSOLE_MSG); + break; + default: + crabort("could not initialise libscf", + REMOVE_FIFO|CONSOLE_MSG); } + } if ((msgfd = open(FIFO, O_RDWR)) < 0) { perror("! open"); crabort("cannot open fifo queue", REMOVE_FIFO|CONSOLE_MSG); }
*** 2722,2733 **** --- 2746,2770 ---- mailpipe = popen(cmd, "w"); free(cmd); if (mailpipe == NULL) exit(127); (void) fprintf(mailpipe, "To: %s\n", p->name); + if (extra_headers) { + (void) fprintf(mailpipe, "X-Mailer: cron (%s %s)\n", + name.sysname, name.release); + (void) fprintf(mailpipe, "X-Cron-User: %s\n", p->name); + (void) fprintf(mailpipe, "X-Cron-Host: %s\n", name.nodename); + (void) fprintf(mailpipe, "X-Cron-Job-Name: %s\n", pr->jobname); + (void) fprintf(mailpipe, "X-Cron-Job-Type: %s\n", + (pr->jobtype == CRONEVENT ? "cron" : "at")); + } if (pr->jobtype == CRONEVENT) { + if (legacy_subject) (void) fprintf(mailpipe, CRONOUT); + else + (void) fprintf(mailpipe, CRONOUTNEW, + p->name, name.nodename, pr->jobname); (void) fprintf(mailpipe, "Your \"cron\" job on %s\n", name.nodename); if (pr->jobname != NULL) { (void) fprintf(mailpipe, "%s\n\n", pr->jobname); }