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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     1
#include <unistd.h>
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
     2
#include <assert.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     3
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     4
#include <stdio.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     5
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
     6
#include "main.h"
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
     7
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     8
extern char *optarg;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     9
extern int optind, opterr, optopt;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    10
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    11
int kill_server = 0;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    12
int need_server = 0;
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    13
int clear_finished = 0;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    14
int list_jobs = 0;
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
    15
int store_output = 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    16
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    17
int server_socket;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    18
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    19
/* Allocated in get_command() */
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    20
char *new_command;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    21
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    22
void get_command(int index, int argc, char **argv)
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    23
{
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    24
    int size;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    25
    int i;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    26
    
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    27
    size = 0;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    28
    /* Count bytes needed */
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    29
    for (i = index; i < argc; ++i)
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    30
    {
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    31
        /* The '1' is for spaces, and at the last i,
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    32
         * for the null character */
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    33
        size = size + strlen(argv[i]) + 1;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    34
    }
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    35
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    36
    /* Alloc */
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    37
    new_command = malloc(size);
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    38
    assert(new_command != NULL);
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    39
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    40
    /* Build the command */
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    41
    strcpy(new_command, argv[index]);
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    42
    for (i = index+1; i < argc; ++i)
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    43
    {
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    44
        strcat(new_command, " ");
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    45
        strcat(new_command, argv[i]);
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    46
    }
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    47
}
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    48
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    49
void parse_opts(int argc, char **argv)
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    50
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    51
    int c;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    52
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    53
    /* Parse options */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    54
    while(1) {
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
    55
        c = getopt(argc, argv, "klcn");
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    56
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    57
        if (c == -1)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    58
            break;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    59
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    60
        switch(c)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    61
        {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    62
            case 'k':
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    63
                kill_server = 1;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    64
                break;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    65
            case 'l':
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    66
                list_jobs = 1;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    67
                break;
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    68
            case 'c':
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    69
                clear_finished = 1;
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    70
                break;
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
    71
            case 'n':
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
    72
                store_output = 0;
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
    73
                break;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    74
        }
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    75
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    76
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    77
    new_command = 0;
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    78
16
4557c8844e5d Fixed -l.
viric@mandarina
parents: 15
diff changeset
    79
    if (optind < argc)
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
    80
        get_command(optind, argc, argv);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    81
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    82
    if (list_jobs || kill_server || (new_command != 0)
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
    83
            || clear_finished)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    84
        need_server = 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    85
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    86
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    87
static int go_background()
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    88
{
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    89
    int pid;
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    90
    pid = fork();
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    91
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    92
    switch(pid)
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    93
    {
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    94
        case -1:
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    95
            perror("fork failed");
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    96
            exit(-1);
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    97
            break;
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    98
        case 0:
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
    99
            break;
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   100
        default:
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   101
            exit(0);
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   102
    }
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   103
}
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   104
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   105
int main(int argc, char **argv)
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   106
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   107
    parse_opts(argc, argv);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   108
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   109
    if (need_server)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   110
        ensure_server_up();
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   111
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
   112
    if (new_command != 0)
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   113
    {
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   114
        go_background();
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   115
        assert(need_server);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   116
        c_new_job(new_command);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   117
        c_wait_server_commands(new_command, store_output);
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 16
diff changeset
   118
        free(new_command);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   119
    }
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   120
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   121
    if (list_jobs != 0)
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
   122
    {
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   123
        assert(need_server);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   124
        c_list_jobs();
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
   125
        c_wait_server_lines();
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
   126
    }
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   127
    
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   128
    if (kill_server)
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   129
    {
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   130
        assert(need_server);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   131
        c_shutdown_server();
11
bb94b9890001 Going to background at for new command queued.
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   132
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   133
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   134
    if (clear_finished)
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   135
    {
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   136
        assert(need_server);
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   137
        c_clear_finished();
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   138
    }
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 18
diff changeset
   139
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   140
    if (need_server)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   141
    {
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   142
        close(server_socket);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   143
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   144
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   145
    return 0;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   146
}