diff options
-rw-r--r-- | config.c | 11 | ||||
-rw-r--r-- | config.h | 1 | ||||
-rw-r--r-- | pullreqd.c | 20 |
3 files changed, 31 insertions, 1 deletions
@@ -105,6 +105,17 @@ void set_config_opt(config *conf, config_type type, size_t offset, config_val va } } +void cleanup_config(config *conf) { + char *cfg = (char *)conf; + for (const config_opt *opt = config_opts; opt->name != NULL; opt++) { + /* Is this config option's type a string, and is the string of that config option in conf not NULL? */ + if (opt->type == TYPE_STRING && *(char **)(cfg+opt->offset) != NULL) { + free(*(char **)(cfg+opt->offset)); + } + } + free(conf); +} + config *parse_config(const char *filename) { /* Size of the file, in bytes. */ long filesize = 0; @@ -52,4 +52,5 @@ static const config_opt config_opts[] = { }; extern config *parse_config(const char *filename); +extern void cleanup_config(config *conf); #endif @@ -110,6 +110,22 @@ int main_loop(config *cfg, int listen_socket) { for (; !done;) { break; } + + return 0; +} + +void cleanup(config *cfg, int listen_socket) { + if (listen_socket > 0) { + close(listen_socket); + /* Is this a unix domain socket? */ + if (!strcasecmp(cfg->sock_type, "unix")) { + unlink(cfg->sock); + } + } + + if (cfg) { + cleanup_config(cfg); + } } int main(int argc, char **argv) { @@ -136,9 +152,11 @@ int main(int argc, char **argv) { exit_status = main_loop(cfg, listen_socket); } + cleanup(cfg, listen_socket); + syslog(LOG_NOTICE, "pullreqd stopped."); closelog(); - return EXIT_SUCCESS; + return exit_status; } |