commit - 917c32a4f0ec162835da762d7dd0afdb11d69392
commit + 36e5500c810d5fc5badbf22e8c79e8eeb0975d07
blob - 7157976b86a0eabf00636cff867f8d832cb36960
blob + aa8fb179940b64dd6a25670b63d036b0023b888f
--- vostokd/command_line_arguments.cc
+++ vostokd/command_line_arguments.cc
#include "error.h"
#include <unistd.h>
+#include <fcntl.h>
namespace vostok
{
+namespace
+{
+/** Print usage and return false */
+bool usage(const char *program)
+{
+ const char *file_name = strrchr(program, '/');
+ if (!file_name)
+ file_name = program;
+ else
+ ++file_name;
+ error::g_log << "Usage: " << file_name << " [OPTS]" << std::endl << std::endl;
+ error::g_log << "OPTS may be: " << std::endl;
+ error::g_log << "\t-a ADDR : listening network address (127.0.0.1 by default)" << std::endl;
+ error::g_log << "\t-p PORT : TCP/IP port number (1965 by default)" << std::endl;
+ error::g_log << "\t-c FILE : Server certificate file [REQUIRED]" << std::endl;
+ error::g_log << "\t-k FILE : Server key file [REQUIRED]" << std::endl;
+ error::g_log << "\t-d DIR : Path to data directory [REQUIRED]" << std::endl;
+
+ return false;
+}
+
+} // namespace <unnamed>
+
+
bool command_line_arguments::parse_command_line(int argc, char *argv[])
{
int ch;
char *p = nullptr;
- while ((ch = getopt(argc, argv, "a:p:c:k:")) != -1) {
+ while ((ch = getopt(argc, argv, "a:p:c:k:d:")) != -1) {
switch (ch) {
case 'a':
m_addr = optarg;
if (!m_port)
{
error::g_log << "Invalid PORT value: " << optarg << std::endl;
- usage(argv[0]);
- return false;
+ return usage(argv[0]);
}
break;
case 'c':
case 'k':
m_key_file = optarg;
break;
+ case 'd':
+ m_directory.reset(open(optarg, O_RDONLY | O_DIRECTORY));
+ if (!m_directory)
+ {
+ error::occurred(
+ []
+ {
+ error::g_log << "Open directory \"" << optarg << "\"";
+ },
+ error::print{}
+ );
+ return false;
+ }
+ break;
default:
- usage(argv[0]);
- return false;
+ return usage(argv[0]);
}
}
if (!m_cert_file)
{
error::g_log << "Invalid command line: -c option required" << std::endl;
- usage(argv[0]);
- return false;
+ return usage(argv[0]);
}
if (!m_key_file)
{
error::g_log << "Invalid command line: -k option required" << std::endl;
- usage(argv[0]);
- return false;
+ return usage(argv[0]);
}
+ if (!m_directory)
+ {
+ error::g_log << "Invalid command line: -d option required" << std::endl;
+ return usage(argv[0]);
+ }
return true;
}
-void command_line_arguments::usage(const char *program)
-{
- const char *file_name = strrchr(program, '/');
- if (!file_name)
- file_name = program;
- else
- ++file_name;
-
- error::g_log << "Usage: " << file_name << " [OPTS]" << std::endl << std::endl;
- error::g_log << "OPTS may be: " << std::endl;
- error::g_log << "\t-a ADDR : listening network address (127.0.0.1 by default)" << std::endl;
- error::g_log << "\t-p PORT : TCP/IP port number (1965 by default)" << std::endl;
- error::g_log << "\t-c FILE : Server certificate file [REQUIRED]" << std::endl;
- error::g_log << "\t-k FILE : Server key file [REQUIRED]" << std::endl;
-}
-
-
} // namespace vostok
blob - a05146429c24bd042d30740b1f5c8c48de36673a
blob + 8d96bc9af9bfdbfece9be42bba38e35a07bd9ee1
--- vostokd/command_line_arguments.h
+++ vostokd/command_line_arguments.h
#pragma once
-#include <not_null>
-#include <zstring>
+#include "not_null"
+#include "zstring"
+#include "unique_fd"
namespace vostok
int m_port{1965};
czstring m_cert_file{nullptr};
czstring m_key_file{nullptr};
+ unique_fd m_directory;
bool parse_command_line(int argc, char *argv[]);
-
- void usage(const char *program);
};