server_start.c
author viric@llimona
Tue, 27 Mar 2007 23:29:56 +0200
changeset 58 3c492266923e
parent 49 09bb8a5583e9
child 64 2a17c9c7b1d5
permissions -rw-r--r--
Preparing v0.2.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     1
/*
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     2
    Task Spooler - a task queue system for the unix user
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     4
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     5
    Please find the license in the provided COPYING file.
09bb8a5583e9 Added the license.
lbatlle@npdl268.bpo.hp.com
parents: 44
diff changeset
     6
*/
44
4dcf05746ece Better include files.
viric@llimona
parents: 28
diff changeset
     7
#include <unistd.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     8
#include <assert.h>
44
4dcf05746ece Better include files.
viric@llimona
parents: 28
diff changeset
     9
#include <string.h>
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    10
#include <sys/types.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    11
#include <sys/socket.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    12
#include <sys/un.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    13
#include <errno.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    14
#include <stdlib.h>
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    15
#include <stdio.h>
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    16
#include <signal.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    17
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    18
#include "main.h"
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    19
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    20
extern int server_socket;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    21
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    22
static char *path;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    23
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    24
static int fork_server();
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    25
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    26
static void create_path()
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    27
{
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    28
    char *tmpdir;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    29
    char *username;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    30
    int size;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    31
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    32
    /* Create the path */
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    33
    tmpdir = getenv("TMPDIR");
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    34
    if (tmpdir == NULL)
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    35
        tmpdir = "/tmp";
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    36
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    37
    username = getenv("USER");
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    38
    if (username == NULL)
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    39
        username = "unknown";
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    40
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    41
    /* Calculate the size */
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    42
    size = strlen(tmpdir) + strlen("/socket-ts.") + strlen(username) + 1;
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    43
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    44
    /* Freed after preparing the socket address */
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    45
    path = (char *) malloc(size);
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    46
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    47
    sprintf(path, "%s/socket-ts.%s", tmpdir, username);
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    48
}
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    49
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    50
int try_connect(int s)
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    51
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    52
    struct sockaddr_un addr;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    53
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    54
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    55
    addr.sun_family = AF_UNIX;
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    56
    strcpy(addr.sun_path, path);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    57
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    58
    res = connect(s, (struct sockaddr *) &addr, sizeof(addr));
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    59
    return res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    60
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    61
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    62
void wait_server_up(int fd)
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    63
{
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    64
    char a;
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    65
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    66
    read(fd, &a, 1);
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    67
    close(fd);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    68
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    69
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    70
/* Returns the fd where to wait for the parent notification */
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    71
static int fork_server()
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    72
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    73
    int pid;
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    74
    int p[2];
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
    /* !!! stdin/stdout */
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    77
    pipe(p);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    78
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    79
    pid = fork();
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    80
    switch (pid)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    81
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    82
        case 0: /* Child */
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    83
            close(p[0]);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    84
            close(server_socket);
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
    85
            server_main(p[1], path);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    86
            exit(0);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    87
            break;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    88
        case -1: /* Error */
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    89
            return -1;
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    90
        default: /* Parent */
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    91
            close(p[1]);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    92
    }
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    93
    /* Return the read fd */
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    94
    return p[0];
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    95
}
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    96
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    97
void notify_parent(int fd)
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    98
{
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
    99
    char a = 'a';
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
   100
    write(fd, &a, 1);
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
   101
    close(fd);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   102
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   103
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   104
int ensure_server_up()
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   105
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   106
    int res;
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
   107
    int notify_fd;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   108
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   109
    server_socket = socket(PF_UNIX, SOCK_STREAM, 0);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   110
    assert(server_socket != -1);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   111
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
   112
    create_path();
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
   113
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   114
    res = try_connect(server_socket);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   115
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   116
    /* Good connection */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   117
    if (res == 0)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   118
        return 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   119
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   120
    /* If error other than "No one listens on the other end"... */
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   121
    if (!(errno == ENOENT || errno == ECONNREFUSED))
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   122
    {
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   123
        perror("c: cannot connect to the server");
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   124
        exit(-1);
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   125
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   126
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   127
    if (errno == ECONNREFUSED)
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
   128
        unlink(path);
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
   129
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   130
    /* Try starting the server */
25
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
   131
    notify_fd = fork_server();
e9e4babe6262 Now the server is quicly started.
viric@llimona
parents: 9
diff changeset
   132
    wait_server_up(notify_fd);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   133
    res = try_connect(server_socket);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   134
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   135
    /* The second time didn't work. Abort. */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   136
    if (res == -1)
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   137
    {
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   138
        fprintf(stderr, "The server didn't come up.\n");
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   139
        exit(-1);
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
   140
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   141
28
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
   142
    free(path);
107abb4ec98a Unified socket path, depending on the username and $TMPDIR.
viric@llimona
parents: 25
diff changeset
   143
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   144
    /* Good connection on the second time */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
   145
    return 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
   146
}