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