-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | cgit.c | 5 | ||||
-rw-r--r-- | html.c | 2 | ||||
-rw-r--r-- | ui-shared.c | 2 |
4 files changed, 7 insertions, 6 deletions
@@ -1,17 +1,17 @@ | |||
1 | CGIT_VERSION = v0.8.3.4 | 1 | CGIT_VERSION = v0.8.3.5 |
2 | CGIT_SCRIPT_NAME = cgit.cgi | 2 | CGIT_SCRIPT_NAME = cgit.cgi |
3 | CGIT_SCRIPT_PATH = /var/www/htdocs/cgit | 3 | CGIT_SCRIPT_PATH = /var/www/htdocs/cgit |
4 | CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) | 4 | CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) |
5 | CGIT_CONFIG = /etc/cgitrc | 5 | CGIT_CONFIG = /etc/cgitrc |
6 | CACHE_ROOT = /var/cache/cgit | 6 | CACHE_ROOT = /var/cache/cgit |
7 | prefix = /usr | 7 | prefix = /usr |
8 | libdir = $(prefix)/lib | 8 | libdir = $(prefix)/lib |
9 | filterdir = $(libdir)/cgit/filters | 9 | filterdir = $(libdir)/cgit/filters |
10 | docdir = $(prefix)/share/doc/cgit | 10 | docdir = $(prefix)/share/doc/cgit |
11 | htmldir = $(docdir) | 11 | htmldir = $(docdir) |
12 | pdfdir = $(docdir) | 12 | pdfdir = $(docdir) |
13 | mandir = $(prefix)/share/man | 13 | mandir = $(prefix)/share/man |
14 | SHA1_HEADER = <openssl/sha.h> | 14 | SHA1_HEADER = <openssl/sha.h> |
15 | GIT_VER = 1.7.4 | 15 | GIT_VER = 1.7.4 |
16 | GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 | 16 | GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 |
17 | INSTALL = install | 17 | INSTALL = install |
@@ -228,17 +228,17 @@ doc-pdf: $(DOC_PDF) | |||
228 | %.5 : %.5.txt | 228 | %.5 : %.5.txt |
229 | a2x -f manpage $< | 229 | a2x -f manpage $< |
230 | 230 | ||
231 | $(DOC_HTML): %.html : %.txt | 231 | $(DOC_HTML): %.html : %.txt |
232 | a2x -f xhtml --stylesheet=cgit-doc.css $< | 232 | a2x -f xhtml --stylesheet=cgit-doc.css $< |
233 | 233 | ||
234 | $(DOC_PDF): %.pdf : %.txt | 234 | $(DOC_PDF): %.pdf : %.txt |
235 | a2x -f pdf cgitrc.5.txt | 235 | a2x -f pdf cgitrc.5.txt |
236 | 236 | ||
237 | clean: clean-doc | 237 | clean: clean-doc |
238 | rm -f cgit VERSION *.o *.d | 238 | rm -f cgit VERSION *.o *.d |
239 | 239 | ||
240 | clean-doc: | 240 | clean-doc: |
241 | rm -f cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo | 241 | rm -f cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo |
242 | 242 | ||
243 | get-git: | 243 | get-git: |
244 | curl $(GIT_URL) | tar -xj && rm -rf git && mv git-$(GIT_VER) git | 244 | curl $(GIT_URL) | tar -xjf - && rm -rf git && mv git-$(GIT_VER) git |
@@ -739,36 +739,37 @@ int main(int argc, const char **argv) | |||
739 | { | 739 | { |
740 | const char *path; | 740 | const char *path; |
741 | char *qry; | 741 | char *qry; |
742 | int err, ttl; | 742 | int err, ttl; |
743 | 743 | ||
744 | prepare_context(&ctx); | 744 | prepare_context(&ctx); |
745 | cgit_repolist.length = 0; | 745 | cgit_repolist.length = 0; |
746 | cgit_repolist.count = 0; | 746 | cgit_repolist.count = 0; |
747 | cgit_repolist.repos = NULL; | 747 | cgit_repolist.repos = NULL; |
748 | 748 | ||
749 | cgit_parse_args(argc, argv); | 749 | cgit_parse_args(argc, argv); |
750 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); | 750 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); |
751 | ctx.repo = NULL; | 751 | ctx.repo = NULL; |
752 | http_parse_querystring(ctx.qry.raw, querystring_cb); | 752 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
753 | 753 | ||
754 | /* If virtual-root isn't specified in cgitrc, lets pretend | 754 | /* If virtual-root isn't specified in cgitrc, lets pretend |
755 | * that virtual-root equals SCRIPT_NAME. | 755 | * that virtual-root equals SCRIPT_NAME, minus any possibly |
756 | * trailing slashes. | ||
756 | */ | 757 | */ |
757 | if (!ctx.cfg.virtual_root) | 758 | if (!ctx.cfg.virtual_root) |
758 | ctx.cfg.virtual_root = ctx.cfg.script_name; | 759 | ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); |
759 | 760 | ||
760 | /* If no url parameter is specified on the querystring, lets | 761 | /* If no url parameter is specified on the querystring, lets |
761 | * use PATH_INFO as url. This allows cgit to work with virtual | 762 | * use PATH_INFO as url. This allows cgit to work with virtual |
762 | * urls without the need for rewriterules in the webserver (as | 763 | * urls without the need for rewriterules in the webserver (as |
763 | * long as PATH_INFO is included in the cache lookup key). | 764 | * long as PATH_INFO is included in the cache lookup key). |
764 | */ | 765 | */ |
765 | path = ctx.env.path_info; | 766 | path = ctx.env.path_info; |
766 | if (!ctx.qry.url && path) { | 767 | if (!ctx.qry.url && path) { |
767 | if (path[0] == '/') | 768 | if (path[0] == '/') |
768 | path++; | 769 | path++; |
769 | ctx.qry.url = xstrdup(path); | 770 | ctx.qry.url = xstrdup(path); |
770 | if (ctx.qry.raw) { | 771 | if (ctx.qry.raw) { |
771 | qry = ctx.qry.raw; | 772 | qry = ctx.qry.raw; |
772 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); | 773 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); |
773 | free(qry); | 774 | free(qry); |
774 | } else | 775 | } else |
@@ -264,33 +264,33 @@ int hextoint(char c) | |||
264 | return c - '0'; | 264 | return c - '0'; |
265 | else | 265 | else |
266 | return -1; | 266 | return -1; |
267 | } | 267 | } |
268 | 268 | ||
269 | char *convert_query_hexchar(char *txt) | 269 | char *convert_query_hexchar(char *txt) |
270 | { | 270 | { |
271 | int d1, d2, n; | 271 | int d1, d2, n; |
272 | n = strlen(txt); | 272 | n = strlen(txt); |
273 | if (n < 3) { | 273 | if (n < 3) { |
274 | *txt = '\0'; | 274 | *txt = '\0'; |
275 | return txt-1; | 275 | return txt-1; |
276 | } | 276 | } |
277 | d1 = hextoint(*(txt+1)); | 277 | d1 = hextoint(*(txt+1)); |
278 | d2 = hextoint(*(txt+2)); | 278 | d2 = hextoint(*(txt+2)); |
279 | if (d1<0 || d2<0) { | 279 | if (d1<0 || d2<0) { |
280 | memmove(txt, txt+3, n-3); | 280 | memmove(txt, txt+3, n-2); |
281 | return txt-1; | 281 | return txt-1; |
282 | } else { | 282 | } else { |
283 | *txt = d1 * 16 + d2; | 283 | *txt = d1 * 16 + d2; |
284 | memmove(txt+1, txt+3, n-2); | 284 | memmove(txt+1, txt+3, n-2); |
285 | return txt; | 285 | return txt; |
286 | } | 286 | } |
287 | } | 287 | } |
288 | 288 | ||
289 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) | 289 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) |
290 | { | 290 | { |
291 | char *t, *txt, *value = NULL, c; | 291 | char *t, *txt, *value = NULL, c; |
292 | 292 | ||
293 | if (!txt_) | 293 | if (!txt_) |
294 | return 0; | 294 | return 0; |
295 | 295 | ||
296 | t = txt = strdup(txt_); | 296 | t = txt = strdup(txt_); |
diff --git a/ui-shared.c b/ui-shared.c index 7efae7a..5aa9119 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -561,33 +561,33 @@ void cgit_print_age(time_t t, time_t max_relative, const char *format) | |||
561 | secs * 1.0 / TM_YEAR); | 561 | secs * 1.0 / TM_YEAR); |
562 | } | 562 | } |
563 | 563 | ||
564 | void cgit_print_http_headers(struct cgit_context *ctx) | 564 | void cgit_print_http_headers(struct cgit_context *ctx) |
565 | { | 565 | { |
566 | if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) | 566 | if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) |
567 | return; | 567 | return; |
568 | 568 | ||
569 | if (ctx->page.status) | 569 | if (ctx->page.status) |
570 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); | 570 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); |
571 | if (ctx->page.mimetype && ctx->page.charset) | 571 | if (ctx->page.mimetype && ctx->page.charset) |
572 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, | 572 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, |
573 | ctx->page.charset); | 573 | ctx->page.charset); |
574 | else if (ctx->page.mimetype) | 574 | else if (ctx->page.mimetype) |
575 | htmlf("Content-Type: %s\n", ctx->page.mimetype); | 575 | htmlf("Content-Type: %s\n", ctx->page.mimetype); |
576 | if (ctx->page.size) | 576 | if (ctx->page.size) |
577 | htmlf("Content-Length: %ld\n", ctx->page.size); | 577 | htmlf("Content-Length: %zd\n", ctx->page.size); |
578 | if (ctx->page.filename) | 578 | if (ctx->page.filename) |
579 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", | 579 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", |
580 | ctx->page.filename); | 580 | ctx->page.filename); |
581 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); | 581 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); |
582 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); | 582 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); |
583 | if (ctx->page.etag) | 583 | if (ctx->page.etag) |
584 | htmlf("ETag: \"%s\"\n", ctx->page.etag); | 584 | htmlf("ETag: \"%s\"\n", ctx->page.etag); |
585 | html("\n"); | 585 | html("\n"); |
586 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) | 586 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) |
587 | exit(0); | 587 | exit(0); |
588 | } | 588 | } |
589 | 589 | ||
590 | void cgit_print_docstart(struct cgit_context *ctx) | 590 | void cgit_print_docstart(struct cgit_context *ctx) |
591 | { | 591 | { |
592 | if (ctx->cfg.embedded) { | 592 | if (ctx->cfg.embedded) { |
593 | if (ctx->cfg.header) | 593 | if (ctx->cfg.header) |