git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 14/14] daemon: only use posix features on posix systems

From
Erik Faye-Lund <kusmabite@gmail.com>
Date
Oct 10, 2010, 13:20 UTC
Message-ID
<1286716854-5744-15-git-send-email-kusmabite@gmail.com>
In-Reply-To
<1286716854-5744-1-git-send-email-kusmabite@gmail.com>

Windows does not supply the POSIX-functions fork(), setuuid(), setgid(), setsid() and initgroups(). Disable support for --user, --group and --detach on platforms lacking _POSIX_VERSION.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---

This might be a bit controversial; does anyone know of any systems that implements fork(), setuuid(), setgid() and setsid() but does not define _POSIX_VERSION? Perhaps we should have a separate makefile-switch instead?

 Makefile |    8 +++-----
 daemon.c |   43 +++++++++++++++++++++++++++++++------------
 2 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/Makefile b/Makefile
index 42baa4d..f5992da 100644
--- a/Makefile
+++ b/Makefile
@@ -401,6 +401,7 @@ EXTRA_PROGRAMS =
 # ... and all the rest that could be moved out of bindir to gitexecdir
 PROGRAMS += $(EXTRA_PROGRAMS)
 
+PROGRAM_OBJS += daemon.o
 PROGRAM_OBJS += fast-import.o
 PROGRAM_OBJS += imap-send.o
 PROGRAM_OBJS += shell.o
@@ -1064,7 +1065,6 @@ ifeq ($(uname_S),Windows)
 	NO_SVN_TESTS = YesPlease
 	NO_PERL_MAKEMAKER = YesPlease
 	RUNTIME_PREFIX = YesPlease
-	NO_POSIX_ONLY_PROGRAMS = YesPlease
 	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 	NO_NSEC = YesPlease
 	USE_WIN32_MMAP = YesPlease
@@ -1117,7 +1117,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
 	NO_SVN_TESTS = YesPlease
 	NO_PERL_MAKEMAKER = YesPlease
 	RUNTIME_PREFIX = YesPlease
-	NO_POSIX_ONLY_PROGRAMS = YesPlease
 	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 	NO_NSEC = YesPlease
 	USE_WIN32_MMAP = YesPlease
@@ -1128,6 +1127,8 @@ ifneq (,$(findstring MINGW,$(uname_S)))
 	NO_PYTHON = YesPlease
 	BLK_SHA1 = YesPlease
 	ETAGS_TARGET = ETAGS
+	NO_INET_PTON = YesPlease
+	NO_INET_NTOP = YesPlease
 	COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32
 	COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
 	COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \
@@ -1246,9 +1247,6 @@ ifdef ZLIB_PATH
 endif
 EXTLIBS += -lz
 
-ifndef NO_POSIX_ONLY_PROGRAMS
-	PROGRAM_OBJS += daemon.o
-endif
 ifndef NO_OPENSSL
 	OPENSSL_LIBSSL = -lssl
 	ifdef OPENSSLDIR
diff --git a/daemon.c b/daemon.c
index 54bbec2..56a9bed 100644
--- a/daemon.c
+++ b/daemon.c
@@ -23,10 +23,12 @@ static const char daemon_usage[] =
 "           [--strict-paths] [--base-path=path] [--base-path-relaxed]\n"
 "           [--user-path | --user-path=path]\n"
 "           [--interpolated-path=path]\n"
-"           [--reuseaddr] [--detach] [--pid-file=file]\n"
+"           [--reuseaddr] [--pid-file=file]\n"
 "           [--[enable|disable|allow-override|forbid-override]=service]\n"
 "           [--inetd | [--listen=host_or_ipaddr] [--port=n]\n"
-"                      [--user=user [--group=group]]\n"
+#ifdef _POSIX_VERSION
+"           [--detach] [--user=user [--group=group]]\n"
+#endif
 "           [directory...]";
 
 /* List of acceptable pathname prefixes */
@@ -593,7 +595,7 @@ static struct child {
 	struct sockaddr_storage address;
 } *firstborn;
 
-static void add_child(struct child_process *cld, struct sockaddr *addr, int addrlen)
+static void add_child(struct child_process *cld, struct sockaddr *addr, socklen_t addrlen)
 {
 	struct child *newborn, **cradle;
 
@@ -672,7 +674,7 @@ static char *get_addrstr(int *port, struct sockaddr *addr)
 }
 
 char **cld_argv;
-static void handle(int incoming, struct sockaddr *addr, int addrlen)
+static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
 {
 	struct child_process cld = { 0 };
 	char *addrstr, envbuf[300] = "REMOTE_ADDR=";
@@ -908,7 +910,7 @@ static int service_loop(struct socketlist *socklist)
 		for (i = 0; i < socklist->nr; i++) {
 			if (pfd[i].revents & POLLIN) {
 				struct sockaddr_storage ss;
-				unsigned int sslen = sizeof(ss);
+				socklen_t sslen = sizeof(ss);
 				int incoming = accept(pfd[i].fd, (struct sockaddr *)&ss, &sslen);
 				if (incoming < 0) {
 					switch (errno) {
@@ -938,6 +940,7 @@ static void sanitize_stdfds(void)
 		close(fd);
 }
 
+#ifdef _POSIX_VERSION
 static void daemonize(void)
 {
 	switch (fork()) {
@@ -955,6 +958,7 @@ static void daemonize(void)
 	close(2);
 	sanitize_stdfds();
 }
+#endif
 
 static void store_pid(const char *path)
 {
@@ -965,7 +969,12 @@ static void store_pid(const char *path)
 		die_errno("failed to write pid file '%s'", path);
 }
 
-static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)
+#ifdef _POSIX_VERSION
+static struct passwd *pass;
+static gid_t gid;
+#endif
+
+static int serve(struct string_list *listen_addr, int listen_port)
 {
 	struct socketlist socklist = { NULL, 0, 0 };
 
@@ -974,10 +983,12 @@ static int serve(struct string_list *listen_addr, int listen_port, struct passwd
 		die("unable to allocate any listen sockets on port %u",
 		    listen_port);
 
+#ifdef _POSIX_VERSION
 	if (pass && gid &&
 	    (initgroups(pass->pw_name, gid) || setgid (gid) ||
 	     setuid(pass->pw_uid)))
 		die("cannot drop privileges");
+#endif
 
 	return service_loop(&socklist);
 }
@@ -987,11 +998,11 @@ int main(int argc, char **argv)
 	int listen_port = 0;
 	struct string_list listen_addr = STRING_LIST_INIT_NODUP;
 	int serve_mode = 0, inetd_mode = 0;
-	const char *pid_file = NULL, *user_name = NULL, *group_name = NULL;
+	const char *pid_file = NULL;
+#ifdef _POSIX_VERSION
 	int detach = 0;
-	struct passwd *pass = NULL;
-	struct group *group;
-	gid_t gid = 0;
+	const char *user_name = NULL, *group_name = NULL;
+#endif
 	int i;
 
 	git_extract_argv0_path(argv[0]);
@@ -1080,6 +1091,7 @@ int main(int argc, char **argv)
 			pid_file = arg + 11;
 			continue;
 		}
+#ifdef _POSIX_VERSION
 		if (!strcmp(arg, "--detach")) {
 			detach = 1;
 			log_syslog = 1;
@@ -1093,6 +1105,7 @@ int main(int argc, char **argv)
 			group_name = arg + 8;
 			continue;
 		}
+#endif
 		if (!prefixcmp(arg, "--enable=")) {
 			enable_service(arg + 9, 1);
 			continue;
@@ -1127,14 +1140,17 @@ int main(int argc, char **argv)
 		/* avoid splitting a message in the middle */
 		setvbuf(stderr, NULL, _IOFBF, 4096);
 
+#ifdef _POSIX_VERSION
 	if (inetd_mode && (group_name || user_name))
 		die("--user and --group are incompatible with --inetd");
+#endif
 
 	if (inetd_mode && (listen_port || (listen_addr.nr > 0)))
 		die("--listen= and --port= are incompatible with --inetd");
 	else if (listen_port == 0)
 		listen_port = DEFAULT_GIT_PORT;
 
+#ifdef _POSIX_VERSION
 	if (group_name && !user_name)
 		die("--group supplied without --user");
 
@@ -1146,13 +1162,14 @@ int main(int argc, char **argv)
 		if (!group_name)
 			gid = pass->pw_gid;
 		else {
-			group = getgrnam(group_name);
+			struct group *group = getgrnam(group_name);
 			if (!group)
 				die("group not found - %s", group_name);
 
 			gid = group->gr_gid;
 		}
 	}
+#endif
 
 	if (strict_paths && (!ok_paths || !*ok_paths))
 		die("option --strict-paths requires a whitelist");
@@ -1180,11 +1197,13 @@ int main(int argc, char **argv)
 		return execute(peer);
 	}
 
+#ifdef _POSIX_VERSION
 	if (detach) {
 		daemonize();
 		loginfo("Ready to rumble");
 	}
 	else
+#endif
 		sanitize_stdfds();
 
 	if (pid_file)
@@ -1197,5 +1216,5 @@ int main(int argc, char **argv)
 	cld_argv[argc] = "--serve";
 	cld_argv[argc+1] = NULL;
 
-	return serve(&listen_addr, listen_port, pass, gid);
+	return serve(&listen_addr, listen_port);
 }
-- 
1.7.3.1.51.ge462f.dirty
Previous: Erik Faye-LundNext: Ævar Arnfjörð Bjarmason
Message 42 of 43 in “daemon-win32”
  1. 00/14 daemon-win32Erik Faye-Lund, Oct 10, 2010
  2. 01/14 mingw: add network-wrappers for daemonErik Faye-Lund, Oct 10, 2010
  3. Eric SunshineOct 10, 2010
  4. Erik Faye-LundOct 10, 2010
  5. Eric SunshineOct 10, 2010
  6. 02/14 mingw: implement syslogErik Faye-Lund, Oct 10, 2010
  7. Eric SunshineOct 10, 2010
  8. Erik Faye-LundOct 10, 2010
  9. Johannes SixtOct 10, 2010
  10. Erik Faye-LundOct 10, 2010
  11. Eric SunshineOct 10, 2010
  12. Erik Faye-LundOct 10, 2010
  13. Erik Faye-LundOct 10, 2010
  14. Eric SunshineOct 10, 2010
  15. Erik Faye-LundOct 11, 2010
  16. Erik Faye-LundOct 11, 2010
  17. 03/14 compat: add inet_pton and inet_ntop prototypesErik Faye-Lund, Oct 10, 2010
  18. 04/14 inet_ntop: fix a couple of old-style declsErik Faye-Lund, Oct 10, 2010
  19. 05/14 mingw: use real pidErik Faye-Lund, Oct 10, 2010
  20. Eric SunshineOct 10, 2010
  21. Erik Faye-LundOct 10, 2010
  22. Eric SunshineOct 10, 2010
  23. 06/14 mingw: support waitpid with pid > 0 and WNOHANGErik Faye-Lund, Oct 10, 2010
  24. 07/14 mingw: add kill emulationErik Faye-Lund, Oct 10, 2010
  25. 08/14 daemon: use run-command api for async servingErik Faye-Lund, Oct 10, 2010
  26. Eric SunshineOct 10, 2010
  27. Erik Faye-LundOct 10, 2010
  28. 09/14 daemon: use full buffered mode for stderrErik Faye-Lund, Oct 10, 2010
  29. 10/14 Improve the mingw getaddrinfo stub to handle more use casesErik Faye-Lund, Oct 10, 2010
  30. 11/14 daemon: report connection from root-processErik Faye-Lund, Oct 10, 2010
  31. Johannes SixtOct 10, 2010
  32. Erik Faye-LundOct 10, 2010
  33. Erik Faye-LundOct 10, 2010
  34. Ævar Arnfjörð BjarmasonOct 10, 2010
  35. Erik Faye-LundOct 10, 2010
  36. 12/14 mingw: import poll-emulation from gnulibErik Faye-Lund, Oct 10, 2010
  37. Ævar Arnfjörð BjarmasonOct 10, 2010
  38. Erik Faye-LundOct 10, 2010
  39. Erik Faye-LundOct 10, 2010
  40. Ævar Arnfjörð BjarmasonOct 10, 2010
  41. 13/14 mingw: use poll-emulation from gnulibErik Faye-Lund, Oct 10, 2010
  42. 14/14 daemon: only use posix features on posix systemsErik Faye-Lund, Oct 10, 2010
  43. Ævar Arnfjörð BjarmasonOct 10, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.