env.c
author viric <viriketo@gmail.com>
Mon, 18 Jul 2011 22:48:54 +0200
branchqueuelimit
changeset 293 bb87d5e7c466
parent 267 11631dd11ff8
child 345 c8fd555369d1
permissions -rw-r--r--
Closing this branch, where I wrote bad code about adding the proper handling of queue limits by blocking clients.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
165
7b914d4003c2 Fixing licenses in some files, and updating some documents.
viric@mandarina
parents: 147
diff changeset
     1
/*
7b914d4003c2 Fixing licenses in some files, and updating some documents.
viric@mandarina
parents: 147
diff changeset
     2
    Task Spooler - a task queue system for the unix user
267
11631dd11ff8 Updating copyright years in the source.
viric@mandarina
parents: 231
diff changeset
     3
    Copyright (C) 2007-2009  LluĂ­s Batlle i Rossell
165
7b914d4003c2 Fixing licenses in some files, and updating some documents.
viric@mandarina
parents: 147
diff changeset
     4
7b914d4003c2 Fixing licenses in some files, and updating some documents.
viric@mandarina
parents: 147
diff changeset
     5
    Please find the license in the provided COPYING file.
7b914d4003c2 Fixing licenses in some files, and updating some documents.
viric@mandarina
parents: 147
diff changeset
     6
*/
147
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
     7
#include <stdio.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
     8
#include <sys/time.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
     9
#include <sys/types.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    10
#include <sys/wait.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    11
#include <unistd.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    12
#include <signal.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    13
#include <fcntl.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    14
#include <stdlib.h>
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    15
#include "main.h"
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    16
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    17
static int fork_command(const char *command)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    18
{
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    19
    int pid;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    20
    int p[2];
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    21
    int fdnull;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    22
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    23
    fdnull = open("/dev/null", O_RDONLY);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    24
    if (fdnull == -1) error("Cannot open /dev/null");
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    25
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    26
    pipe(p);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    27
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    28
    pid = fork();
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    29
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    30
    switch(pid)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    31
    {
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    32
        case 0:
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    33
            restore_sigmask();
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    34
            close(server_socket);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    35
            dup2(fdnull, 0);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    36
            if (fdnull != 0)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    37
                close(fdnull);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    38
            dup2(p[1], 1);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    39
            dup2(p[1], 2);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    40
            if (p[1] != 1 && p[1] != 2)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    41
                close(p[1]);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    42
            close(p[0]);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    43
            execlp("/bin/sh", "/bin/sh", "-c", command, 0);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    44
            error("/bin/sh exec error");
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    45
        case -1:
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    46
            error("Fork error");
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    47
        default:
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    48
            close(p[1]);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    49
    }
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    50
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    51
    return p[0];
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    52
}
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    53
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    54
char * get_environment()
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    55
{
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    56
    char *ptr;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    57
    char *command;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    58
    int readfd;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    59
    int bytes = 0;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    60
    int alloc = 0;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    61
    
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    62
    command = getenv("TS_ENV");
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    63
    if (command == 0)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    64
        return 0;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    65
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    66
    readfd = fork_command(command);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    67
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    68
    ptr = 0;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    69
    do
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    70
    {
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    71
        int next;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    72
        int res;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    73
        next = bytes + 1000;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    74
        if (next > alloc)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    75
        {
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    76
            ptr = realloc(ptr, next);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    77
            alloc = next;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    78
        }
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    79
        res = read(readfd, ptr + bytes, 1000);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    80
        if (res < 0)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    81
            error("Cannot read from the TS_ENV command (%s)", command);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    82
        else if (res == 0)
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    83
            break;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    84
        else
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    85
            bytes += res;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    86
    } while(1);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    87
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    88
    /* We will always have 1000 bytes more to be written, on end.
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    89
     * We add a null for it to be an ASCIIZ string. */
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    90
    ptr[bytes] = '\0';
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    91
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    92
    close(readfd);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    93
    wait(0);
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    94
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    95
    return ptr;
e173645f5221 Added environment info through TS_ENV
viric@llimona
parents:
diff changeset
    96
}