cvsimport: Add -S <skipfileregex> support and -v announces files retrieved
[git.git] / daemon.c
index 539f6e8..bb014fa 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -9,13 +9,15 @@
 #include <syslog.h>
 #include "pkt-line.h"
 #include "cache.h"
+#include "exec_cmd.h"
 
 static int log_syslog;
 static int verbose;
 
 static const char daemon_usage[] =
 "git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n"
-"           [--timeout=n] [--init-timeout=n] [--strict-paths] [directory...]";
+"           [--timeout=n] [--init-timeout=n] [--strict-paths]\n"
+"           [--base-path=path] [directory...]";
 
 /* List of acceptable pathname prefixes */
 static char **ok_paths = NULL;
@@ -24,6 +26,9 @@ static int strict_paths = 0;
 /* If this is set, git-daemon-export-ok is not required */
 static int export_all_trees = 0;
 
+/* Take all paths relative to this one if non-NULL */
+static char *base_path = NULL;
+
 /* Timeout, and initial timeout */
 static unsigned int timeout = 0;
 static unsigned int init_timeout = 0;
@@ -138,6 +143,17 @@ static char *path_ok(char *dir)
                return NULL;
        }
 
+       if (base_path) {
+               static char rpath[PATH_MAX];
+               if (*dir != '/') {
+                       /* Forbid possible base-path evasion using ~paths. */
+                       logerror("'%s': Non-absolute path denied (base-path active)");
+                       return NULL;
+               }
+               snprintf(rpath, PATH_MAX, "%s%s", base_path, dir);
+               dir = rpath;
+       }
+
        path = enter_repo(dir, strict_paths);
 
        if (!path) {
@@ -212,7 +228,7 @@ static int upload(char *dir)
        snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout);
 
        /* git-upload-pack only ever reads stuff, so this is safe */
-       execlp("git-upload-pack", "git-upload-pack", "--strict", timeout_buf, ".", NULL);
+       execl_git_cmd("upload-pack", "--strict", timeout_buf, ".", NULL);
        return -1;
 }
 
@@ -639,6 +655,10 @@ int main(int argc, char **argv)
                        strict_paths = 1;
                        continue;
                }
+               if (!strncmp(arg, "--base-path=", 12)) {
+                       base_path = arg+12;
+                       continue;
+               }
                if (!strcmp(arg, "--")) {
                        ok_paths = &argv[i+1];
                        break;