The git-daemon command currently doesn't work and displays the following error whenever a repository is cloned: error: cannot run daemon: No such file or directory [10920] unable to fork On the client side the connection is simply terminated. The problem is, that git-daemon tries to start a new instance of itself for every new client that is connecting. It expects argv[0] to contain "git-daemon", but since it is converted into a builtin command, argv[0] only contains "daemon", which does not exist and causes the above error. The fix simply prepends "git" to the list of arguments, so that the resulting call looks something like "git daemon --serve ..." Signed-off-by: Andreas Rohner <andreas.rohner@gmx.net>
252 lines
8.1 KiB
Diff
252 lines
8.1 KiB
Diff
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -533,16 +533,7 @@ EXTRA_PROGRAMS =
|
|
# ... and all the rest that could be moved out of bindir to gitexecdir
|
|
PROGRAMS += $(EXTRA_PROGRAMS)
|
|
|
|
-PROGRAM_OBJS += credential-store.o
|
|
-PROGRAM_OBJS += daemon.o
|
|
-PROGRAM_OBJS += fast-import.o
|
|
-PROGRAM_OBJS += http-backend.o
|
|
-PROGRAM_OBJS += imap-send.o
|
|
-PROGRAM_OBJS += sh-i18n--envsubst.o
|
|
-PROGRAM_OBJS += shell.o
|
|
-PROGRAM_OBJS += show-index.o
|
|
-PROGRAM_OBJS += upload-pack.o
|
|
-PROGRAM_OBJS += remote-testsvn.o
|
|
+PROGRAM_OBJS =
|
|
|
|
# Binary suffix, set to .exe for Windows builds
|
|
X =
|
|
@@ -1007,6 +998,12 @@ BUILTIN_OBJS += builtin/verify-commit.o
|
|
BUILTIN_OBJS += builtin/verify-pack.o
|
|
BUILTIN_OBJS += builtin/verify-tag.o
|
|
BUILTIN_OBJS += builtin/write-tree.o
|
|
+BUILTIN_OBJS += builtin/daemon.o
|
|
+BUILTIN_OBJS += builtin/fast-import.o
|
|
+BUILTIN_OBJS += builtin/http-backend.o
|
|
+BUILTIN_OBJS += builtin/imap-send.o
|
|
+BUILTIN_OBJS += builtin/shell.o
|
|
+BUILTIN_OBJS += builtin/upload-pack.o
|
|
|
|
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
|
EXTLIBS =
|
|
@@ -1174,7 +1171,7 @@ endif
|
|
EXTLIBS += -lz
|
|
|
|
ifndef NO_OPENSSL
|
|
- OPENSSL_LIBSSL = -lssl
|
|
+ EXTLIBS += -lssl
|
|
ifdef OPENSSLDIR
|
|
BASIC_CFLAGS += -I$(OPENSSLDIR)/include
|
|
OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
|
|
@@ -2067,10 +2064,6 @@ endif
|
|
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
|
|
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
|
|
|
|
-git-imap-send$X: imap-send.o GIT-LDFLAGS $(GITLIBS)
|
|
- $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
|
- $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
|
|
-
|
|
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
|
|
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
|
$(LIBS) $(CURL_LIBCURL)
|
|
@@ -2388,24 +2381,22 @@ endif
|
|
bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
|
|
execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
|
|
{ test "$$bindir/" = "$$execdir/" || \
|
|
- for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
|
|
+ for p in $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
|
|
$(RM) "$$execdir/$$p" && \
|
|
test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
|
|
- ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
|
|
+ ln -s git "$$execdir/$$p" 2>/dev/null || \
|
|
cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
|
|
done; \
|
|
} && \
|
|
for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
|
|
$(RM) "$$bindir/$$p" && \
|
|
test -z "$(NO_INSTALL_HARDLINKS)" && \
|
|
- ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \
|
|
ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \
|
|
cp "$$bindir/git$X" "$$bindir/$$p" || exit; \
|
|
done && \
|
|
for p in $(BUILT_INS); do \
|
|
$(RM) "$$execdir/$$p" && \
|
|
test -z "$(NO_INSTALL_HARDLINKS)" && \
|
|
- ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \
|
|
ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
|
|
cp "$$execdir/git$X" "$$execdir/$$p" || exit; \
|
|
done && \
|
|
--- a/builtin.h
|
|
+++ b/builtin.h
|
|
@@ -137,5 +137,11 @@ extern int cmd_verify_pack(int argc, con
|
|
extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
|
|
extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
|
|
extern int cmd_replace(int argc, const char **argv, const char *prefix);
|
|
+extern int cmd_daemon(int argc, char **argv, const char *prefix);
|
|
+extern int cmd_fast_import(int argc, char **argv, const char *prefix);
|
|
+extern int cmd_http_backend(int argc, char **argv, const char *prefix);
|
|
+extern int cmd_imap_send(int argc, char **argv, const char *prefix);
|
|
+extern int cmd_shell(int argc, char **argv, const char *prefix);
|
|
+extern int cmd_upload_pack(int argc, char **argv, const char *prefix);
|
|
|
|
#endif
|
|
--- /dev/null
|
|
+++ b/builtin/daemon.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../daemon.c"
|
|
--- /dev/null
|
|
+++ b/builtin/fast-import.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../fast-import.c"
|
|
--- /dev/null
|
|
+++ b/builtin/http-backend.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../http-backend.c"
|
|
--- /dev/null
|
|
+++ b/builtin/imap-send.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../imap-send.c"
|
|
--- /dev/null
|
|
+++ b/builtin/shell.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../shell.c"
|
|
--- /dev/null
|
|
+++ b/builtin/upload-pack.c
|
|
@@ -0,0 +1 @@
|
|
+#include "../upload-pack.c"
|
|
--- a/daemon.c
|
|
+++ b/daemon.c
|
|
@@ -1119,7 +1119,7 @@ static int serve(struct string_list *lis
|
|
return service_loop(&socklist);
|
|
}
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_daemon(int argc, char **argv, const char *prefix)
|
|
{
|
|
int listen_port = 0;
|
|
struct string_list listen_addr = STRING_LIST_INIT_NODUP;
|
|
@@ -1315,12 +1315,13 @@
|
|
store_pid(pid_file);
|
|
|
|
/* prepare argv for serving-processes */
|
|
- cld_argv = xmalloc(sizeof (char *) * (argc + 2));
|
|
- cld_argv[0] = argv[0]; /* git-daemon */
|
|
- cld_argv[1] = "--serve";
|
|
+ cld_argv = xmalloc(sizeof (char *) * (argc + 3));
|
|
+ cld_argv[0] = "git";
|
|
+ cld_argv[1] = argv[0]; /* daemon */
|
|
+ cld_argv[2] = "--serve";
|
|
for (i = 1; i < argc; ++i)
|
|
- cld_argv[i+1] = argv[i];
|
|
- cld_argv[argc+1] = NULL;
|
|
+ cld_argv[i+2] = argv[i];
|
|
+ cld_argv[argc+2] = NULL;
|
|
|
|
return serve(&listen_addr, listen_port, cred);
|
|
}
|
|
--- a/fast-import.c
|
|
+++ b/fast-import.c
|
|
@@ -3343,7 +3343,7 @@ static void parse_argv(void)
|
|
read_marks();
|
|
}
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_fast_import(int argc, char **argv, const char *prefix)
|
|
{
|
|
unsigned int i;
|
|
|
|
--- a/git.c
|
|
+++ b/git.c
|
|
@@ -312,11 +312,11 @@ static int handle_alias(int *argcp, cons
|
|
|
|
struct cmd_struct {
|
|
const char *cmd;
|
|
- int (*fn)(int, const char **, const char *);
|
|
+ int (*fn)(int, char **, const char *);
|
|
int option;
|
|
};
|
|
|
|
-static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
|
|
+static int run_builtin(struct cmd_struct *p, int argc, char **argv)
|
|
{
|
|
int status, help;
|
|
struct stat st;
|
|
@@ -396,6 +396,7 @@ static struct cmd_struct commands[] = {
|
|
{ "config", cmd_config, RUN_SETUP_GENTLY },
|
|
{ "count-objects", cmd_count_objects, RUN_SETUP },
|
|
{ "credential", cmd_credential, RUN_SETUP_GENTLY },
|
|
+ { "daemon", cmd_daemon },
|
|
{ "describe", cmd_describe, RUN_SETUP },
|
|
{ "diff", cmd_diff },
|
|
{ "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
|
|
@@ -414,6 +415,8 @@ static struct cmd_struct commands[] = {
|
|
{ "grep", cmd_grep, RUN_SETUP_GENTLY },
|
|
{ "hash-object", cmd_hash_object },
|
|
{ "help", cmd_help },
|
|
+ { "http-backend", cmd_http_backend },
|
|
+ { "imap-send", cmd_imap_send },
|
|
{ "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
|
|
{ "init", cmd_init_db, NO_SETUP },
|
|
{ "init-db", cmd_init_db, NO_SETUP },
|
|
@@ -461,6 +464,7 @@ static struct cmd_struct commands[] = {
|
|
{ "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
|
|
{ "rm", cmd_rm, RUN_SETUP },
|
|
{ "send-pack", cmd_send_pack, RUN_SETUP },
|
|
+ { "shell", cmd_shell },
|
|
{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
|
|
{ "show", cmd_show, RUN_SETUP },
|
|
{ "show-branch", cmd_show_branch, RUN_SETUP },
|
|
@@ -477,6 +481,7 @@ static struct cmd_struct commands[] = {
|
|
{ "update-server-info", cmd_update_server_info, RUN_SETUP },
|
|
{ "upload-archive", cmd_upload_archive },
|
|
{ "upload-archive--writer", cmd_upload_archive_writer },
|
|
+ { "upload-pack", cmd_upload_pack },
|
|
{ "var", cmd_var, RUN_SETUP_GENTLY },
|
|
{ "verify-commit", cmd_verify_commit, RUN_SETUP },
|
|
{ "verify-pack", cmd_verify_pack },
|
|
--- a/http-backend.c
|
|
+++ b/http-backend.c
|
|
@@ -566,7 +566,7 @@ static struct service_cmd {
|
|
{"POST", "/git-receive-pack$", service_rpc}
|
|
};
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_http_backend(int argc, char **argv, const char *prefix)
|
|
{
|
|
char *method = getenv("REQUEST_METHOD");
|
|
char *dir;
|
|
--- a/imap-send.c
|
|
+++ b/imap-send.c
|
|
@@ -1365,7 +1365,7 @@ static int git_imap_config(const char *k
|
|
return 0;
|
|
}
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_imap_send(int argc, char **argv, const char *prefix)
|
|
{
|
|
struct strbuf all_msgs = STRBUF_INIT;
|
|
struct strbuf msg = STRBUF_INIT;
|
|
--- a/shell.c
|
|
+++ b/shell.c
|
|
@@ -138,7 +138,7 @@ static struct commands {
|
|
{ NULL },
|
|
};
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_shell(int argc, char **argv, const char *prefix)
|
|
{
|
|
char *prog;
|
|
const char **user_argv;
|
|
--- a/upload-pack.c
|
|
+++ b/upload-pack.c
|
|
@@ -790,7 +790,7 @@ static int upload_pack_config(const char
|
|
return parse_hide_refs_config(var, value, "uploadpack");
|
|
}
|
|
|
|
-int main(int argc, char **argv)
|
|
+int cmd_upload_pack(int argc, char **argv, const char *prefix)
|
|
{
|
|
char *dir;
|
|
int i;
|