1// main.cpp
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#include <new>
8
9#include "Debug.h"
10#include "ServerDefs.h"
11#include "UserlandFSServer.h"
12
13// server signature
14static const char* kServerSignature
15	= "application/x-vnd.haiku.userlandfs-server";
16
17// usage
18static const char* kUsage =
19"Usage: %s <options> <file system> [ <port> ]\n"
20"\n"
21"Runs the userlandfs server for a given file system. Typically this is done\n"
22"automatically by the kernel module when a volume is requested to be mounted,\n"
23"but running the server manually can be useful for debugging purposes. The\n"
24"<file system> argument specifies the name of the file system to be loaded.\n"
25"<port> should not be given when starting the server manually; it is used by\n"
26"the kernel module only.\n"
27"\n"
28"Options:\n"
29"  --debug     - the file system server enters the debugger after the\n"
30"                userland file system add-on has been loaded and is\n"
31"                ready to be used.\n"
32"  -h, --help  - print this text\n"
33;
34
35static int kArgC;
36static char** kArgV;
37
38// print_usage
39void
40print_usage(bool toStdErr = true)
41{
42	fprintf((toStdErr ? stderr : stdout), kUsage, kArgV[0], kArgV[0]);
43}
44
45// main
46int
47main(int argc, char** argv)
48{
49	kArgC = argc;
50	kArgV = argv;
51
52	// init debugging
53	init_debugging();
54	struct DebuggingExiter {
55		DebuggingExiter()	{}
56		~DebuggingExiter()	{ exit_debugging(); }
57	} _;
58
59	// parse arguments
60	int argi = 1;
61	for (; argi < argc; argi++) {
62		const char* arg = argv[argi];
63		int32 argLen = strlen(arg);
64		if (argLen == 0) {
65			print_usage();
66			return 1;
67		}
68		if (arg[0] != '-')
69			break;
70		if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) {
71			print_usage(false);
72			return 0;
73		} else if (strcmp(arg, "--debug") == 0) {
74			gServerSettings.SetEnterDebugger(true);
75		}
76	}
77
78	// get file system, if any
79	bool dispatcher = true;
80	const char* fileSystem = NULL;
81	if (argi < argc) {
82		fileSystem = argv[argi++];
83		dispatcher = false;
84	}
85
86	// get the port, if any
87	int32 port = -1;
88	if (argi < argc) {
89		port = atol(argv[argi++]);
90		if (port <= 0) {
91			print_usage();
92			return 1;
93		}
94	}
95
96	if (argi < argc) {
97		print_usage();
98		return 1;
99	}
100
101	// create and init the application
102	status_t error = B_OK;
103	UserlandFSServer* server
104		= new(std::nothrow) UserlandFSServer(kServerSignature);
105	if (!server) {
106		fprintf(stderr, "Failed to create server.\n");
107		return 1;
108	}
109	error = server->Init(fileSystem, port);
110
111	// run it, if everything went fine
112	if (error == B_OK)
113		server->Run();
114
115	delete server;
116	return 0;
117}
118