diff options
| author | David Härdeman <david@hardeman.nu> | 2020-06-22 10:50:15 +0200 | 
|---|---|---|
| committer | David Härdeman <david@hardeman.nu> | 2020-06-22 10:50:15 +0200 | 
| commit | 31afd2aaaeb76a12e232eab0fb6a550b73948737 (patch) | |
| tree | 7125a54d09904eef6c558a682cff0a7976529fad /main.c | |
| parent | 41dc97f5d0dbcfe4399656c9aabb597f6366ca23 (diff) | |
Make struct cfg global and make the corresponding changes throughout
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 95 | 
1 files changed, 41 insertions, 54 deletions
@@ -31,6 +31,7 @@  #define DEFAULT_MAIN_CONFIG_FILE_PATH "./mcproxy.conf"  /* Global, not in struct cfg since they're too low-level */ +struct cfg *cfg = NULL;  bool exiting = false;  unsigned debug_mask = DBG_ERROR | DBG_INFO; @@ -38,7 +39,6 @@ unsigned debug_mask = DBG_ERROR | DBG_INFO;  static bool daemonize = false;  static FILE *log_file = NULL;  static const char *log_file_path = NULL; -static struct cfg *cfghack = NULL;  #define ANSI_RED	"\x1B[0;31m"  #define ANSI_GREEN	"\x1B[0;32m" @@ -177,9 +177,9 @@ __die(const char *fmt, ...)  static void  cfg_free(struct uring_task *task)  { -	struct cfg *cfg = container_of(task, struct cfg, task); +	struct cfg *xcfg = container_of(task, struct cfg, task); -	assert_return(task); +	assert_return(task && xcfg == cfg);  	debug(DBG_SIG, "called");  	systemd_delete(cfg); @@ -214,7 +214,7 @@ struct cfg_key_value_map mcfg_key_map[] = {  };  static void -cfg_read(struct cfg *cfg) +cfg_read()  {  	FILE *cfgfile;  	const char *path; @@ -261,7 +261,7 @@ cfg_read(struct cfg *cfg)  	*pos = '\0';  	pos = buf; -	if (!config_parse_header(cfg, path, "mcproxy", &pos)) +	if (!config_parse_header(path, "mcproxy", &pos))  		die("main config file (%s) invalid", path);  	while (true) { @@ -269,7 +269,7 @@ cfg_read(struct cfg *cfg)  		const char *keyname;  		struct cfg_value value; -		if (!config_parse_line(cfg, path, &pos, mcfg_key_map, +		if (!config_parse_line(path, &pos, mcfg_key_map,  				       &key, &keyname, &value))  			break; @@ -370,10 +370,9 @@ usage(int argc, char **argv, bool invalid)  	exit(invalid ? EXIT_FAILURE : EXIT_SUCCESS);  } -static struct cfg * +static void  cfg_init(int argc, char **argv)  { -	struct cfg *cfg;  	int c;  	unsigned i; @@ -385,7 +384,7 @@ cfg_init(int argc, char **argv)  	cfg->uid = geteuid();  	cfg->gid = getegid(); -	uring_task_init(cfg, &cfg->task, "main", NULL, cfg_free); +	uring_task_init(&cfg->task, "main", NULL, cfg_free);  	list_init(&cfg->servers);  	while (true) { @@ -482,16 +481,11 @@ cfg_init(int argc, char **argv)  	if (!cfg->homedir)  		cfg->homedir = DEFAULT_HOMEDIR_PATH; - -	return cfg;  }  static void -cfg_apply(struct cfg *cfg) +cfg_apply()  { -	if (!cfg) -		die("invalid arguments"); -  	if (cfg->uid == 0 || cfg->gid == 0)  		/* This catches both -u root and running as root without -u */  		die("Execution as root is not supported (use -u <someuser>)"); @@ -544,7 +538,6 @@ cfg_apply(struct cfg *cfg)  }  struct signalfd_ev { -	struct cfg *cfg;  	struct uring_task task;  	struct uring_task_buf tbuf;  	int pipe[2]; @@ -559,17 +552,15 @@ signalfd_free(struct uring_task *task)  	debug(DBG_SIG, "called");  	close(sev->pipe[PIPE_WR]); -	sev->cfg->sev = NULL; +	cfg->sev = NULL;  	xfree(sev);  }  static void -dump_tree(struct cfg *cfg) +dump_tree()  {  	struct server *server; -	assert_return(cfg); -  	if (!debug_enabled(DBG_REF))  		return; @@ -592,14 +583,14 @@ dump_tree(struct cfg *cfg)  }  static void -signalfd_read(struct cfg *cfg, struct uring_task *task, int res) +signalfd_read(struct uring_task *task, int res)  {  	struct signalfd_ev *sev = container_of(task, struct signalfd_ev, task);  	struct server *server, *stmp;  	static unsigned count = 0;  	siginfo_t *si; -	assert_return(cfg && task); +	assert_return(task);  	assert_task_alive(DBG_SIG, task);  	si = (siginfo_t *)task->tbuf->buf; @@ -630,7 +621,7 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res)  	case SIGUSR2:  		debug(DBG_SIG, "got a SIGUSR2"); -		dump_tree(cfg); +		dump_tree();  		break;  	case SIGTERM: @@ -644,21 +635,21 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res)  	case SIGHUP:  		count++;  		if (count > 5) { -			dump_tree(cfghack); +			dump_tree();  			exit(EXIT_FAILURE);  		}  		verbose("got a signal to dump tree");  		sd_notifyf(0, "STOPPING=1\nSTATUS=Received signal, exiting"); -		dump_tree(cfg); -		uring_task_put(cfg, &sev->task); -		igmp_delete(cfg); -		announce_delete(cfg); -		idle_delete(cfg); -		cfgdir_delete(cfg); +		dump_tree(); +		uring_task_put(&sev->task); +		igmp_delete(); +		announce_delete(); +		idle_delete(); +		cfgdir_delete();  		list_for_each_entry_safe(server, stmp, &cfg->servers, list) -			server_delete(cfg, server); -		uring_delete(cfg); +			server_delete(server); +		uring_delete();  		return;  	default: @@ -667,7 +658,7 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res)  	}  out: -	uring_tbuf_read(cfg, &sev->task, signalfd_read); +	uring_tbuf_read(&sev->task, signalfd_read);  }  static void @@ -677,20 +668,18 @@ hack_signal_handler(int signum, siginfo_t *si, void *ucontext)  	assert_return(signum > 0 && si); -	r = write(cfghack->sev->pipe[PIPE_WR], si, sizeof(*si)); +	r = write(cfg->sev->pipe[PIPE_WR], si, sizeof(*si));  	if (r != sizeof(*si))  		error("write: %zi\n", r);  }  static void -signalfd_init(struct cfg *cfg) +signalfd_init()  {  	//sigset_t mask;  	struct signalfd_ev *sev; -	assert_return(cfg); -  	sev = zmalloc(sizeof(*sev));  	if (!sev)  		die("malloc: %m"); @@ -725,31 +714,28 @@ signalfd_init(struct cfg *cfg)  	debug(DBG_SIG, "using pipe fds %i -> %i",  	      sev->pipe[PIPE_WR], sev->pipe[PIPE_RD]); -	uring_task_init(cfg, &sev->task, "signal", uring_parent(cfg), signalfd_free); +	uring_task_init(&sev->task, "signal", uring_parent(), signalfd_free);  	uring_task_set_fd(&sev->task, sev->pipe[PIPE_RD]);  	uring_task_set_buf(&sev->task, &sev->tbuf);  	cfg->sev = sev; -	sev->cfg = cfg; -	uring_tbuf_read(cfg, &sev->task, signalfd_read); +	uring_tbuf_read(&sev->task, signalfd_read);  }  int  main(int argc, char **argv)  { -	struct cfg *cfg;  	struct server *server;  	unsigned server_count; -	cfg = cfg_init(argc, argv); -	cfghack = cfg; +	cfg_init(argc, argv); -	cfg_apply(cfg); +	cfg_apply(); -	cfg_read(cfg); +	cfg_read(); -	uring_init(cfg); +	uring_init(); -	igmp_init(cfg); +	igmp_init();  	/* Drop CAP_NET_RAW (if we have it), only used for igmp */  	capng_clear(CAPNG_SELECT_BOTH); @@ -765,17 +751,17 @@ main(int argc, char **argv)  			die("capng_apply failed");  	} -	signalfd_init(cfg); +	signalfd_init(); -	cfgdir_init(cfg); +	cfgdir_init(); -	announce_init(cfg); +	announce_init(); -	announce_start(cfg->aev); +	announce_start(); -	idle_init(cfg); +	idle_init(); -	uring_task_put(cfg, &cfg->task); +	uring_task_put(&cfg->task);  	server_count = 0;  	list_for_each_entry(server, &cfg->servers, list) @@ -790,11 +776,12 @@ main(int argc, char **argv)  	info("mcproxy started, %u server configurations loaded",  	     server_count); -	uring_event_loop(cfg); +	uring_event_loop();  	verbose("Exiting");  	xfree(cfg); +	cfg = NULL;  	if (debug_enabled(DBG_MALLOC))  		debug_resource_usage();  | 
