server.c revision 5c341e9a5734742ae1137388345d4f47efdd4f05
150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <stdio.h> 250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <stdlib.h> 350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <unistd.h> 450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <limits.h> 550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <string.h> 650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <getopt.h> 750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <errno.h> 850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <fcntl.h> 950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/poll.h> 1050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/stat.h> 1150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/types.h> 1250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/wait.h> 1350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/time.h> 1450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <sys/mman.h> 1550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <signal.h> 1650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <netinet/in.h> 1750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <arpa/inet.h> 1850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include <netdb.h> 1950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 2050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#include "fio.h" 2150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 2250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboestatic int net_port = 8765; 2350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 2450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboestatic int accept_loop(int listen_sk) 2550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe{ 2650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe struct sockaddr addr; 2750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe unsigned int len = sizeof(addr); 285c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe int sk, do_exit = 0; 2950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 3050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboeagain: 3150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe sk = accept(listen_sk, &addr, &len); 3250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (sk < 0) { 3350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: accept failed\n"); 3450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 3550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 3650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 3750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe /* read forever */ 385c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe while (!do_exit) { 3950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe char buf[131072]; 4050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe int ret; 4150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 4250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe ret = recv(sk, buf, 4096, 0); 4350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (ret > 0) { 445c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe if (!strncmp("FIO_QUIT", buf, 8)) { 455c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe do_exit = 1; 465c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe break; 475c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe } 4850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe parse_jobs_ini(buf, 1, 0); 4950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe exec_run(); 5050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe reset_fio_state(); 5150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe break; 5250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } else if (!ret) 5350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe break; 5450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (errno == EAGAIN || errno == EINTR) 5550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe continue; 5650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe break; 5750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 5850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 5950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe close(sk); 605c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe 615c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe if (!do_exit) 625c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe goto again; 635c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe 645c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe return 0; 6550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe} 6650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 6750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboeint fio_server(void) 6850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe{ 6950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe struct sockaddr_in saddr_in; 7050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe struct sockaddr addr; 7150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe unsigned int len; 7250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe int sk, opt; 7350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 7450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe sk = socket(AF_INET, SOCK_STREAM, 0); 7550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (sk < 0) { 7650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: socket\n"); 7750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 7850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 7950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 8050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe opt = 1; 8150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { 8250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: setsockopt\n"); 8350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 8450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 8550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#ifdef SO_REUSEPORT 8650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) { 8750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe td_verror(td, errno, "setsockopt"); 8850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return 1; 8950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 9050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#endif 9150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 9250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe saddr_in.sin_family = AF_INET; 9350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe saddr_in.sin_addr.s_addr = htonl(INADDR_ANY); 9450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe saddr_in.sin_port = htons(net_port); 9550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 9650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) { 9750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe perror("bind"); 9850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: bind\n"); 9950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 10050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 10150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 10250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (listen(sk, 1) < 0) { 10350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: listen\n"); 10450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 10550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 10650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 10750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe len = sizeof(addr); 10850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe if (getsockname(sk, &addr, &len) < 0) { 10950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe log_err("fio: getsockname"); 11050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return -1; 11150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe } 11250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 11350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe return accept_loop(sk); 11450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe} 115