summaryrefslogtreecommitdiffhomepage
path: root/src/main.c
diff options
context:
space:
mode:
authorrofl0r <rofl0r@users.noreply.github.com>2020-01-15 16:09:41 +0000
committerrofl0r <rofl0r@users.noreply.github.com>2020-01-15 16:09:41 +0000
commitc63d5d26b47b44d70af54aa31f811e4815fe4ad9 (patch)
tree7f2709f94c4249c7f6b8cce4087680faf4ba7bee /src/main.c
parentbffa70500562f0ed675ed8d7e2385925c25f14fc (diff)
access config via a pointer, not a hardcoded struct address
this is required so we can elegantly swap out an old config for a new one in the future and remove lots of boilerplate from config initialization code. unfortunately this is a quite intrusive change as the config struct was accessed in numerous places, but frankly it should have been done via a pointer right from the start. right now, we simply point to a static struct in main.c, so there shouldn't be any noticeable changes in behaviour.
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/src/main.c b/src/main.c
index b4a5e53..4a5f8ea 100644
--- a/src/main.c
+++ b/src/main.c
@@ -47,8 +47,9 @@
/*
* Global Structures
*/
-struct config_s config;
-struct config_s config_defaults;
+struct config_s *config;
+static struct config_s config_main;
+static struct config_s config_defaults;
static const char* config_file;
unsigned int received_sighup = FALSE; /* boolean */
@@ -68,7 +69,7 @@ takesig (int sig)
case SIGINT:
case SIGTERM:
- config.quit = TRUE;
+ config->quit = TRUE;
break;
case SIGCHLD:
@@ -174,16 +175,16 @@ get_id (char *str)
static void
change_user (const char *program)
{
- if (config.group && strlen (config.group) > 0) {
- int gid = get_id (config.group);
+ if (config->group && strlen (config->group) > 0) {
+ int gid = get_id (config->group);
if (gid < 0) {
- struct group *thisgroup = getgrnam (config.group);
+ struct group *thisgroup = getgrnam (config->group);
if (!thisgroup) {
fprintf (stderr,
"%s: Unable to find group \"%s\".\n",
- program, config.group);
+ program, config->group);
exit (EX_NOUSER);
}
@@ -193,7 +194,7 @@ change_user (const char *program)
if (setgid (gid) < 0) {
fprintf (stderr,
"%s: Unable to change to group \"%s\".\n",
- program, config.group);
+ program, config->group);
exit (EX_NOPERM);
}
@@ -208,19 +209,19 @@ change_user (const char *program)
#endif
log_message (LOG_INFO, "Now running as group \"%s\".",
- config.group);
+ config->group);
}
- if (config.user && strlen (config.user) > 0) {
- int uid = get_id (config.user);
+ if (config->user && strlen (config->user) > 0) {
+ int uid = get_id (config->user);
if (uid < 0) {
- struct passwd *thisuser = getpwnam (config.user);
+ struct passwd *thisuser = getpwnam (config->user);
if (!thisuser) {
fprintf (stderr,
"%s: Unable to find user \"%s\".\n",
- program, config.user);
+ program, config->user);
exit (EX_NOUSER);
}
@@ -230,12 +231,12 @@ change_user (const char *program)
if (setuid (uid) < 0) {
fprintf (stderr,
"%s: Unable to change to user \"%s\".\n",
- program, config.user);
+ program, config->user);
exit (EX_NOPERM);
}
log_message (LOG_INFO, "Now running as user \"%s\".",
- config.user);
+ config->user);
}
}
@@ -249,12 +250,14 @@ int reload_config (void)
shutdown_logging ();
- ret = reload_config_file (config_file, &config,
+ ret = reload_config_file (config_file, &config_main,
&config_defaults);
if (ret != 0) {
goto done;
}
+ config = &config_main;
+
ret = setup_logging ();
done:
@@ -308,10 +311,11 @@ main (int argc, char **argv)
initialize_config_defaults (&config_defaults);
if (reload_config_file (config_file,
- &config,
+ &config_main,
&config_defaults)) {
exit (EX_SOFTWARE);
}
+ config = &config_main;
init_stats ();
@@ -325,7 +329,7 @@ main (int argc, char **argv)
}
if (daemonized == TRUE) {
- if (!config.syslog && config.logf_name == NULL)
+ if (!config->syslog && config->logf_name == NULL)
fprintf(stderr, "WARNING: logging deactivated "
"(can't log to stdout when daemonized)\n");
@@ -339,20 +343,20 @@ main (int argc, char **argv)
}
#ifdef FILTER_ENABLE
- if (config.filter)
+ if (config->filter)
filter_init ();
#endif /* FILTER_ENABLE */
/* Start listening on the selected port. */
- if (child_listening_sockets(config.listen_addrs, config.port) < 0) {
+ if (child_listening_sockets(config->listen_addrs, config->port) < 0) {
fprintf (stderr, "%s: Could not create listening sockets.\n",
argv[0]);
exit (EX_OSERR);
}
/* Create pid file before we drop privileges */
- if (config.pidpath) {
- if (pidfile_create (config.pidpath) < 0) {
+ if (config->pidpath) {
+ if (pidfile_create (config->pidpath) < 0) {
fprintf (stderr, "%s: Could not create PID file.\n",
argv[0]);
exit (EX_OSERR);
@@ -403,14 +407,14 @@ main (int argc, char **argv)
child_close_sock ();
/* Remove the PID file */
- if (config.pidpath != NULL && unlink (config.pidpath) < 0) {
+ if (config->pidpath != NULL && unlink (config->pidpath) < 0) {
log_message (LOG_WARNING,
"Could not remove PID file \"%s\": %s.",
- config.pidpath, strerror (errno));
+ config->pidpath, strerror (errno));
}
#ifdef FILTER_ENABLE
- if (config.filter)
+ if (config->filter)
filter_destroy ();
#endif /* FILTER_ENABLE */