server.c
author viric@mandarina
Mon, 05 May 2008 23:14:22 +0200
changeset 216 b4476e12a717
parent 178 5b64d66a8d89
child 218 f084c8de313f
permissions -rw-r--r--
Moving versions to 0.5.4.1 for debianers.
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 <sys/types.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     8
#include <sys/socket.h>
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
     9
#include <sys/select.h>
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
    10
#ifdef linux
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
    11
  #include <sys/time.h>
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
    12
#endif
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    13
#include <sys/resource.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    14
#include <sys/un.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    15
#include <errno.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    16
#include <string.h>
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    17
#include <stdlib.h>
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
    18
#include <unistd.h>
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    19
#include <limits.h>
99
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    20
#include <signal.h>
120
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    21
#include <fcntl.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    22
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    23
#include <stdio.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    24
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    25
#include "main.h"
1
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
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    28
{
64
2a17c9c7b1d5 Added a limit to the number of finished jobs.
viric@llimona
parents: 63
diff changeset
    29
    MAXCONN=1000
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    30
};
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    31
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    32
enum Break
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    33
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    34
    BREAK,
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    35
    NOBREAK
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    36
};
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    37
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    38
/* Prototypes */
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    39
static void server_loop(int ls);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    40
static enum Break
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    41
    client_read(int index);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    42
static void end_server(int ls);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    43
static void s_newjob_ok(int index);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    44
static void s_runjob(int index);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    45
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    46
struct Client_conn
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    47
{
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    48
    int socket;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    49
    int hasjob;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    50
    int jobid;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    51
};
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    52
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    53
/* Globals */
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    54
static struct Client_conn client_cs[MAXCONN];
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    55
static int nconnections;
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
    56
static char *path;
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    57
static int max_descriptors;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    58
155
55515f9eac77 Added 'depend' -d
viric@vicerveza
parents: 146
diff changeset
    59
/* For dependencies between tasks */
55515f9eac77 Added 'depend' -d
viric@vicerveza
parents: 146
diff changeset
    60
static int last_errorlevel = 0;
55515f9eac77 Added 'depend' -d
viric@vicerveza
parents: 146
diff changeset
    61
99
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    62
static void sigterm_handler(int n)
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    63
{
120
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    64
    const char *dumpfilename;
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    65
    int fd;
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    66
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    67
    /* Dump the job list if we should to */
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    68
    dumpfilename = getenv("TS_SAVELIST");
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    69
    if (dumpfilename != NULL)
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    70
    {
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    71
        fd = open(dumpfilename, O_WRONLY | O_APPEND | O_CREAT, 0600);
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    72
        if (fd != -1)
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    73
        {
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    74
            joblist_dump(fd);
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    75
            close(fd);
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    76
        } else
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    77
            warning("The TS_SAVELIST file \"%s\" cannot be opened",
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    78
                    dumpfilename);
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    79
    }
790bc4cecd3b Added TS_SAVELIST.
viric@llimona
parents: 117
diff changeset
    80
99
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    81
    /* path will be initialized for sure, before installing the handler */
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    82
    unlink(path);
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    83
    exit(1);
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    84
}
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    85
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    86
static void install_sigterm_handler()
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    87
{
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    88
  struct sigaction act;
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    89
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    90
  act.sa_handler = sigterm_handler;
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    91
  /* Reset the mask */
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    92
  memset(&act.sa_mask,0,sizeof(act.sa_mask));
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    93
  act.sa_flags = 0;
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    94
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    95
  sigaction(SIGTERM, &act, NULL);
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    96
}
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
    97
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    98
static int get_max_descriptors()
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
    99
{
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   100
    const int MARGIN = 5; /* stdin, stderr, listen socket, and whatever */
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   101
    int max;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   102
    struct rlimit rlim;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   103
    int res;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   104
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   105
    max = MAXCONN;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   106
    if (max > FD_SETSIZE)
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   107
        max = FD_SETSIZE;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   108
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   109
    /* I'd like to use OPEN_MAX or NR_OPEN, but I don't know if any
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   110
     * of them is POSIX compliant */
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   111
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   112
    res = getrlimit(RLIMIT_NOFILE, &rlim);
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   113
    if (res != 0)
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   114
        warning("getrlimit for open files");
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   115
    else
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   116
    {
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   117
        if (max > rlim.rlim_cur)
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   118
            max = rlim.rlim_cur;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   119
    }
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   120
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   121
    if (max - MARGIN < 1)
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   122
        error("Too few opened descriptors available");
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   123
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   124
    return max - MARGIN;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   125
}
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   126
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   127
void server_main(int notify_fd, char *_path)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   128
{
44
4dcf05746ece Better include files.
viric@llimona
parents: 42
diff changeset
   129
    int ls;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   130
    struct sockaddr_un addr;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   131
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   132
104
dc4dd9939238 Fixed error reporting.
viric@llimona
parents: 99
diff changeset
   133
    process_type = SERVER;
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   134
    max_descriptors = get_max_descriptors();
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   135
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   136
    path = _path;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   137
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   138
    nconnections = 0;
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   139
129
312083fb8899 Change PF_UNIX to AF_UNIX. According to socket(2), this is better.
viric@llimona
parents: 120
diff changeset
   140
    ls = socket(AF_UNIX, SOCK_STREAM, 0);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   141
    if(ls == -1)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   142
        error("cannot create the listen socket in the server");
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   143
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   144
    addr.sun_family = AF_UNIX;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   145
    strcpy(addr.sun_path, path);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   146
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   147
    res = bind(ls, (struct sockaddr *) &addr, sizeof(addr));
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   148
    if (res == -1)
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   149
        error("Error binding.");
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   150
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   151
    res = listen(ls, 0);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   152
    if (res == -1)
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   153
        error("Error listening.");
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   154
99
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
   155
    install_sigterm_handler();
88d96be4e0e9 Never leave the socket if the server dies by SIGTERM.
viric@llimona
parents: 94
diff changeset
   156
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 22
diff changeset
   157
    notify_parent(notify_fd);
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 22
diff changeset
   158
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   159
    server_loop(ls);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   160
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   161
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   162
static int get_conn_of_jobid(int jobid)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   163
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   164
    int i;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   165
    for(i=0; i< nconnections; ++i)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   166
        if (client_cs[i].hasjob && client_cs[i].jobid == jobid)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   167
            return i;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   168
    return -1;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   169
}
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   170
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   171
static void server_loop(int ls)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   172
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   173
    fd_set readset;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   174
    int i;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   175
    int maxfd;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   176
    int keep_loop = 1;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   177
    int newjob;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   178
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   179
    while (keep_loop)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   180
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   181
        FD_ZERO(&readset);
94
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   182
        maxfd = 0;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   183
        /* If we can accept more connections, go on.
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   184
         * Otherwise, the system block them (no accept will be done). */
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   185
        if (nconnections < max_descriptors)
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   186
        {
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   187
            FD_SET(ls,&readset);
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   188
            maxfd = ls;
aefdd4d9cbab Server won't die for out of handles.
viric@llimona
parents: 92
diff changeset
   189
        }
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   190
        for(i=0; i< nconnections; ++i)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   191
        {
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   192
            FD_SET(client_cs[i].socket, &readset);
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   193
            if (client_cs[i].socket > maxfd)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   194
                maxfd = client_cs[i].socket;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   195
        }
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   196
        select(maxfd + 1, &readset, NULL, NULL, NULL);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   197
        if (FD_ISSET(ls,&readset))
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   198
        {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   199
            int cs;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   200
            cs = accept(ls, NULL, NULL);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   201
            if (cs == -1)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   202
                error("Accepting from %i", ls);
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   203
            client_cs[nconnections].hasjob = 0;
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   204
            client_cs[nconnections].socket = cs;
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   205
            ++nconnections;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   206
        }
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   207
        for(i=0; i< nconnections; ++i)
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   208
            if (FD_ISSET(client_cs[i].socket, &readset))
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   209
            {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   210
                enum Break b;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   211
                b = client_read(i);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   212
                /* Check if we should break */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   213
                if (b == BREAK)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   214
                    keep_loop = 0;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   215
            }
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   216
        /* This will return firstjob->jobid or -1 */
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   217
        newjob = next_run_job();
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   218
        if (newjob != -1)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   219
        {
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   220
            int conn;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   221
            conn = get_conn_of_jobid(newjob);
19
5efc347cca8d The finished jobs store the errorlevel, and can be listed.
viric@llimona
parents: 18
diff changeset
   222
            /* 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
   223
            s_mark_job_running();
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   224
            s_runjob(conn);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   225
        }
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   226
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   227
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   228
    end_server(ls);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   229
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   230
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   231
static void end_server(int ls)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   232
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   233
    close(ls);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   234
    unlink(path);
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 26
diff changeset
   235
    /* 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
   236
     * 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
   237
    free(path); 
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   238
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   239
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   240
static void remove_connection(int index)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   241
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   242
    int i;
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   243
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   244
    if(client_cs[index].hasjob)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   245
    {
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   246
        s_removejob(client_cs[index].jobid);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   247
    }
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   248
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   249
    for(i=index; i<(nconnections-1); ++i)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   250
    {
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   251
        memcpy(&client_cs[i], &client_cs[i+1], sizeof(client_cs[0]));
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   252
    }
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   253
    nconnections--;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   254
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   255
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   256
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   257
static enum Break
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   258
    client_read(int index)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   259
{
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   260
    struct msg m;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   261
    int s;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   262
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   263
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   264
    s = client_cs[index].socket;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   265
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   266
    /* Read the message */
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   267
    res = recv_msg(s, &m);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   268
    if (res == -1)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   269
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   270
        warning("client recv failed");
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   271
        close(s);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   272
        remove_connection(index);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   273
        /* It will not fail, even if the index is not a notification */
176
306890eeeffa Fixing a bug on s_remove_job, related to -w and dying with signals
viric@llimona
parents: 156
diff changeset
   274
        s_remove_notification(s);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   275
        return NOBREAK;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   276
    }
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   277
    else if (res == 0)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   278
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   279
        close(s);
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   280
        /* TODO: if the client dies while its job is running, someone may prefer
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   281
         * to note the job as finished with an error. Now we simply remove
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   282
         * it from the queue. */
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   283
        remove_connection(index);
45
3578632feaac Fixed a bug in notify-list.
viric@llimona
parents: 44
diff changeset
   284
        /* It will not fail, even if the index is not a notification */
176
306890eeeffa Fixing a bug on s_remove_job, related to -w and dying with signals
viric@llimona
parents: 156
diff changeset
   285
        s_remove_notification(s);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   286
        return NOBREAK;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   287
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   288
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   289
    /* Process message */
31
1a6c732b0b71 The command line parsing has been simplified.
viric@llimona
parents: 28
diff changeset
   290
    if (m.type == KILL_SERVER)
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   291
        return BREAK; /* break in the parent*/
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   292
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   293
    if (m.type == NEWJOB)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   294
    {
18
af4898956964 Now commands of any-length are accepted.
viric@llimona
parents: 9
diff changeset
   295
        client_cs[index].jobid = s_newjob(s, &m);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   296
        client_cs[index].hasjob = 1;
4
viric@llimona
parents: 3
diff changeset
   297
        s_newjob_ok(index);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   298
    }
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   299
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   300
    if (m.type == RUNJOB_OK)
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   301
    {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   302
        char *buffer = 0;
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   303
        if (m.u.output.store_output)
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   304
        {
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   305
            /* Receive the output filename */
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   306
            buffer = (char *) malloc(m.u.output.ofilename_size);
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   307
            res = recv_bytes(s, buffer,
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   308
                m.u.output.ofilename_size);
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   309
            if (res != m.u.output.ofilename_size)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   310
                error("Reading the ofilename");
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   311
        }
35
83d0da612dc4 Kill the running job works fine.
viric@llimona
parents: 32
diff changeset
   312
        s_process_runjob_ok(client_cs[index].jobid, buffer,
83d0da612dc4 Kill the running job works fine.
viric@llimona
parents: 32
diff changeset
   313
                m.u.output.pid);
22
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   314
    }
afdc8410633f Now output can go to filenames.
viric@llimona
parents: 20
diff changeset
   315
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   316
    if (m.type == LIST)
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   317
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   318
        s_list(s);
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   319
        /* We must actively close, meaning End of Lines */
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   320
        close(s);
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   321
        remove_connection(index);
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 4
diff changeset
   322
    }
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   323
146
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   324
    if (m.type == INFO)
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   325
    {
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   326
        s_job_info(s, m.u.jobid);
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   327
        close(s);
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   328
        remove_connection(index);
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   329
    }
5e689cb593aa Bones of the "-i" parameter, job info.
viric@llimona
parents: 136
diff changeset
   330
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   331
    if (m.type == ENDJOB)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   332
    {
114
bd123730295d times() reporting finished.
viric@mandarina
parents: 110
diff changeset
   333
        job_finished(&m.u.result);
156
9ac3bd570159 Improved -d (depend) information.
viric@mandarina
parents: 155
diff changeset
   334
        /* For the dependencies */
9ac3bd570159 Improved -d (depend) information.
viric@mandarina
parents: 155
diff changeset
   335
        last_errorlevel = m.u.result.errorlevel;
42
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   336
        check_notify_list(client_cs[index].jobid);
136
cfc266aa8eb0 Fixed introduced bug on EOC from the client, because the server died.
viric@llimona
parents: 134
diff changeset
   337
        /* We don't want this connection to do anything
cfc266aa8eb0 Fixed introduced bug on EOC from the client, because the server died.
viric@llimona
parents: 134
diff changeset
   338
         * more related to the jobid, secially on remove_connection
cfc266aa8eb0 Fixed introduced bug on EOC from the client, because the server died.
viric@llimona
parents: 134
diff changeset
   339
         * when we receive the EOC. */
cfc266aa8eb0 Fixed introduced bug on EOC from the client, because the server died.
viric@llimona
parents: 134
diff changeset
   340
        client_cs[index].hasjob = 0;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   341
    }
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   342
20
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   343
    if (m.type == CLEAR_FINISHED)
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   344
    {
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   345
        s_clear_finished();
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   346
    }
d85b4c0745fa "-c" added, for clearing the finished tasks' list.
viric@llimona
parents: 19
diff changeset
   347
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   348
    if (m.type == ASK_OUTPUT)
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   349
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   350
        s_send_output(s, m.u.jobid);
32
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   351
    }
3531439f2770 Tail works.
viric@llimona
parents: 31
diff changeset
   352
41
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   353
    if (m.type == REMOVEJOB)
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   354
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   355
        int went_ok;
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   356
        went_ok = s_remove_job(s, m.u.jobid);
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   357
        if (went_ok)
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   358
        {
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   359
            int i;
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   360
            for(i = 0; i < nconnections; ++i)
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   361
            {
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   362
                if (client_cs[i].hasjob && client_cs[i].jobid == m.u.jobid)
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   363
                {
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   364
                    close(client_cs[i].socket);
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   365
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   366
                    /* So remove_connection doesn't call s_removejob again */
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   367
                    client_cs[i].hasjob = 0;
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   368
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   369
                    /* We don't try to remove any notification related to
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   370
                     * 'i', because it will be for sure a ts client for a job */
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   371
                    remove_connection(i);
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   372
                }
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   373
            }
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   374
        }
41
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   375
    }
cad41574feda Added 'remove job'.
viric@llimona
parents: 35
diff changeset
   376
42
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   377
    if (m.type == WAITJOB)
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   378
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   379
        s_wait_job(s, m.u.jobid);
42
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   380
    }
f093d0964cf5 Added wait for jobs.
viric@llimona
parents: 41
diff changeset
   381
53
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   382
    if (m.type == URGENT)
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   383
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   384
        s_move_urgent(s, m.u.jobid);
53
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   385
    }
731c41817842 '-u' (urgency) implemented.
viric@llimona
parents: 49
diff changeset
   386
66
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   387
    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
   388
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   389
        s_swap_jobs(s, m.u.swap.jobid1,
66
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   390
                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
   391
    }
f70a27afd92e Adding "swap jobs" with -U. Fixed a big problem with fds 0, 1, 2.
viric@mandarina
parents: 64
diff changeset
   392
63
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   393
    if (m.type == GET_STATE)
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   394
    {
134
5a6b8bb1f7a8 Fixing two bugs noted in buglist.bug (ts clients not dying on removejob, queue
viric@llimona
parents: 129
diff changeset
   395
        s_send_state(s, m.u.jobid);
63
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   396
    }
47be318f4cbc Added "-s" for querying the job state.
viric@llimona
parents: 53
diff changeset
   397
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   398
    return NOBREAK; /* normal */
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   399
}
4
viric@llimona
parents: 3
diff changeset
   400
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   401
static void s_runjob(int index)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   402
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   403
    int s;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   404
    struct msg m;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   405
    
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   406
    if (!client_cs[index].hasjob)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   407
        error("Run job of the client %i which doesn't have any job", index);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   408
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   409
    s = client_cs[index].socket;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   410
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   411
    m.type = RUNJOB;
155
55515f9eac77 Added 'depend' -d
viric@vicerveza
parents: 146
diff changeset
   412
    m.u.last_errorlevel = last_errorlevel;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   413
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   414
    send_msg(s, &m);
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   415
}
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   416
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   417
static void s_newjob_ok(int index)
4
viric@llimona
parents: 3
diff changeset
   418
{
viric@llimona
parents: 3
diff changeset
   419
    int s;
viric@llimona
parents: 3
diff changeset
   420
    struct msg m;
viric@llimona
parents: 3
diff changeset
   421
    
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   422
    if (!client_cs[index].hasjob)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   423
        error("Run job of the client %i which doesn't have any job", index);
4
viric@llimona
parents: 3
diff changeset
   424
viric@llimona
parents: 3
diff changeset
   425
    s = client_cs[index].socket;
viric@llimona
parents: 3
diff changeset
   426
viric@llimona
parents: 3
diff changeset
   427
    m.type = NEWJOB_OK;
viric@llimona
parents: 3
diff changeset
   428
    m.u.jobid = client_cs[index].jobid;
viric@llimona
parents: 3
diff changeset
   429
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   430
    send_msg(s, &m);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   431
}
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   432
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   433
static void dump_conn_struct(FILE *out, const struct Client_conn *p)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   434
{
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   435
    fprintf(out, "  new_conn\n");
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   436
    fprintf(out, "    socket %i\n", p->socket);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   437
    fprintf(out, "    hasjob \"%i\"\n", p->hasjob);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   438
    fprintf(out, "    jobid %i\n", p->jobid);
4
viric@llimona
parents: 3
diff changeset
   439
}
92
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   440
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   441
void dump_conns_struct(FILE *out)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   442
{
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   443
    int i;
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   444
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   445
    fprintf(out, "New_conns");
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   446
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   447
    for(i=0; i < nconnections; ++i)
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   448
    {
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   449
        dump_conn_struct(out, &client_cs[i]);
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   450
    }
05004c52ecff Better error reports on internal handled errors.
viric@llimona
parents: 66
diff changeset
   451
}