]> git.sesse.net Git - jam/blob - jam.c
Check the return value of pthread_create.
[jam] / jam.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <pthread.h>
5 #include <sys/socket.h>
6 #include <netinet/in.h>
7
8 void *receiver_worker(void *arg)
9 {
10         int sock = (int)arg;
11         char buf[65536];
12
13         printf("Received worker for socket %u\n", sock);
14
15         for ( ;; ) {
16                 int ret = read(sock, buf, 65536);
17                 if (ret == 0)
18                         break;
19
20                 // FIXME: update stats here
21         }
22
23         printf("Socket %u done\n", sock);
24         
25         if (close(sock) == -1) {
26                 perror("close()");
27                 exit(1);
28         }
29
30         pthread_exit(0);
31 }
32
33 int get_server_socket(unsigned short port)
34 {
35         int server_sock;
36         struct sockaddr_in sin;
37
38         server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
39         if (server_sock == -1) {
40                 perror("socket()");
41                 exit(1);
42         }
43
44         sin.sin_family = AF_INET;
45         sin.sin_port = htons(port);
46         sin.sin_addr.s_addr = INADDR_ANY;
47
48         if (bind(server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1) {
49                 perror("bind()");
50                 exit(1);
51         }
52
53         if (listen(server_sock, 255) == -1) {
54                 perror("listen()");
55                 exit(1);
56         }
57
58         return server_sock;
59 }
60
61 int main()
62 {
63         int server_sock = get_server_socket(2007);
64
65         // FIXME: fire off sender workers here
66
67         /*
68          * Listen for incoming connections, spawning off one receiver
69          * thread for each (which will just gobble up the data until
70          * we're done).
71          */
72         for ( ;; ) {
73                 struct sockaddr_in addr;
74                 socklen_t addr_len = sizeof(addr);
75                 pthread_t thread;
76
77                 int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len);
78                 if (sock == -1) {
79                         perror("accept()");
80                         exit(1);
81                 }
82
83                 if (pthread_create(&thread, NULL, receiver_worker, (void *)sock) == -1) {
84                         perror("pthread_create()");
85                         exit(1);
86                 }
87         }
88
89         exit(0);
90 }