usocket.c
author viric@llimona
Fri, 14 Sep 2007 23:59:42 +0200
changeset 19 12de2cd767f2
parent 14 286b248e402a
permissions -rw-r--r--
Removed utf-8 from readme.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     1
/*
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     2
    stdin mix - a mixer/multiplexer for stdin to processes
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     4
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     5
    Please find the license in the provided COPYING file.
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 6
diff changeset
     6
*/
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     7
#include <stdlib.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     8
#include <sys/un.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     9
#include <sys/socket.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    10
3
909bca647298 Renaming now correct.
viric@llimona
parents: 1
diff changeset
    11
#include "main.h"
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    12
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    13
static char socket_path[256];
6
4fe857c0b12a Help message.
viric@llimona
parents: 4
diff changeset
    14
static char default_path_prefix[] = "/tmp/socket-sm.";
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    15
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    16
static void get_path()
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    17
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    18
    char *new;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    19
    
6
4fe857c0b12a Help message.
viric@llimona
parents: 4
diff changeset
    20
    new = getenv("SM_SOCKET");
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    21
    if (new == 0)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    22
    {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    23
        char num[20];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    24
        snprintf(socket_path, sizeof(socket_path), "%s%i",
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    25
                default_path_prefix, (int) getuid());
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    26
    } else
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    27
        strncpy(socket_path, new, sizeof(socket_path));
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    28
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    29
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    30
int serve_socket()
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    31
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    32
    int ls;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    33
    struct sockaddr_un addr;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    34
    int res;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    35
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    36
    get_path();
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    37
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    38
    ls = socket(AF_UNIX, SOCK_STREAM, 0);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    39
    if (ls == -1)
4
b5b369483ec0 Checked rename, error messages without ending dot.
viric@llimona
parents: 3
diff changeset
    40
        error("Cannot create the unix listen socket in the server");
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    41
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    42
    addr.sun_family = AF_UNIX;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    43
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    44
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    45
    res = bind(ls, (struct sockaddr *) & addr, sizeof(addr));
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    46
    if (res == -1)
14
286b248e402a Adding better error messages and a README.
viric@llimona
parents: 12
diff changeset
    47
        error("Error binding to %s", socket_path);
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    48
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    49
    res = listen(ls, 10);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    50
    if (res == -1)
14
286b248e402a Adding better error messages and a README.
viric@llimona
parents: 12
diff changeset
    51
        error("Error listening on the binded unix socket");
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    52
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    53
    return ls;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    54
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    55
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    56
int accept_connection(int ls)
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    57
{
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    58
    int cs;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    59
    cs = accept(ls, 0, 0);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    60
    return cs;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    61
}
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    62
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    63
int connect_socket()
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    64
{
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    65
    struct sockaddr_un addr;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    66
    int res;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    67
    int cs;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    68
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    69
    get_path();
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    70
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    71
    cs = socket(AF_UNIX, SOCK_STREAM, 0);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    72
    if (cs == -1)
4
b5b369483ec0 Checked rename, error messages without ending dot.
viric@llimona
parents: 3
diff changeset
    73
        error("Cannot create the unix connect socket in the client");
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    74
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    75
    addr.sun_family = AF_UNIX;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    76
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    77
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    78
    res = connect(cs, (struct sockaddr *) &addr, sizeof(addr));
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    79
    if (res == -1)
14
286b248e402a Adding better error messages and a README.
viric@llimona
parents: 12
diff changeset
    80
        error("Cannot connect to %s", socket_path);
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    81
    return cs;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    82
}
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    83
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    84
void remove_socket(int ls)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    85
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    86
    close(ls);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    87
    unlink(socket_path);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    88
}