server.c
author viric@llimona
Mon, 02 Apr 2007 17:53:52 +0200
changeset 74 bb1b20d79acf
parent 66 f70a27afd92e
child 92 05004c52ecff
permissions -rw-r--r--
Marking the TODO for 0.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     1
/*
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     2
    Task Spooler - a task queue system for the unix user
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     4
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     5
    Please find the license in the provided COPYING file.
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 45
diff changeset
     6
*/
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     7
#include <assert.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     8
#include <sys/types.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     9
#include <sys/socket.h>
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
    10
#include <sys/select.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    11
#include <sys/un.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    12
#include <errno.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    13
#include <string.h>
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    14
#include <stdlib.h>
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
    15
#include <unistd.h>
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
#include <stdio.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    18
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    19
#include "msg.h"
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    20
#include "main.h"
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    21
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    22
enum
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    23
{
64
2a17c9c7b1d5 Added a limit to the number of finished jobs.
viric@llimona
parents: 63
diff changeset
    24
    MAXCONN=1000
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    25
};
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    26
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    27
enum Break
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    28
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    29
    BREAK,
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    30
    NOBREAK
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    31
};
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    32
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    33
/* Prototypes */
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    34
static void server_loop(int ls);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    35
static enum Break
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    36
    client_read(int index);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    37
static void end_server(int ls);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    38
static void s_newjob_ok(int index);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    39
static void s_runjob(int index);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    40
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    41
struct Client_conn
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    42
{
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    43
    int socket;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    44
    int hasjob;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    45
    int jobid;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    46
};
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    47
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    48
/* Globals */
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    49
static struct Client_conn client_cs[MAXCONN];
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    50
static int nconnections;
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    51
static char *path;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    52
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    53
void server_main(int notify_fd, char *_path)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    54
{
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
    55
    int ls;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    56
    struct sockaddr_un addr;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    57
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    58
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    59
    path = _path;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    60
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    61
    nconnections = 0;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    62
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    63
    ls = socket(PF_UNIX, SOCK_STREAM, 0);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    64
    assert(ls != -1);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    65
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    66
    addr.sun_family = AF_UNIX;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    67
    strcpy(addr.sun_path, path);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    68
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    69
    res = bind(ls, (struct sockaddr *) &addr, sizeof(addr));
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    70
    if (res == -1)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    71
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    72
        perror("Error binding.");
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    73
        return;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    74
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    75
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    76
    res = listen(ls, 0);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    77
    if (res == -1)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    78
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    79
        perror("Error listening.");
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    80
        return;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    81
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    82
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 22
diff changeset
    83
    notify_parent(notify_fd);
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 22
diff changeset
    84
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    85
    server_loop(ls);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    86
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    87
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    88
static int get_conn_of_jobid(int jobid)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    89
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    90
    int i;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    91
    for(i=0; i< nconnections; ++i)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    92
        if (client_cs[i].hasjob && client_cs[i].jobid == jobid)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    93
            return i;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    94
    return -1;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    95
}
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    96
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    97
static void server_loop(int ls)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    98
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    99
    fd_set readset;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   100
    int i;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   101
    int maxfd;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   102
    int keep_loop = 1;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   103
    int newjob;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   104
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   105
    while (keep_loop)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   106
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   107
        FD_ZERO(&readset);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   108
        FD_SET(ls,&readset);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   109
        maxfd = ls;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   110
        for(i=0; i< nconnections; ++i)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   111
        {
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   112
            FD_SET(client_cs[i].socket, &readset);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   113
            if (client_cs[i].socket > maxfd)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   114
                maxfd = client_cs[i].socket;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   115
        }
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   116
        select(maxfd + 1, &readset, NULL, NULL, NULL);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   117
        if (FD_ISSET(ls,&readset))
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   118
        {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   119
            int cs;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   120
            cs = accept(ls, NULL, NULL);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   121
            assert(cs != -1);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   122
            client_cs[nconnections++].socket = cs;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   123
        }
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   124
        for(i=0; i< nconnections; ++i)
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   125
            if (FD_ISSET(client_cs[i].socket, &readset))
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   126
            {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   127
                enum Break b;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   128
                b = client_read(i);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   129
                /* Check if we should break */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   130
                if (b == BREAK)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   131
                    keep_loop = 0;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   132
            }
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   133
        /* This will return firstjob->jobid or -1 */
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   134
        newjob = next_run_job();
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   135
        if (newjob != -1)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   136
        {
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   137
            int conn;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   138
            conn = get_conn_of_jobid(newjob);
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   139
            /* This next marks the firstjob state to RUNNING */
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   140
            s_mark_job_running();
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   141
            s_runjob(conn);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   142
        }
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
    end_server(ls);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   146
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   147
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   148
static void end_server(int ls)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   149
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   150
    close(ls);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   151
    unlink(path);
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   152
    /* This comes from the parent, in the fork after server_main.
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   153
     * This is the last use of path in this process.*/
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   154
    free(path); 
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   155
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   156
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   157
static void remove_connection(int index)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   158
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   159
    int i;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   160
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   161
    if(client_cs[index].hasjob)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   162
    {
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   163
        s_removejob(client_cs[index].jobid);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   164
    }
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   165
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   166
    for(i=index; i<(nconnections-1); ++i)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   167
    {
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   168
        memcpy(&client_cs[i], &client_cs[i+1], sizeof(client_cs[0]));
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   169
    }
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   170
    nconnections--;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   171
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   172
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   173
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   174
static enum Break
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   175
    client_read(int index)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   176
{
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   177
    struct msg m;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   178
    int s;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   179
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   180
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   181
    s = client_cs[index].socket;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   182
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   183
    /* Read the message */
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   184
    res = recv(s, &m, sizeof(m),0);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   185
    if (res == -1)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   186
    {
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   187
        fprintf(stderr, "Error reading from client %i, socket %i\n",
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   188
                index, s);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   189
        perror("client read");
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   190
        exit(-1);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   191
    }
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   192
    if (res == 0)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   193
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   194
        close(s);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   195
        remove_connection(index);
45
3578632feaac Fixed a bug in notify-list.
viric@llimona
parents: 44
diff changeset
   196
        /* It will not fail, even if the index is not a notification */
3578632feaac Fixed a bug in notify-list.
viric@llimona
parents: 44
diff changeset
   197
        s_remove_notification(index);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   198
        return NOBREAK;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   199
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   200
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   201
    client_cs[index].hasjob = 0;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   202
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   203
    /* Process message */
31
1a6c732b0b71 The command line parsing has been simplified.
viric@llimona
parents: 28
diff changeset
   204
    if (m.type == KILL_SERVER)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   205
        return BREAK; /* break in the parent*/
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   206
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   207
    if (m.type == NEWJOB)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   208
    {
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 9
diff changeset
   209
        client_cs[index].jobid = s_newjob(s, &m);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   210
        client_cs[index].hasjob = 1;
4
viric@llimona
parents: 3
diff changeset
   211
        s_newjob_ok(index);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   212
    }
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   213
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   214
    if (m.type == RUNJOB_OK)
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   215
    {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   216
        char *buffer = 0;
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   217
        if (m.u.output.store_output)
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   218
        {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   219
            /* Receive the output filename */
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   220
            buffer = (char *) malloc(m.u.output.ofilename_size);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   221
            res = recv_bytes(client_cs[index].socket, buffer,
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   222
                m.u.output.ofilename_size);
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   223
            assert(res == m.u.output.ofilename_size);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   224
        }
35
83d0da612dc4 Kill the running job works fine.
viric@llimona
parents: 32
diff changeset
   225
        s_process_runjob_ok(client_cs[index].jobid, buffer,
83d0da612dc4 Kill the running job works fine.
viric@llimona
parents: 32
diff changeset
   226
                m.u.output.pid);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   227
    }
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   228
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   229
    if (m.type == LIST)
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   230
    {
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   231
        s_list(client_cs[index].socket);
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   232
        /* We must actively close, meaning End of Lines */
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   233
        close(client_cs[index].socket);
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   234
        remove_connection(index);
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   235
    }
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   236
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   237
    if (m.type == ENDJOB)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   238
    {
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   239
        job_finished(m.u.errorlevel);
42
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   240
        check_notify_list(client_cs[index].jobid);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   241
    }
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   242
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   243
    if (m.type == CLEAR_FINISHED)
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   244
    {
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   245
        s_clear_finished();
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   246
    }
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   247
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   248
    if (m.type == ASK_OUTPUT)
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   249
    {
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   250
        s_send_output(client_cs[index].socket, m.u.jobid);
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   251
    }
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   252
41
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   253
    if (m.type == REMOVEJOB)
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   254
    {
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   255
        s_remove_job(client_cs[index].socket, m.u.jobid);
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   256
    }
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   257
42
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   258
    if (m.type == WAITJOB)
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   259
    {
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   260
        s_wait_job(client_cs[index].socket, m.u.jobid);
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   261
    }
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   262
53
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   263
    if (m.type == URGENT)
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   264
    {
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   265
        s_move_urgent(client_cs[index].socket, m.u.jobid);
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   266
    }
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   267
66
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   268
    if (m.type == SWAP_JOBS)
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   269
    {
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   270
        s_swap_jobs(client_cs[index].socket, m.u.swap.jobid1,
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   271
                m.u.swap.jobid2);
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   272
    }
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   273
63
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   274
    if (m.type == GET_STATE)
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   275
    {
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   276
        s_send_state(client_cs[index].socket, m.u.jobid);
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   277
    }
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   278
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   279
    return NOBREAK; /* normal */
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   280
}
4
viric@llimona
parents: 3
diff changeset
   281
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   282
static void s_runjob(int index)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   283
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   284
    int s;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   285
    struct msg m;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   286
    int res;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   287
    
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   288
    assert(client_cs[index].hasjob);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   289
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   290
    s = client_cs[index].socket;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   291
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   292
    m.type = RUNJOB;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   293
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   294
    res = send(s, &m, sizeof(m), 0);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   295
    if(res == -1)
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   296
        perror("send");
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   297
}
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   298
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   299
static void s_newjob_ok(int index)
4
viric@llimona
parents: 3
diff changeset
   300
{
viric@llimona
parents: 3
diff changeset
   301
    int s;
viric@llimona
parents: 3
diff changeset
   302
    struct msg m;
viric@llimona
parents: 3
diff changeset
   303
    int res;
viric@llimona
parents: 3
diff changeset
   304
    
viric@llimona
parents: 3
diff changeset
   305
    assert(client_cs[index].hasjob);
viric@llimona
parents: 3
diff changeset
   306
viric@llimona
parents: 3
diff changeset
   307
    s = client_cs[index].socket;
viric@llimona
parents: 3
diff changeset
   308
viric@llimona
parents: 3
diff changeset
   309
    m.type = NEWJOB_OK;
viric@llimona
parents: 3
diff changeset
   310
    m.u.jobid = client_cs[index].jobid;
viric@llimona
parents: 3
diff changeset
   311
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   312
    res = send(s, &m, sizeof(m), 0);
4
viric@llimona
parents: 3
diff changeset
   313
    if(res == -1)
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   314
        perror("send");
4
viric@llimona
parents: 3
diff changeset
   315
}