Blame


1 bcf3fb81 2023-08-16 continue /** Parse command line arguments */
2 bcf3fb81 2023-08-16 continue
3 bcf3fb81 2023-08-16 continue #include "args.h"
4 bcf3fb81 2023-08-16 continue #include "error.h"
5 bcf3fb81 2023-08-16 continue
6 bcf3fb81 2023-08-16 continue #include <unistd.h>
7 bcf3fb81 2023-08-16 continue #include <fcntl.h>
8 bcf3fb81 2023-08-16 continue
9 bcf3fb81 2023-08-16 continue
10 bcf3fb81 2023-08-16 continue namespace vostok
11 bcf3fb81 2023-08-16 continue {
12 bcf3fb81 2023-08-16 continue namespace
13 bcf3fb81 2023-08-16 continue {
14 bcf3fb81 2023-08-16 continue
15 bcf3fb81 2023-08-16 continue /** Print usage and return false */
16 bcf3fb81 2023-08-16 continue bool usage(const char *program)
17 bcf3fb81 2023-08-16 continue {
18 bcf3fb81 2023-08-16 continue const char *file_name = strrchr(program, '/');
19 bcf3fb81 2023-08-16 continue if (!file_name)
20 bcf3fb81 2023-08-16 continue file_name = program;
21 bcf3fb81 2023-08-16 continue else
22 bcf3fb81 2023-08-16 continue ++file_name;
23 bcf3fb81 2023-08-16 continue
24 bcf3fb81 2023-08-16 continue error::g_log << "Usage: " << file_name << " [OPTS]" << std::endl << std::endl;
25 bcf3fb81 2023-08-16 continue error::g_log << "OPTS may be: " << std::endl;
26 bcf3fb81 2023-08-16 continue error::g_log << "\t-a ADDR : listening network address (127.0.0.1 by default)" << std::endl;
27 bcf3fb81 2023-08-16 continue error::g_log << "\t-p PORT : TCP/IP port number (1965 by default)" << std::endl;
28 bcf3fb81 2023-08-16 continue error::g_log << "\t-c FILE : Server certificate file [REQUIRED]" << std::endl;
29 bcf3fb81 2023-08-16 continue error::g_log << "\t-k FILE : Server key file [REQUIRED]" << std::endl;
30 bcf3fb81 2023-08-16 continue error::g_log << "\t-f PATH : Path to file system data [REQUIRED]" << std::endl;
31 e0af76a7 2023-09-05 continue error::g_log << "\t-m FILE : Path to file mime.types" << std::endl;
32 3304ae77 2024-07-06 continue error::g_log << "\t-g PATH : VGI (CGI-like) path prefix (case sensitive, without normalization)" << std::endl;
33 a2471084 2024-07-06 continue error::g_log << "\t-e CMD : VGI (CGI-like) command" << std::endl;
34 bcf3fb81 2023-08-16 continue
35 bcf3fb81 2023-08-16 continue return false;
36 bcf3fb81 2023-08-16 continue }
37 bcf3fb81 2023-08-16 continue
38 bcf3fb81 2023-08-16 continue } // namespace <unnamed>
39 bcf3fb81 2023-08-16 continue
40 bcf3fb81 2023-08-16 continue
41 d6e3180e 2023-08-30 continue bool
42 d6e3180e 2023-08-30 continue parse_command_line_arguments(
43 d6e3180e 2023-08-30 continue /* in */ int argc,
44 d6e3180e 2023-08-30 continue /* in */ char *argv[],
45 d6e3180e 2023-08-30 continue /* out */ CommandLineArguments &args
46 d6e3180e 2023-08-30 continue )
47 bcf3fb81 2023-08-16 continue {
48 bcf3fb81 2023-08-16 continue int ch;
49 bcf3fb81 2023-08-16 continue char *p = nullptr;
50 3304ae77 2024-07-06 continue while ((ch = getopt(argc, argv, "a:p:c:k:f:m:g:e:")) != -1) {
51 bcf3fb81 2023-08-16 continue switch (ch) {
52 bcf3fb81 2023-08-16 continue case 'a':
53 d6e3180e 2023-08-30 continue args.addr = optarg;
54 bcf3fb81 2023-08-16 continue break;
55 bcf3fb81 2023-08-16 continue case 'p':
56 bcf3fb81 2023-08-16 continue p = nullptr;
57 d6e3180e 2023-08-30 continue args.port = std::strtoul(optarg, &p, 10);
58 d6e3180e 2023-08-30 continue if (!args.port)
59 bcf3fb81 2023-08-16 continue {
60 bcf3fb81 2023-08-16 continue error::g_log << "Invalid PORT value: " << optarg << std::endl;
61 bcf3fb81 2023-08-16 continue return usage(argv[0]);
62 bcf3fb81 2023-08-16 continue }
63 bcf3fb81 2023-08-16 continue break;
64 bcf3fb81 2023-08-16 continue case 'c':
65 d6e3180e 2023-08-30 continue args.cert_file = optarg;
66 bcf3fb81 2023-08-16 continue break;
67 bcf3fb81 2023-08-16 continue case 'k':
68 d6e3180e 2023-08-30 continue args.key_file = optarg;
69 bcf3fb81 2023-08-16 continue break;
70 bcf3fb81 2023-08-16 continue case 'f':
71 d6e3180e 2023-08-30 continue args.directory.reset(open(optarg, O_RDONLY));
72 d6e3180e 2023-08-30 continue if (!args.directory)
73 bcf3fb81 2023-08-16 continue {
74 bcf3fb81 2023-08-16 continue error::occurred(
75 bcf3fb81 2023-08-16 continue []
76 bcf3fb81 2023-08-16 continue {
77 bcf3fb81 2023-08-16 continue error::g_log << "Open directory \"" << optarg << "\"";
78 bcf3fb81 2023-08-16 continue },
79 d6e3180e 2023-08-30 continue error::Print{}
80 bcf3fb81 2023-08-16 continue );
81 bcf3fb81 2023-08-16 continue return false;
82 bcf3fb81 2023-08-16 continue }
83 bcf3fb81 2023-08-16 continue break;
84 e0af76a7 2023-09-05 continue case 'm':
85 e0af76a7 2023-09-05 continue if (!args.mime.parse_db(optarg))
86 e0af76a7 2023-09-05 continue return false;
87 e0af76a7 2023-09-05 continue break;
88 01105a54 2024-07-04 continue case 'g':
89 3304ae77 2024-07-06 continue args.vgi_prefix = Span<const char>{optarg, strlen(optarg)};
90 01105a54 2024-07-04 continue break;
91 3304ae77 2024-07-06 continue case 'e':
92 3304ae77 2024-07-06 continue args.vgi_command = optarg;
93 3304ae77 2024-07-06 continue break;
94 bcf3fb81 2023-08-16 continue
95 bcf3fb81 2023-08-16 continue default:
96 bcf3fb81 2023-08-16 continue return usage(argv[0]);
97 bcf3fb81 2023-08-16 continue }
98 bcf3fb81 2023-08-16 continue }
99 d6e3180e 2023-08-30 continue if (!args.cert_file)
100 bcf3fb81 2023-08-16 continue {
101 bcf3fb81 2023-08-16 continue error::g_log << "Invalid command line: -c option required" << std::endl;
102 bcf3fb81 2023-08-16 continue return usage(argv[0]);
103 bcf3fb81 2023-08-16 continue }
104 d6e3180e 2023-08-30 continue if (!args.key_file)
105 bcf3fb81 2023-08-16 continue {
106 bcf3fb81 2023-08-16 continue error::g_log << "Invalid command line: -k option required" << std::endl;
107 bcf3fb81 2023-08-16 continue return usage(argv[0]);
108 bcf3fb81 2023-08-16 continue }
109 d6e3180e 2023-08-30 continue if (!args.directory)
110 bcf3fb81 2023-08-16 continue {
111 bcf3fb81 2023-08-16 continue error::g_log << "Invalid command line: -d option required" << std::endl;
112 bcf3fb81 2023-08-16 continue return usage(argv[0]);
113 bcf3fb81 2023-08-16 continue }
114 3304ae77 2024-07-06 continue if ( (args.vgi_prefix.size() && !args.vgi_command) ||
115 3304ae77 2024-07-06 continue (!args.vgi_prefix.size() && args.vgi_command) )
116 3304ae77 2024-07-06 continue {
117 3304ae77 2024-07-06 continue error::g_log << "Invalid command line: options -g and -e can only be specified together" << std::endl;
118 3304ae77 2024-07-06 continue return usage(argv[0]);
119 3304ae77 2024-07-06 continue }
120 bcf3fb81 2023-08-16 continue return true;
121 bcf3fb81 2023-08-16 continue }
122 bcf3fb81 2023-08-16 continue
123 bcf3fb81 2023-08-16 continue
124 bcf3fb81 2023-08-16 continue } // namespace vostok