aboutsummaryrefslogtreecommitdiffstats
path: root/cgit.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgit.c')
-rw-r--r--cgit.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index 5d6e488..6be3754 100644
--- a/cgit.c
+++ b/cgit.c
@@ -29,6 +29,7 @@ void add_mimetype(const char *name, const char *value)
29struct cgit_filter *new_filter(const char *cmd, filter_type filtertype) 29struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
30{ 30{
31 struct cgit_filter *f; 31 struct cgit_filter *f;
32 int args_size = 0;
32 int extra_args; 33 int extra_args;
33 34
34 if (!cmd || !cmd[0]) 35 if (!cmd || !cmd[0])
@@ -48,9 +49,10 @@ struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
48 49
49 f = xmalloc(sizeof(struct cgit_filter)); 50 f = xmalloc(sizeof(struct cgit_filter));
50 f->cmd = xstrdup(cmd); 51 f->cmd = xstrdup(cmd);
51 f->argv = xmalloc((2 + extra_args) * sizeof(char *)); 52 args_size = (2 + extra_args) * sizeof(char *);
53 f->argv = xmalloc(args_size);
54 memset(f->argv, 0, args_size);
52 f->argv[0] = f->cmd; 55 f->argv[0] = f->cmd;
53 f->argv[1] = NULL;
54 return f; 56 return f;
55} 57}
56 58
@@ -158,6 +160,8 @@ void config_cb(const char *name, const char *value)
158 ctx.cfg.enable_filter_overrides = atoi(value); 160 ctx.cfg.enable_filter_overrides = atoi(value);
159 else if (!strcmp(name, "enable-gitweb-owner")) 161 else if (!strcmp(name, "enable-gitweb-owner"))
160 ctx.cfg.enable_gitweb_owner = atoi(value); 162 ctx.cfg.enable_gitweb_owner = atoi(value);
163 else if (!strcmp(name, "enable-http-clone"))
164 ctx.cfg.enable_http_clone = atoi(value);
161 else if (!strcmp(name, "enable-index-links")) 165 else if (!strcmp(name, "enable-index-links"))
162 ctx.cfg.enable_index_links = atoi(value); 166 ctx.cfg.enable_index_links = atoi(value);
163 else if (!strcmp(name, "enable-commit-graph")) 167 else if (!strcmp(name, "enable-commit-graph"))
@@ -323,6 +327,7 @@ static void prepare_context(struct cgit_context *ctx)
323 ctx->cfg.logo = "/cgit.png"; 327 ctx->cfg.logo = "/cgit.png";
324 ctx->cfg.local_time = 0; 328 ctx->cfg.local_time = 0;
325 ctx->cfg.enable_gitweb_owner = 1; 329 ctx->cfg.enable_gitweb_owner = 1;
330 ctx->cfg.enable_http_clone = 1;
326 ctx->cfg.enable_tree_linenumbers = 1; 331 ctx->cfg.enable_tree_linenumbers = 1;
327 ctx->cfg.max_repo_count = 50; 332 ctx->cfg.max_repo_count = 50;
328 ctx->cfg.max_commit_count = 50; 333 ctx->cfg.max_commit_count = 50;
@@ -450,7 +455,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
450 tmp = xstrdup(ctx->qry.head); 455 tmp = xstrdup(ctx->qry.head);
451 ctx->qry.head = ctx->repo->defbranch; 456 ctx->qry.head = ctx->repo->defbranch;
452 ctx->page.status = 404; 457 ctx->page.status = 404;
453 ctx->page.statusmsg = "not found"; 458 ctx->page.statusmsg = "Not found";
454 cgit_print_http_headers(ctx); 459 cgit_print_http_headers(ctx);
455 cgit_print_docstart(ctx); 460 cgit_print_docstart(ctx);
456 cgit_print_pageheader(ctx); 461 cgit_print_pageheader(ctx);
@@ -469,6 +474,8 @@ static void process_request(void *cbdata)
469 cmd = cgit_get_cmd(ctx); 474 cmd = cgit_get_cmd(ctx);
470 if (!cmd) { 475 if (!cmd) {
471 ctx->page.title = "cgit error"; 476 ctx->page.title = "cgit error";
477 ctx->page.status = 404;
478 ctx->page.statusmsg = "Not found";
472 cgit_print_http_headers(ctx); 479 cgit_print_http_headers(ctx);
473 cgit_print_docstart(ctx); 480 cgit_print_docstart(ctx);
474 cgit_print_pageheader(ctx); 481 cgit_print_pageheader(ctx);
@@ -477,6 +484,11 @@ static void process_request(void *cbdata)
477 return; 484 return;
478 } 485 }
479 486
487 if (!ctx->cfg.enable_http_clone && cmd->is_clone) {
488 html_status(404, "Not found", 0);
489 return;
490 }
491
480 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual" 492 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
481 * in-project path limit to be made available at ctx->qry.vpath. 493 * in-project path limit to be made available at ctx->qry.vpath.
482 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL). 494 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL).
@@ -768,8 +780,11 @@ int main(int argc, const char **argv)
768 * that virtual-root equals SCRIPT_NAME, minus any possibly 780 * that virtual-root equals SCRIPT_NAME, minus any possibly
769 * trailing slashes. 781 * trailing slashes.
770 */ 782 */
771 if (!ctx.cfg.virtual_root) 783 if (!ctx.cfg.virtual_root && ctx.cfg.script_name) {
772 ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); 784 ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/');
785 if (!ctx.cfg.virtual_root)
786 ctx.cfg.virtual_root = "";
787 }
773 788
774 /* If no url parameter is specified on the querystring, lets 789 /* If no url parameter is specified on the querystring, lets
775 * use PATH_INFO as url. This allows cgit to work with virtual 790 * use PATH_INFO as url. This allows cgit to work with virtual