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
14 static const char* kServerSignature
15 = "application/x-vnd.haiku.userlandfs-server";
16
17 // usage
18 static 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
35 static int kArgC;
36 static char** kArgV;
37
38 // print_usage
39 void
print_usage(bool toStdErr=true)40 print_usage(bool toStdErr = true)
41 {
42 fprintf((toStdErr ? stderr : stdout), kUsage, kArgV[0], kArgV[0]);
43 }
44
45 // main
46 int
main(int argc,char ** argv)47 main(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