Start of client/server
[fio.git] / server.c
CommitLineData
50d16976
JA
1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <limits.h>
5#include <string.h>
6#include <getopt.h>
7#include <errno.h>
8#include <fcntl.h>
9#include <sys/poll.h>
10#include <sys/stat.h>
11#include <sys/types.h>
12#include <sys/wait.h>
13#include <sys/time.h>
14#include <sys/mman.h>
15#include <signal.h>
16#include <netinet/in.h>
17#include <arpa/inet.h>
18#include <netdb.h>
19
20#include "fio.h"
21
22static int net_port = 8765;
23
24static int accept_loop(int listen_sk)
25{
26 struct sockaddr addr;
27 unsigned int len = sizeof(addr);
28 int sk;
29
30again:
31 sk = accept(listen_sk, &addr, &len);
32 printf("got a hit\n");
33 if (sk < 0) {
34 log_err("fio: accept failed\n");
35 return -1;
36 }
37
38 /* read forever */
39 for (;;) {
40 char buf[131072];
41 int ret;
42
43 ret = recv(sk, buf, 4096, 0);
44 if (ret > 0) {
45 parse_jobs_ini(buf, 1, 0);
46 exec_run();
47 reset_fio_state();
48 break;
49 } else if (!ret)
50 break;
51 if (errno == EAGAIN || errno == EINTR)
52 continue;
53 break;
54 }
55
56 close(sk);
57 printf("closed\n");
58 goto again;
59}
60
61int fio_server(void)
62{
63 struct sockaddr_in saddr_in;
64 struct sockaddr addr;
65 unsigned int len;
66 int sk, opt;
67
68 sk = socket(AF_INET, SOCK_STREAM, 0);
69 if (sk < 0) {
70 log_err("fio: socket\n");
71 return -1;
72 }
73
74 opt = 1;
75 if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
76 log_err("fio: setsockopt\n");
77 return -1;
78 }
79#ifdef SO_REUSEPORT
80 if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
81 td_verror(td, errno, "setsockopt");
82 return 1;
83 }
84#endif
85
86 saddr_in.sin_family = AF_INET;
87 saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
88 saddr_in.sin_port = htons(net_port);
89
90 if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
91 perror("bind");
92 log_err("fio: bind\n");
93 return -1;
94 }
95
96 if (listen(sk, 1) < 0) {
97 log_err("fio: listen\n");
98 return -1;
99 }
100
101 len = sizeof(addr);
102 if (getsockname(sk, &addr, &len) < 0) {
103 log_err("fio: getsockname");
104 return -1;
105 }
106
107 return accept_loop(sk);
108}