aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-26 20:46:27 -0500
committerFranklin Wei <git@fwei.tk>2016-01-26 20:46:27 -0500
commitaac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30 (patch)
tree634275773e69a1a49aaa12207593f3d8336489a6 /src
parent0a3939a5ac30a0707ef33e971c4881b34b463c43 (diff)
downloadnetcosm-aac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30.zip
netcosm-aac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30.tar.gz
netcosm-aac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30.tar.bz2
netcosm-aac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30.tar.xz
add some very basic command-line parsing
Diffstat (limited to 'src')
-rw-r--r--src/server.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/src/server.c b/src/server.c
index e67fa20..3b428d3 100644
--- a/src/server.c
+++ b/src/server.c
@@ -24,7 +24,7 @@
#include "userdb.h"
#include "util.h"
-#define PORT 1234
+#define DEFAULT_PORT 1234
#define BACKLOG 512
/* global data */
@@ -35,7 +35,7 @@ void *child_map = NULL;
volatile int num_clients = 0;
/* local data */
-static uint16_t port;
+static uint16_t port = DEFAULT_PORT;
static int server_socket;
@@ -144,10 +144,18 @@ static void __attribute__((noreturn)) sigint_handler(int s)
exit(0);
}
+static bool autoconfig = false;
+const char *autouser, *autopass;
+
static void check_userfile(void)
{
if(access(USERFILE, F_OK) < 0 || userdb_size() == 0)
- first_run_setup();
+ {
+ if(!autoconfig)
+ first_run_setup();
+ else
+ auth_user_add(autouser, autopass, PRIV_ADMIN);
+ }
if(access(USERFILE, R_OK | W_OK) < 0)
error("cannot access "USERFILE);
@@ -330,6 +338,40 @@ static void init_signals(void)
error("sigaction");
}
+static void parse_args(int argc, char *argv[])
+{
+ for(int i = 1; i < argc; ++i)
+ {
+ if(argv[i][0] == '-')
+ {
+ if(strlen(argv[i]) > 1)
+ {
+ char c = argv[i][1];
+ retry:
+ switch(c)
+ {
+ case 'h': /* help */
+ debugf("FIXME: usage message");
+ exit(0);
+ case 'a': /* automatic first-run config */
+ autoconfig = true;
+ autouser = argv[++i];
+ autopass = argv[++i];
+ break;
+ case 'd': /* set data prefix */
+ chdir(argv[++i]);
+ break;
+ default:
+ c = 'h';
+ goto retry;
+ }
+ }
+ }
+ else
+ port = strtol(argv[i], NULL, 10);
+ }
+}
+
static SIMP_HASH(pid_t, pid_hash);
static SIMP_EQUAL(pid_t, pid_equal);
@@ -341,10 +383,7 @@ int server_main(int argc, char *argv[])
assert(ev_version_major() == EV_VERSION_MAJOR &&
ev_version_minor() >= EV_VERSION_MINOR);
- if(argc != 2)
- port = PORT;
- else
- port = strtol(argv[1], NULL, 0);
+ parse_args(argc, argv);
srand(time(0));