From: Erik Faye-Lund <kusmabite@googlemail.com>
To: msysgit@googlegroups.com
Cc: git@vger.kernel.org, j6t@kdbg.org, Erik Faye-Lund <kusmabite@gmail.com>
Subject: [PATCH v2 08/14] daemon: use explicit file descriptor
Date: Fri, 15 Jan 2010 22:30:27 +0100 [thread overview]
Message-ID: <1263591033-4992-9-git-send-email-kusmabite@gmail.com> (raw)
In-Reply-To: <1263591033-4992-1-git-send-email-kusmabite@gmail.com>
This patch adds support to specify an explicit file
descriotor for communication with the client, instead
of using stdin/stdout.
This will be useful for the Windows port, because it
will use threads instead of fork() to serve multiple
clients, making it impossible to reuse stdin/stdout.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
daemon.c | 43 +++++++++++++++++++++----------------------
1 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/daemon.c b/daemon.c
index 79ba1aa..b42792f 100644
--- a/daemon.c
+++ b/daemon.c
@@ -218,7 +218,7 @@ static char *path_ok(char *directory)
return NULL; /* Fallthrough. Deny by default */
}
-typedef int (*daemon_service_fn)(void);
+typedef int (*daemon_service_fn)(int [2]);
struct daemon_service {
const char *name;
const char *config_name;
@@ -242,7 +242,7 @@ static int git_daemon_config(const char *var, const char *value, void *cb)
return 0;
}
-static int run_service(char *dir, struct daemon_service *service)
+static int run_service(int fd[2], char *dir, struct daemon_service *service)
{
const char *path;
int enabled = service->enabled;
@@ -295,7 +295,7 @@ static int run_service(char *dir, struct daemon_service *service)
*/
signal(SIGTERM, SIG_IGN);
- return service->fn();
+ return service->fn(fd);
}
static void copy_to_log(int fd)
@@ -319,7 +319,7 @@ static void copy_to_log(int fd)
fclose(fp);
}
-static int run_service_command(const char **argv)
+static int run_service_command(int fd[2], const char **argv)
{
struct child_process cld;
@@ -327,37 +327,36 @@ static int run_service_command(const char **argv)
cld.argv = argv;
cld.git_cmd = 1;
cld.err = -1;
+ cld.in = fd[0];
+ cld.out = fd[1];
if (start_command(&cld))
return -1;
- close(0);
- close(1);
-
copy_to_log(cld.err);
return finish_command(&cld);
}
-static int upload_pack(void)
+static int upload_pack(int fd[2])
{
/* Timeout as string */
char timeout_buf[64];
const char *argv[] = { "upload-pack", "--strict", timeout_buf, ".", NULL };
snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout);
- return run_service_command(argv);
+ return run_service_command(fd, argv);
}
-static int upload_archive(void)
+static int upload_archive(int fd[2])
{
static const char *argv[] = { "upload-archive", ".", NULL };
- return run_service_command(argv);
+ return run_service_command(fd, argv);
}
-static int receive_pack(void)
+static int receive_pack(int fd[2])
{
static const char *argv[] = { "receive-pack", ".", NULL };
- return run_service_command(argv);
+ return run_service_command(fd, argv);
}
static struct daemon_service daemon_service[] = {
@@ -487,7 +486,7 @@ static void parse_host_arg(char *extra_args, int buflen)
}
-static int execute(struct sockaddr *addr)
+static int execute(int fd[2], struct sockaddr *addr)
{
static char line[1000];
int pktlen, len, i;
@@ -520,7 +519,7 @@ static int execute(struct sockaddr *addr)
}
alarm(init_timeout ? init_timeout : timeout);
- pktlen = packet_read_line(0, line, sizeof(line));
+ pktlen = packet_read_line(fd[0], line, sizeof(line));
alarm(0);
len = strlen(line);
@@ -552,7 +551,7 @@ static int execute(struct sockaddr *addr)
* Note: The directory here is probably context sensitive,
* and might depend on the actual service being performed.
*/
- return run_service(line + namelen + 5, s);
+ return run_service(fd, line + namelen + 5, s);
}
}
@@ -652,6 +651,7 @@ static void check_dead_children(void)
static void handle(int incoming, struct sockaddr *addr, int addrlen)
{
+ int fd[2];
pid_t pid;
if (max_connections && live_children >= max_connections) {
@@ -676,11 +676,9 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)
return;
}
- dup2(incoming, 0);
- dup2(incoming, 1);
- close(incoming);
-
- exit(execute(addr));
+ fd[0] = incoming;
+ fd[1] = dup(incoming);
+ exit(execute(fd, addr));
}
static void child_handler(int signo)
@@ -1107,6 +1105,7 @@ int main(int argc, char **argv)
base_path);
if (inetd_mode) {
+ int fd[2] = { 0, 1 };
struct sockaddr_storage ss;
struct sockaddr *peer = (struct sockaddr *)&ss;
socklen_t slen = sizeof(ss);
@@ -1117,7 +1116,7 @@ int main(int argc, char **argv)
if (getpeername(0, peer, &slen))
peer = NULL;
- return execute(peer);
+ return execute(fd, peer);
}
if (detach) {
--
1.6.6.211.g26720
next prev parent reply other threads:[~2010-01-15 21:31 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-15 21:30 [PATCH v2 00/14] daemon-win32 Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 01/14] mingw: add network-wrappers for daemon Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 02/14] mingw: implement syslog Erik Faye-Lund
2010-01-15 22:57 ` [msysGit] " Janos Laube
2010-01-15 23:01 ` Erik Faye-Lund
2010-01-15 23:09 ` Janos Laube
2010-01-15 21:30 ` [PATCH v2 03/14] compat: add inet_pton and inet_ntop prototypes Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 04/14] inet_ntop: fix a couple of old-style decls Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 05/14] mingw: support waitpid with pid > 0 and WNOHANG Erik Faye-Lund
2010-01-15 22:28 ` Johannes Sixt
2010-01-16 21:57 ` Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 06/14] mingw: use real pid Erik Faye-Lund
2010-01-15 22:30 ` Johannes Sixt
2010-01-15 22:53 ` Erik Faye-Lund
2010-01-16 8:03 ` Johannes Sixt
2010-01-16 9:12 ` Erik Faye-Lund
2010-01-18 22:33 ` Erik Faye-Lund
2010-01-19 18:19 ` Johannes Sixt
2010-01-19 19:23 ` Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 07/14] mingw: add kill emulation Erik Faye-Lund
2010-01-15 22:31 ` Johannes Sixt
2010-01-16 21:56 ` Erik Faye-Lund
2010-01-15 21:30 ` Erik Faye-Lund [this message]
2010-01-15 22:36 ` [PATCH v2 08/14] daemon: use explicit file descriptor Johannes Sixt
2010-01-16 21:52 ` Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 09/14] daemon: use run-command api for async serving Erik Faye-Lund
2010-01-15 22:42 ` Johannes Sixt
2010-01-15 21:30 ` [PATCH v2 10/14] daemon: use full buffered mode for stderr Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 11/14] mingw: compile git-daemon Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 12/14] Improve the mingw getaddrinfo stub to handle more use cases Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 13/14] daemon: use select() instead of poll() Erik Faye-Lund
2010-01-15 22:49 ` Johannes Sixt
2010-01-15 23:08 ` Erik Faye-Lund
2010-01-15 23:23 ` Erik Faye-Lund
2010-01-16 8:06 ` Johannes Sixt
2010-01-16 9:26 ` Erik Faye-Lund
2010-01-16 10:38 ` Johannes Sixt
2010-01-16 11:05 ` Erik Faye-Lund
2010-01-16 11:27 ` Andreas Schwab
2010-01-16 11:43 ` Erik Faye-Lund
2010-01-16 12:36 ` Johannes Sixt
2010-01-16 21:31 ` Erik Faye-Lund
2010-01-16 8:08 ` Johannes Sixt
2010-01-16 9:14 ` Erik Faye-Lund
2010-01-16 10:44 ` Johannes Sixt
2010-01-16 10:59 ` Erik Faye-Lund
2010-01-15 21:30 ` [PATCH v2 14/14] daemon: report connection from root-process Erik Faye-Lund
2010-01-15 22:27 ` [PATCH v2 00/14] daemon-win32 Johannes Sixt
2010-01-15 22:51 ` Erik Faye-Lund
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1263591033-4992-9-git-send-email-kusmabite@gmail.com \
--to=kusmabite@googlemail.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=kusmabite@gmail.com \
--cc=msysgit@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).