server_start.c
author lbatlle@npdl268.bpo.hp.com
Fri, 23 Mar 2007 14:34:16 +0100
changeset 9 9acd8ae3190c
parent 3 2fb8a6bdd024
child 25 e9e4babe6262
permissions -rw-r--r--
First usable version!
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     1
#include <assert.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     2
#include <sys/types.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     3
#include <sys/socket.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     4
#include <sys/un.h>
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
     5
#include <errno.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
     6
#include <stdlib.h>
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
     7
#include <stdio.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
     8
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
     9
#include "main.h"
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    10
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    11
extern int server_socket;
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    12
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    13
int try_connect(int s)
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    14
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    15
    struct sockaddr_un addr;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    16
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    17
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    18
    addr.sun_family = AF_UNIX;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    19
    strcpy(addr.sun_path, "/tmp/prova.socket");
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    20
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    21
    res = connect(s, (struct sockaddr *) &addr, sizeof(addr));
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    22
    return res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    23
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    24
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    25
void wait_server_up()
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    26
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    27
    printf("Wait server up\n");
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    28
    sleep(1);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    29
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    30
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    31
void fork_server()
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    32
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    33
    int pid;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    34
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    35
    /* !!! stdin/stdout */
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    36
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    37
    pid = fork();
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    38
    switch (pid)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    39
    {
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    40
        case 0: /* Child */
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    41
            close(server_socket);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    42
            server_main();
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    43
            exit(0);
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    44
            break;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    45
        case -1: /* Error */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    46
            return;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    47
        default: /* Parent */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    48
            ;
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    49
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    50
}
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    51
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    52
int ensure_server_up()
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    53
{
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    54
    int res;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    55
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    56
    server_socket = socket(PF_UNIX, SOCK_STREAM, 0);
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    57
    assert(server_socket != -1);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    58
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    59
    res = try_connect(server_socket);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    60
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    61
    /* Good connection */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    62
    if (res == 0)
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    63
        return 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    64
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    65
    /* If error other than "No one listens on the other end"... */
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    66
    if (!(errno == ENOENT || errno == ECONNREFUSED))
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    67
    {
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    68
        perror("c: cannot connect to the server");
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    69
        exit(-1);
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    70
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    71
3
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    72
    if (errno == ECONNREFUSED)
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    73
        unlink("/tmp/prova.socket");
2fb8a6bdd024 More code.
viric@llimona
parents: 2
diff changeset
    74
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    75
    /* Try starting the server */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    76
    fork_server();
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    77
    wait_server_up();
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    78
    res = try_connect(server_socket);
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    79
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    80
    /* The second time didn't work. Abort. */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    81
    if (res == -1)
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    82
    {
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    83
        fprintf(stderr, "The server didn't come up.\n");
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    84
        exit(-1);
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 3
diff changeset
    85
    }
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    86
2
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    87
    /* Good connection on the second time */
602bd67df3aa Changed tabs to 4 spaces. Rule.
viric@llimona
parents: 1
diff changeset
    88
    return 1;
1
74928e2b27f4 Honta versio de ia strukturo.
viric@llimona
parents:
diff changeset
    89
}