Commit Diff


commit - 99c8e404c0aa688453b2438227d88b8781b9a21f
commit + 19d20c12ec99892dbf57f969d478e4108851679e
blob - d9dca464a473c11fc3bad9cac8d40909794c4d98
blob + af1e66d4707e36023c88149e74504cf6212a2afd
--- gotwebd/gotweb.c
+++ gotwebd/gotweb.c
@@ -1395,6 +1395,17 @@ gotweb_shutdown(void)
 		imsgbuf_clear(&gotwebd_env->iev_server->ibuf);
 		free(gotwebd_env->iev_server);
 	}
+
+	sockets_purge(gotwebd_env);
+
+	while (!TAILQ_EMPTY(&gotwebd_env->servers)) {
+		struct server *srv;
+
+		srv = TAILQ_FIRST(&gotwebd_env->servers);
+		TAILQ_REMOVE(&gotwebd_env->servers, srv, entry);
+		free(srv);
+	}
+
 	free(gotwebd_env);
 
 	exit(0);
blob - ff1fed836b983907bed2d75f26d0d48b47d78a6b
blob + 4695b254224421da1c01284653f9c8469a11dce4
--- gotwebd/gotwebd.c
+++ gotwebd/gotwebd.c
@@ -51,7 +51,7 @@ int	 main(int, char **);
 int	 gotwebd_configure(struct gotwebd *, uid_t, gid_t);
 void	 gotwebd_configure_done(struct gotwebd *);
 void	 gotwebd_sighdlr(int sig, short event, void *arg);
-void	 gotwebd_shutdown(void);
+void	 gotwebd_shutdown(int);
 void	 gotwebd_dispatch_server(int, short, void *);
 void	 gotwebd_dispatch_gotweb(int, short, void *);
 
@@ -271,7 +271,7 @@ gotwebd_sighdlr(int sig, short event, void *arg)
 		break;
 	case SIGTERM:
 	case SIGINT:
-		gotwebd_shutdown();
+		gotwebd_shutdown(0);
 		break;
 	default:
 		fatalx("unexpected signal");
@@ -418,11 +418,11 @@ main(int argc, char **argv)
 
 	if (proc_type == GOTWEBD_PROC_PARENT) {
 		if (parse_config(env->gotwebd_conffile, env) == -1)
-			exit(1);
+			gotwebd_shutdown(1);
 
 		if (no_action) {
 			fprintf(stderr, "configuration OK\n");
-			exit(0);
+			gotwebd_shutdown(0);
 		}
 
 		if (env->user)
@@ -548,6 +548,7 @@ main(int argc, char **argv)
 
 	log_debug("%s gotwebd exiting", getprogname());
 
+	gotwebd_shutdown(0);
 	return (0);
 }
 
@@ -636,7 +637,7 @@ gotwebd_configure_done(struct gotwebd *env)
 }
 
 void
-gotwebd_shutdown(void)
+gotwebd_shutdown(int exit_code)
 {
 	struct gotwebd	*env = gotwebd_env;
 	pid_t		 pid;
@@ -689,5 +690,5 @@ gotwebd_shutdown(void)
 	free(gotwebd_env);
 
 	log_warnx("gotwebd terminating");
-	exit(0);
+	exit(exit_code);
 }