+static int fio_init_server_ip(void)
+{
+ int sk, opt;
+
+ 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));
+ close(sk);
+ return -1;
+ }
+#ifdef SO_REUSEPORT
+ if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
+ log_err("fio: setsockopt: %s\n", strerror(errno));
+ close(sk);
+ return -1;
+ }
+#endif
+
+ saddr_in.sin_family = AF_INET;
+
+ if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
+ log_err("fio: bind: %s\n", strerror(errno));
+ close(sk);
+ return -1;
+ }
+
+ return sk;
+}
+
+static int fio_init_server_sock(void)
+{
+ struct sockaddr_un addr;
+ fio_socklen_t len;
+ mode_t mode;
+ int sk;
+
+ sk = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sk < 0) {
+ log_err("fio: socket: %s\n", strerror(errno));
+ return -1;
+ }
+
+ mode = umask(000);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strcpy(addr.sun_path, bind_sock);
+ unlink(bind_sock);
+
+ len = sizeof(addr.sun_family) + strlen(bind_sock) + 1;
+
+ if (bind(sk, (struct sockaddr *) &addr, len) < 0) {
+ log_err("fio: bind: %s\n", strerror(errno));
+ close(sk);
+ return -1;
+ }
+
+ umask(mode);
+ return sk;
+}
+
+static int fio_init_server_connection(void)
+{
+ char bind_str[128];
+ int sk;
+
+ dprint(FD_NET, "starting server\n");
+
+ if (!bind_sock)
+ sk = fio_init_server_ip();
+ else
+ sk = fio_init_server_sock();
+
+ if (sk < 0)
+ return sk;
+
+ if (!bind_sock)
+ sprintf(bind_str, "%s:%u", inet_ntoa(saddr_in.sin_addr), fio_net_port);
+ else
+ strcpy(bind_str, bind_sock);
+
+ log_info("fio: server listening on %s\n", bind_str);
+
+ if (listen(sk, 0) < 0) {
+ log_err("fio: listen: %s\n", strerror(errno));
+ return -1;
+ }
+
+ return sk;
+}
+
+int fio_server_parse_string(const char *str, char **ptr, int *is_sock,
+ int *port, struct in_addr *inp)