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