Initial commit.
[hondza-y36pr2.git] / mark / mark.c
blobc11d739d6cdddc018deac8ae13940a26663b3b76
1 /******************************************************************************
2 * mark.c
3 *****************************************************************************/
5 #define _GNU_SOURCE
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <sys/socket.h>
10 #include <unistd.h>
11 #include <arpa/inet.h>
12 #include <dlfcn.h>
14 #include "mark.h"
17 #define SO_MARK 36
20 real_socket_t real_socket;
21 int default_mark = 1;
24 void lib_init(void)
26 char *temp;
28 *(void **) (&real_socket) = dlsym(RTLD_NEXT, "socket");
29 if(!real_socket)
31 fprintf(stderr, "Cannot load symbol 'socket' %s\n", dlerror());
32 _exit(1);
35 temp = getenv("MARK");
36 if(temp) default_mark = (int) strtoul(temp, NULL, 10);
40 int socket(int domain, int type, int protocol)
42 int err2, mark = default_mark;
43 int err = real_socket(domain, type, protocol);
45 if(domain != PF_INET || err == -1) return err;
47 err2 = setsockopt(err, SOL_SOCKET, SO_MARK, (void *) &mark, sizeof (int));
48 if(err2 == -1) { perror("setsockopt(... SO_MARK ...)"); exit(1); }
50 return err;