xref: /freebsd/contrib/lib9p/example/server.c (revision 134e17798c9af53632b372348ab828e75e65bf46)
1*134e1779SJakub Wojciech Klama /*
2*134e1779SJakub Wojciech Klama  * Copyright 2016 Jakub Klama <jceel@FreeBSD.org>
3*134e1779SJakub Wojciech Klama  * All rights reserved
4*134e1779SJakub Wojciech Klama  *
5*134e1779SJakub Wojciech Klama  * Redistribution and use in source and binary forms, with or without
6*134e1779SJakub Wojciech Klama  * modification, are permitted providing that the following conditions
7*134e1779SJakub Wojciech Klama  * are met:
8*134e1779SJakub Wojciech Klama  * 1. Redistributions of source code must retain the above copyright
9*134e1779SJakub Wojciech Klama  *    notice, this list of conditions and the following disclaimer.
10*134e1779SJakub Wojciech Klama  * 2. Redistributions in binary form must reproduce the above copyright
11*134e1779SJakub Wojciech Klama  *    notice, this list of conditions and the following disclaimer in the
12*134e1779SJakub Wojciech Klama  *    documentation and/or other materials provided with the distribution.
13*134e1779SJakub Wojciech Klama  *
14*134e1779SJakub Wojciech Klama  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15*134e1779SJakub Wojciech Klama  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16*134e1779SJakub Wojciech Klama  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*134e1779SJakub Wojciech Klama  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18*134e1779SJakub Wojciech Klama  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*134e1779SJakub Wojciech Klama  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*134e1779SJakub Wojciech Klama  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*134e1779SJakub Wojciech Klama  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22*134e1779SJakub Wojciech Klama  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23*134e1779SJakub Wojciech Klama  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*134e1779SJakub Wojciech Klama  * POSSIBILITY OF SUCH DAMAGE.
25*134e1779SJakub Wojciech Klama  *
26*134e1779SJakub Wojciech Klama  */
27*134e1779SJakub Wojciech Klama 
28*134e1779SJakub Wojciech Klama #include <stdio.h>
29*134e1779SJakub Wojciech Klama #include <stdlib.h>
30*134e1779SJakub Wojciech Klama #include <fcntl.h>
31*134e1779SJakub Wojciech Klama #include <err.h>
32*134e1779SJakub Wojciech Klama #include <unistd.h>
33*134e1779SJakub Wojciech Klama #include "../lib9p.h"
34*134e1779SJakub Wojciech Klama #include "../backend/fs.h"
35*134e1779SJakub Wojciech Klama #include "../transport/socket.h"
36*134e1779SJakub Wojciech Klama 
37*134e1779SJakub Wojciech Klama int
main(int argc,char ** argv)38*134e1779SJakub Wojciech Klama main(int argc, char **argv)
39*134e1779SJakub Wojciech Klama {
40*134e1779SJakub Wojciech Klama 	struct l9p_backend *fs_backend;
41*134e1779SJakub Wojciech Klama 	struct l9p_server *server;
42*134e1779SJakub Wojciech Klama 	char *host = "0.0.0.0";
43*134e1779SJakub Wojciech Klama 	char *port = "564";
44*134e1779SJakub Wojciech Klama 	char *path;
45*134e1779SJakub Wojciech Klama 	bool ro = false;
46*134e1779SJakub Wojciech Klama 	int rootfd;
47*134e1779SJakub Wojciech Klama 	int opt;
48*134e1779SJakub Wojciech Klama 
49*134e1779SJakub Wojciech Klama 	while ((opt = getopt(argc, argv, "h:p:r")) != -1) {
50*134e1779SJakub Wojciech Klama 		switch (opt) {
51*134e1779SJakub Wojciech Klama 		case 'h':
52*134e1779SJakub Wojciech Klama 			host = optarg;
53*134e1779SJakub Wojciech Klama 			break;
54*134e1779SJakub Wojciech Klama 		case 'p':
55*134e1779SJakub Wojciech Klama 			port = optarg;
56*134e1779SJakub Wojciech Klama 			break;
57*134e1779SJakub Wojciech Klama 		case 'r':
58*134e1779SJakub Wojciech Klama 			ro = true;
59*134e1779SJakub Wojciech Klama 			break;
60*134e1779SJakub Wojciech Klama 		case '?':
61*134e1779SJakub Wojciech Klama 		default:
62*134e1779SJakub Wojciech Klama 			goto usage;
63*134e1779SJakub Wojciech Klama 		}
64*134e1779SJakub Wojciech Klama 	}
65*134e1779SJakub Wojciech Klama 
66*134e1779SJakub Wojciech Klama 	if (optind >= argc) {
67*134e1779SJakub Wojciech Klama usage:
68*134e1779SJakub Wojciech Klama 		errx(1, "Usage: server [-h <host>] [-p <port>] [-r] <path>");
69*134e1779SJakub Wojciech Klama 	}
70*134e1779SJakub Wojciech Klama 
71*134e1779SJakub Wojciech Klama 	path = argv[optind];
72*134e1779SJakub Wojciech Klama 	rootfd = open(path, O_DIRECTORY);
73*134e1779SJakub Wojciech Klama 
74*134e1779SJakub Wojciech Klama 	if (rootfd < 0)
75*134e1779SJakub Wojciech Klama 		err(1, "cannot open root directory");
76*134e1779SJakub Wojciech Klama 
77*134e1779SJakub Wojciech Klama 	if (l9p_backend_fs_init(&fs_backend, rootfd, ro) != 0)
78*134e1779SJakub Wojciech Klama 		err(1, "cannot init backend");
79*134e1779SJakub Wojciech Klama 
80*134e1779SJakub Wojciech Klama 	if (l9p_server_init(&server, fs_backend) != 0)
81*134e1779SJakub Wojciech Klama 		err(1, "cannot create server");
82*134e1779SJakub Wojciech Klama 
83*134e1779SJakub Wojciech Klama 	server->ls_max_version = L9P_2000L;
84*134e1779SJakub Wojciech Klama 	if (l9p_start_server(server, host, port))
85*134e1779SJakub Wojciech Klama 		err(1, "l9p_start_server() failed");
86*134e1779SJakub Wojciech Klama 
87*134e1779SJakub Wojciech Klama 	/* XXX - we never get here, l9p_start_server does not return */
88*134e1779SJakub Wojciech Klama 	exit(0);
89*134e1779SJakub Wojciech Klama }
90