+static int fio_server(void)
+{
+ struct sockaddr_in saddr_in;
+ struct sockaddr addr;
+ fio_socklen_t len;
+ int sk, opt, ret;
+
+ dprint(FD_NET, "starting server\n");
+
+ sk = socket(AF_INET, SOCK_STREAM, 0);
+ if (sk < 0) {
+ log_err("fio: socket: %s\n", strerror(errno));
+ return -1;
+ }
+
+ opt = 1;
+ if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
+ log_err("fio: setsockopt: %s\n", strerror(errno));
+ return -1;
+ }
+#ifdef SO_REUSEPORT
+ if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
+ log_err("fio: setsockopt: %s\n", strerror(errno));
+ return -1;
+ }
+#endif
+
+ saddr_in.sin_family = AF_INET;
+ saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
+ saddr_in.sin_port = htons(fio_net_port);
+
+ if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
+ log_err("fio: bind: %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (listen(sk, 1) < 0) {
+ log_err("fio: listen: %s\n", strerror(errno));
+ return -1;
+ }
+
+ len = sizeof(addr);
+ if (getsockname(sk, &addr, &len) < 0) {
+ log_err("fio: getsockname: %s\n", strerror(errno));
+ return -1;
+ }
+
+ ret = accept_loop(sk);
+ close(sk);
+ return ret;
+}
+
+static void sig_int(int sig)
+{
+ fio_terminate_threads(TERMINATE_ALL);
+ exit_backend = 1;
+}
+
+static void server_signal_handler(void)
+{
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_int;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGINT, &act, NULL);
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sig_int;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGTERM, &act, NULL);
+}
+