mail.c
author viric@llimona
Mon, 02 Apr 2007 17:53:52 +0200
changeset 74 bb1b20d79acf
parent 73 0c03786ff927
child 78 e4d5907f5aaf
permissions -rw-r--r--
Marking the TODO for 0.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     1
#include <signal.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     2
#include <assert.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     3
#include <string.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     4
#include <sys/types.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     5
#include <sys/wait.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     6
#include <stdlib.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     7
#include <unistd.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     8
#include <stdio.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
     9
#include <sys/stat.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    10
#include <fcntl.h>
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    11
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    12
#include "main.h"
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    13
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    14
/* Returns the write pipe */
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    15
static int run_sendmail(const char *dest)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    16
{
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    17
    int pid;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    18
    int p[2];
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    19
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    20
    pipe(p);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    21
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    22
    pid = fork();
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    23
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    24
    switch(pid)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    25
    {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    26
        case 0: /* Child */
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    27
            close(0);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    28
            close(1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    29
            close(2);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    30
            dup2(p[0], 0);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    31
            execl("/usr/sbin/sendmail", "sendmail", "-oi", dest, NULL);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    32
            exit(-1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    33
        case -1:
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    34
            perror("fork sendmail");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    35
            exit(-1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    36
        default: /* Parent */
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    37
            ;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    38
    }
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    39
    return p[1];
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    40
}
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    41
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    42
static void write_header(int fd, const char *dest, const char * command,
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    43
        int jobid, int errorlevel)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    44
{
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    45
    FILE *f;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    46
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    47
    f = fdopen(fd, "a");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    48
    assert(f != NULL);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    49
73
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    50
    fprintf(f, "From: Task Spooler <taskspooler>\n");
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    51
    fprintf(f, "To: %s\n", dest);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    52
    fprintf(f, "Subject: the task %i finished with error %i. \n", jobid,
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    53
            errorlevel);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    54
    fprintf(f, "\nCommand: %s\n", command);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    55
    fprintf(f, "Output:\n");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    56
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    57
    fflush(f);
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);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    68
    assert(file_fd != -1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    69
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    70
    do {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    71
        read_bytes = read(file_fd, buffer, 1000);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    72
        if (read_bytes > 0)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    73
        {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    74
            res = write(write_fd, buffer, read_bytes);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    75
            assert(res != -1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    76
        }
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    77
    } while (read_bytes > 0);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    78
    assert(read_bytes != -1);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    79
}
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
    80
73
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    81
void hook_on_finish(int jobid, int errorlevel, const char *ofname,
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    82
    const char *command)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    83
{
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    84
    char *onfinish;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    85
    int pid;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    86
    char sjobid[20];
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    87
    char serrorlevel[20];
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    88
    int status;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    89
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    90
    onfinish = getenv("TS_ONFINISH");
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    91
    if (onfinish == NULL)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    92
        return;
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    93
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    94
    pid = fork();
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    95
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    96
    switch(pid)
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    97
    {
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    98
        case 0: /* Child */
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
    99
            sprintf(sjobid, "%i", jobid);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   100
            sprintf(serrorlevel, "%i", errorlevel);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   101
            execlp(onfinish, onfinish, sjobid, serrorlevel, ofname, command,
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   102
                    NULL);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   103
            exit(-1);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   104
        case -1:
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   105
            perror("fork on finish");
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   106
            exit(-1);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   107
        default: /* Parent */
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   108
            wait(&status);
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   109
    }
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   110
}
0c03786ff927 Added TS_ONFINISH.
viric@llimona
parents: 72
diff changeset
   111
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   112
void send_mail(int jobid, int errorlevel, const char *ofname,
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   113
    const char *command)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   114
{
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   115
    char to[101];
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   116
    char *user;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   117
    char *env_to;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   118
    int write_fd;
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   119
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   120
    env_to = getenv("TS_MAILTO");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   121
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   122
    if (env_to == NULL || strlen(env_to) > 100)
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   123
    {
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   124
        user = getenv("USER");
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   125
        if (user == NULL)
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   126
            user = "nobody";
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   127
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   128
        strcpy(to, user);
72
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   129
        /*strcat(to, "@localhost");*/
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   130
    } else
a85ae716659c Fixed a bug in the mailer.
viric@llimona
parents: 71
diff changeset
   131
        strcpy(to, env_to);
71
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   132
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   133
    write_fd = run_sendmail(to);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   134
    write_header(write_fd, to, command, jobid, errorlevel);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   135
    copy_output(write_fd, ofname);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   136
    close(write_fd);
531666e297d7 Send e-letter implemented.
viric@llimona
parents:
diff changeset
   137
}