mail.c
author viric <viriketo@gmail.com>
Tue, 11 Oct 2011 19:50:10 +0200
changeset 303 2edd42e77392
parent 274 62048132f95f
permissions -rw-r--r--
Updating the version to 0.7.1, for a release.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
78
e4d5907f5aaf Added manpage and make install.
viric@llimona
parents: 73
diff changeset
     1
/*
e4d5907f5aaf Added manpage and make install.
viric@llimona
parents: 73
diff changeset
     2
    Task Spooler - a task queue system for the unix user
267
11631dd11ff8 Updating copyright years in the source.
viric@mandarina
parents: 238
diff changeset
     3
    Copyright (C) 2007-2009  LluĂ­s Batlle i Rossell
78
e4d5907f5aaf Added manpage and make install.
viric@llimona
parents: 73
diff changeset
     4
e4d5907f5aaf Added manpage and make install.
viric@llimona
parents: 73
diff changeset
     5
    Please find the license in the provided COPYING file.
e4d5907f5aaf Added manpage and make install.
viric@llimona
parents: 73
diff changeset
     6
*/
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     7
#include <signal.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     8
#include <string.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     9
#include <sys/types.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    10
#include <sys/wait.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    11
#include <stdlib.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    12
#include <unistd.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    13
#include <stdio.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    14
#include <sys/stat.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    15
#include <fcntl.h>
274
62048132f95f Making changes so it looks like the code in ts-0.6.4, which I can't find
viric@mandarina
parents: 267
diff changeset
    16
#include <sys/time.h> /* Needed for any main.h inclusion */
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    17
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    18
#include "main.h"
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    19
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    20
/* Returns the write pipe */
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    21
static int run_sendmail(const char *dest)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    22
{
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    23
    int pid;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    24
    int p[2];
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    25
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    26
    pipe(p);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    27
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    28
    pid = fork();
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    29
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    30
    switch(pid)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    31
    {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    32
        case 0: /* Child */
95
d31aaee661d1 Protection against SIGPIPE. Block it.
viric@llimona
parents: 92
diff changeset
    33
            restore_sigmask();
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    34
            close(0);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    35
            close(1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    36
            close(2);
238
d490cad20a00 Fixing some bugs in 'mail', with fixes reported by Sergio Ballestrero.
viric@vicerveza
parents: 231
diff changeset
    37
	    close(p[1]);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    38
            dup2(p[0], 0);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    39
            execl("/usr/sbin/sendmail", "sendmail", "-oi", dest, NULL);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    40
            error("run sendmail");
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    41
        case -1:
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    42
            error("fork sendmail");
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    43
        default: /* Parent */
238
d490cad20a00 Fixing some bugs in 'mail', with fixes reported by Sergio Ballestrero.
viric@vicerveza
parents: 231
diff changeset
    44
	    close(p[0]);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    45
    }
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    46
    return p[1];
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    47
}
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    48
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    49
static void write_header(int fd, const char *dest, const char * command,
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    50
        int jobid, int errorlevel)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    51
{
147
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents: 146
diff changeset
    52
    fd_nprintf(fd, 100, "From: Task Spooler <taskspooler>\n");
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents: 146
diff changeset
    53
    fd_nprintf(fd, 500, "To: %s\n", dest);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents: 146
diff changeset
    54
    fd_nprintf(fd, 500, "Subject: the task %i finished with error %i. \n", jobid,
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    55
            errorlevel);
147
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents: 146
diff changeset
    56
    fd_nprintf(fd, 500, "\nCommand: %s\n", command);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents: 146
diff changeset
    57
    fd_nprintf(fd, 500, "Output:\n");
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    58
}
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    59
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    60
static void copy_output(int write_fd, const char *ofname)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    61
{
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    62
    int file_fd;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    63
    char buffer[1000];
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    64
    int read_bytes;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    65
    int res;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    66
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    67
    file_fd = open(ofname, O_RDONLY);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    68
    if (file_fd == -1)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    69
        error("mail: Cannot open the output file %s", ofname);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    70
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    71
    do {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    72
        read_bytes = read(file_fd, buffer, 1000);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    73
        if (read_bytes > 0)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    74
        {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    75
            res = write(write_fd, buffer, read_bytes);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    76
            if (res == -1)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    77
                warning("Cannot write to the mail pipe %i", write_fd);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    78
        }
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    79
    } while (read_bytes > 0);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    80
    if (read_bytes == -1)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
    81
        warning("Cannot read the output file %s from %i", ofname, file_fd);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    82
}
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    83
73
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    84
void hook_on_finish(int jobid, int errorlevel, const char *ofname,
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    85
    const char *command)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    86
{
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    87
    char *onfinish;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    88
    int pid;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    89
    char sjobid[20];
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    90
    char serrorlevel[20];
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    91
    int status;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    92
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    93
    onfinish = getenv("TS_ONFINISH");
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    94
    if (onfinish == NULL)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    95
        return;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    96
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    97
    pid = fork();
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    98
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    99
    switch(pid)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   100
    {
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   101
        case 0: /* Child */
95
d31aaee661d1 Protection against SIGPIPE. Block it.
viric@llimona
parents: 92
diff changeset
   102
            restore_sigmask();
73
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   103
            sprintf(sjobid, "%i", jobid);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   104
            sprintf(serrorlevel, "%i", errorlevel);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   105
            execlp(onfinish, onfinish, sjobid, serrorlevel, ofname, command,
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   106
                    NULL);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   107
        case -1:
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 78
diff changeset
   108
            error("fork on finish");
73
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   109
        default: /* Parent */
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   110
            wait(&status);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   111
    }
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   112
}
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   113
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   114
void send_mail(int jobid, int errorlevel, const char *ofname,
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   115
    const char *command)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   116
{
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   117
    char to[101];
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   118
    char *user;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   119
    char *env_to;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   120
    int write_fd;
238
d490cad20a00 Fixing some bugs in 'mail', with fixes reported by Sergio Ballestrero.
viric@vicerveza
parents: 231
diff changeset
   121
    int status;
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   122
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   123
    env_to = getenv("TS_MAILTO");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   124
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   125
    if (env_to == NULL || strlen(env_to) > 100)
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   126
    {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   127
        user = getenv("USER");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   128
        if (user == NULL)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   129
            user = "nobody";
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   130
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   131
        strcpy(to, user);
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   132
        /*strcat(to, "@localhost");*/
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   133
    } else
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   134
        strcpy(to, env_to);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   135
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   136
    write_fd = run_sendmail(to);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   137
    write_header(write_fd, to, command, jobid, errorlevel);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   138
    copy_output(write_fd, ofname);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   139
    close(write_fd);
238
d490cad20a00 Fixing some bugs in 'mail', with fixes reported by Sergio Ballestrero.
viric@vicerveza
parents: 231
diff changeset
   140
    wait(&status);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   141
}