main.c
author viric@llimona
Sun, 25 Mar 2007 04:55:18 +0200
changeset 23 96fcebb68510
parent 22 afdc8410633f
child 27 886bdb2f4632
permissions -rw-r--r--
More TODO for the next versions.

#include <unistd.h>
#include <assert.h>

#include <stdio.h>

#include "main.h"

extern char *optarg;
extern int optind, opterr, optopt;

int kill_server = 0;
int need_server = 0;
int clear_finished = 0;
int list_jobs = 0;
int store_output = 1;

int server_socket;

/* Allocated in get_command() */
char *new_command;

void get_command(int index, int argc, char **argv)
{
    int size;
    int i;
    
    size = 0;
    /* Count bytes needed */
    for (i = index; i < argc; ++i)
    {
        /* The '1' is for spaces, and at the last i,
         * for the null character */
        size = size + strlen(argv[i]) + 1;
    }

    /* Alloc */
    new_command = malloc(size);
    assert(new_command != NULL);

    /* Build the command */
    strcpy(new_command, argv[index]);
    for (i = index+1; i < argc; ++i)
    {
        strcat(new_command, " ");
        strcat(new_command, argv[i]);
    }
}

void parse_opts(int argc, char **argv)
{
    int c;

    /* Parse options */
    while(1) {
        c = getopt(argc, argv, "klcn");

        if (c == -1)
            break;

        switch(c)
        {
            case 'k':
                kill_server = 1;
                break;
            case 'l':
                list_jobs = 1;
                break;
            case 'c':
                clear_finished = 1;
                break;
            case 'n':
                store_output = 0;
                break;
        }
    }

    new_command = 0;

    if (optind < argc)
        get_command(optind, argc, argv);

    if (list_jobs || kill_server || (new_command != 0)
            || clear_finished)
        need_server = 1;
}

static int go_background()
{
    int pid;
    pid = fork();

    switch(pid)
    {
        case -1:
            perror("fork failed");
            exit(-1);
            break;
        case 0:
            break;
        default:
            exit(0);
    }
}

int main(int argc, char **argv)
{
    parse_opts(argc, argv);

    if (need_server)
        ensure_server_up();

    if (new_command != 0)
    {
        go_background();
        assert(need_server);
        c_new_job(new_command);
        c_wait_server_commands(new_command, store_output);
        free(new_command);
    }

    if (list_jobs != 0)
    {
        assert(need_server);
        c_list_jobs();
        c_wait_server_lines();
    }
    
    if (kill_server)
    {
        assert(need_server);
        c_shutdown_server();
    }

    if (clear_finished)
    {
        assert(need_server);
        c_clear_finished();
    }

    if (need_server)
    {
        close(server_socket);
    }

    return 0;
}