clean up server/main by moving cli option handling to separate files
This commit is contained in:
parent
2db264c027
commit
867bbb1c37
@ -1,67 +1,25 @@
|
||||
// main.c
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
#include "error.h"
|
||||
#include "daemon.h"
|
||||
|
||||
struct options_t {
|
||||
bool daemonise;
|
||||
};
|
||||
|
||||
|
||||
static enum error_t parse_arguments(
|
||||
struct options_t *options,
|
||||
int argc, char **argv
|
||||
) {
|
||||
static struct option const long_options[] = {
|
||||
{ "daemon", no_argument, 0, 'd' },
|
||||
};
|
||||
|
||||
while (true) {
|
||||
int option_index = 0;
|
||||
|
||||
int c = getopt_long(argc, argv, "d", long_options, &option_index);
|
||||
if (c == -1) break;
|
||||
|
||||
switch (c) {
|
||||
case 'd': options->daemonise = true; break;
|
||||
default: return ERR_INPUT;
|
||||
}
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
#include "opts.h"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
enum error_t err = ERR_OK;
|
||||
|
||||
struct options_t options = { false };
|
||||
err = parse_arguments(&options, argc, argv);
|
||||
err = opts_parse(&options, argc, argv);
|
||||
if (err) goto handle_error;
|
||||
|
||||
if (options.daemonise) {
|
||||
err = daemonise();
|
||||
if (err) goto handle_error;
|
||||
err = opts_init(&options);
|
||||
if (err) goto handle_error;
|
||||
|
||||
openlog(NULL, LOG_PID, LOG_DAEMON);
|
||||
syslog(LOG_NOTICE, "Daemon initialised");
|
||||
}
|
||||
|
||||
goto handle_exit;
|
||||
// Is this the best way to do this? I didn't want to duplicate
|
||||
// closing the syslog
|
||||
opts_free(&options);
|
||||
return ERR_OK;
|
||||
|
||||
handle_error:
|
||||
printf("ERROR: %s\n", ERROR_STRS[err]);
|
||||
handle_exit:
|
||||
if (options.daemonise) closelog();
|
||||
return err;
|
||||
}
|
||||
|
53
server/src/opts.c
Normal file
53
server/src/opts.c
Normal file
@ -0,0 +1,53 @@
|
||||
// opts.c
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <sys/syslog.h>
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
#include "opts.h"
|
||||
#include "daemon.h"
|
||||
|
||||
enum error_t opts_parse(struct options_t *options, int argc, char **argv) {
|
||||
struct option const long_options[] = {
|
||||
{ "daemon", no_argument, 0, 'd' },
|
||||
};
|
||||
|
||||
while (true) {
|
||||
int option_index = 0;
|
||||
|
||||
int c = getopt_long(argc, argv, "d", long_options, &option_index);
|
||||
if (c == -1) break;
|
||||
|
||||
switch (c) {
|
||||
case 'd': options->daemonise = true; break;
|
||||
default: return ERR_INPUT;
|
||||
}
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
enum error_t opts_init(struct options_t const *options) {
|
||||
assert(options != NULL);
|
||||
enum error_t err = ERR_OK;
|
||||
|
||||
if (options->daemonise) {
|
||||
err = daemonise();
|
||||
if (err) return err;
|
||||
|
||||
openlog(NULL, LOG_PID, LOG_DAEMON);
|
||||
syslog(LOG_NOTICE, "Daemon initialised :-)");
|
||||
}
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
void opts_free(struct options_t const *options) {
|
||||
assert(options != NULL);
|
||||
|
||||
if (options->daemonise) closelog();
|
||||
}
|
16
server/src/opts.h
Normal file
16
server/src/opts.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef OPTS_H
|
||||
#define OPTS_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "error.h"
|
||||
|
||||
struct options_t {
|
||||
bool daemonise;
|
||||
};
|
||||
|
||||
enum error_t opts_parse(struct options_t *, int, char **);
|
||||
enum error_t opts_init(struct options_t const *);
|
||||
void opts_free(struct options_t const *);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user