execute.c
author viric@llimona
Sun, 25 Mar 2007 04:55:18 +0200
changeset 23 96fcebb68510
parent 22 afdc8410633f
child 28 107abb4ec98a
permissions -rw-r--r--
More TODO for the next versions.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
     1
#include <unistd.h>
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
     2
#include <stdio.h>
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
     3
#include <stdlib.h>
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
     4
#include <signal.h>
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
     5
#include <assert.h>
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
     6
#include <sys/types.h>
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
     7
#include <sys/wait.h>
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
     8
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
     9
#include "msg.h"
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    10
#include "main.h"
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    11
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    12
static void program_signal();
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    13
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    14
/* Returns errorlevel */
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    15
static int run_parent(int store_output, int fd_read_filename)
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    16
{
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    17
    int status;
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    18
    int errorlevel;
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    19
    char *ofname = 0;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    20
    int namesize;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    21
    int res;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    23
    /* Read the filename */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    24
    /* This is linked with the write() in this same file, in run_child() */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    25
    if (store_output) {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    26
        res = read(fd_read_filename, &namesize, sizeof(namesize));
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    27
        if (res == -1)
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    28
        {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    29
            perror("read filename");
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    30
            exit(-1);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    31
        }
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    32
        assert(res == sizeof(namesize));
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    33
        ofname = (char *) malloc(namesize);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    34
        res = read(fd_read_filename, ofname, namesize);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    35
        assert(res == namesize);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    36
    }
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    37
    close(fd_read_filename);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    38
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    39
    c_send_runjob_ok(store_output, ofname);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    40
    free(ofname);
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    41
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    42
    wait(&status);
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    43
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    44
    if (WIFEXITED(status))
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    45
    {
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    46
        /* We force the proper cast */
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    47
        signed char tmp;
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    48
        tmp = WEXITSTATUS(status);
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    49
        errorlevel = tmp;
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    50
    } else
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    51
        return -1;
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    52
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    53
    return errorlevel;
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    54
};
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    55
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    56
static void run_child(const char *command, int store_output,
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    57
        int fd_send_filename)
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    58
{
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    59
    int p[2];
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    60
    char outfname[] = "/tmp/ts.XXXXXX";
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    61
    int namesize;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    62
    int outfd;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    63
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    64
    if (store_output)
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    65
    {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    66
        int res;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    67
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    68
        close(1); /* stdout */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    69
        close(2); /* stderr */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    70
        /* Prepare the filename */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    71
        outfd = mkstemp(outfname); /* stdout */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    72
        dup(outfd); /* stderr */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    73
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    74
        /* Send the filename */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    75
        namesize = sizeof(outfname);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    76
        res = write(fd_send_filename, (char *)&namesize, sizeof(namesize));
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    77
        write(fd_send_filename, outfname, sizeof(outfname));
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    78
    }
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    79
    close(fd_send_filename);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    80
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    81
    /* Closing input */
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 9
diff changeset
    82
    pipe(p);
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    83
    close(p[1]); /* closing the write handle */
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    84
    close(0);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    85
    dup(p[0]); /* the pipe reading goes to stdin */
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    86
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    87
    execlp("bash", "bash", "-c", command, NULL);
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    88
}
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    89
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    90
int run_job(const char *command, int store_output)
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    91
{
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    92
    int pid;
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
    93
    int errorlevel;
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
    94
    int p[2];
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    95
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
    96
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    97
    /* For the parent */
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    98
    /*program_signal(); Still not needed*/
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    99
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   100
    /* Prepare the output filename sending */
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   101
    pipe(p);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   102
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   103
    pid = fork();
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   104
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   105
    switch(pid)
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   106
    {
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   107
        case 0:
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   108
            close(server_socket);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   109
            close(p[0]);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   110
            run_child(command, store_output, p[1]);
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   111
            break;
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   112
        case -1:
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   113
            perror("Error in fork");
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   114
            exit(-1);
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   115
            ;
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   116
        default:
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   117
            close(p[1]);
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 19
diff changeset
   118
            errorlevel = run_parent(store_output, p[0]);
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   119
            break;
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   120
    }
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   121
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   122
    return errorlevel;
8
03339adb7014 Some more code for execution.
viric@llimona
parents:
diff changeset
   123
}
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   124
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   125
static void sigchld_handler(int val)
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   126
{
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   127
}
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   128
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   129
static void program_signal()
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   130
{
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   131
  struct sigaction act;
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   132
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   133
  act.sa_handler = sigchld_handler;
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   134
  /* Reset the mask */
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   135
  memset(&act.sa_mask,0,sizeof(act.sa_mask));
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   136
  act.sa_flags = SA_NOCLDSTOP;
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   137
  act.sa_restorer = NULL;
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   138
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   139
  sigaction(SIGCHLD, &act, NULL);
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   140
}