summaryrefslogtreecommitdiffabout
path: root/cgit.c
Unidiff
Diffstat (limited to 'cgit.c') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index 5816f3d..b0e1c44 100644
--- a/cgit.c
+++ b/cgit.c
@@ -350,209 +350,209 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
350 cgit_print_pageheader(ctx); 350 cgit_print_pageheader(ctx);
351 cgit_print_error("Repository seems to be empty"); 351 cgit_print_error("Repository seems to be empty");
352 cgit_print_docend(); 352 cgit_print_docend();
353 return 1; 353 return 1;
354 } 354 }
355 355
356 if (get_sha1(ctx->qry.head, sha1)) { 356 if (get_sha1(ctx->qry.head, sha1)) {
357 tmp = xstrdup(ctx->qry.head); 357 tmp = xstrdup(ctx->qry.head);
358 ctx->qry.head = ctx->repo->defbranch; 358 ctx->qry.head = ctx->repo->defbranch;
359 ctx->page.status = 404; 359 ctx->page.status = 404;
360 ctx->page.statusmsg = "not found"; 360 ctx->page.statusmsg = "not found";
361 cgit_print_http_headers(ctx); 361 cgit_print_http_headers(ctx);
362 cgit_print_docstart(ctx); 362 cgit_print_docstart(ctx);
363 cgit_print_pageheader(ctx); 363 cgit_print_pageheader(ctx);
364 cgit_print_error(fmt("Invalid branch: %s", tmp)); 364 cgit_print_error(fmt("Invalid branch: %s", tmp));
365 cgit_print_docend(); 365 cgit_print_docend();
366 return 1; 366 return 1;
367 } 367 }
368 return 0; 368 return 0;
369} 369}
370 370
371static void process_request(void *cbdata) 371static void process_request(void *cbdata)
372{ 372{
373 struct cgit_context *ctx = cbdata; 373 struct cgit_context *ctx = cbdata;
374 struct cgit_cmd *cmd; 374 struct cgit_cmd *cmd;
375 375
376 cmd = cgit_get_cmd(ctx); 376 cmd = cgit_get_cmd(ctx);
377 if (!cmd) { 377 if (!cmd) {
378 ctx->page.title = "cgit error"; 378 ctx->page.title = "cgit error";
379 cgit_print_http_headers(ctx); 379 cgit_print_http_headers(ctx);
380 cgit_print_docstart(ctx); 380 cgit_print_docstart(ctx);
381 cgit_print_pageheader(ctx); 381 cgit_print_pageheader(ctx);
382 cgit_print_error("Invalid request"); 382 cgit_print_error("Invalid request");
383 cgit_print_docend(); 383 cgit_print_docend();
384 return; 384 return;
385 } 385 }
386 386
387 if (cmd->want_repo && !ctx->repo) { 387 if (cmd->want_repo && !ctx->repo) {
388 cgit_print_http_headers(ctx); 388 cgit_print_http_headers(ctx);
389 cgit_print_docstart(ctx); 389 cgit_print_docstart(ctx);
390 cgit_print_pageheader(ctx); 390 cgit_print_pageheader(ctx);
391 cgit_print_error(fmt("No repository selected")); 391 cgit_print_error(fmt("No repository selected"));
392 cgit_print_docend(); 392 cgit_print_docend();
393 return; 393 return;
394 } 394 }
395 395
396 if (ctx->repo && prepare_repo_cmd(ctx)) 396 if (ctx->repo && prepare_repo_cmd(ctx))
397 return; 397 return;
398 398
399 if (cmd->want_layout) { 399 if (cmd->want_layout) {
400 cgit_print_http_headers(ctx); 400 cgit_print_http_headers(ctx);
401 cgit_print_docstart(ctx); 401 cgit_print_docstart(ctx);
402 cgit_print_pageheader(ctx); 402 cgit_print_pageheader(ctx);
403 } 403 }
404 404
405 cmd->fn(ctx); 405 cmd->fn(ctx);
406 406
407 if (cmd->want_layout) 407 if (cmd->want_layout)
408 cgit_print_docend(); 408 cgit_print_docend();
409} 409}
410 410
411int cmp_repos(const void *a, const void *b) 411int cmp_repos(const void *a, const void *b)
412{ 412{
413 const struct cgit_repo *ra = a, *rb = b; 413 const struct cgit_repo *ra = a, *rb = b;
414 return strcmp(ra->url, rb->url); 414 return strcmp(ra->url, rb->url);
415} 415}
416 416
417void print_repo(struct cgit_repo *repo) 417void print_repo(struct cgit_repo *repo)
418{ 418{
419 printf("repo.url=%s\n", repo->url); 419 printf("repo.url=%s\n", repo->url);
420 printf("repo.name=%s\n", repo->name); 420 printf("repo.name=%s\n", repo->name);
421 printf("repo.path=%s\n", repo->path); 421 printf("repo.path=%s\n", repo->path);
422 if (repo->owner) 422 if (repo->owner)
423 printf("repo.owner=%s\n", repo->owner); 423 printf("repo.owner=%s\n", repo->owner);
424 if (repo->desc) 424 if (repo->desc)
425 printf("repo.desc=%s\n", repo->desc); 425 printf("repo.desc=%s\n", repo->desc);
426 if (repo->readme) 426 if (repo->readme)
427 printf("repo.readme=%s\n", repo->readme); 427 printf("repo.readme=%s\n", repo->readme);
428 printf("\n"); 428 printf("\n");
429} 429}
430 430
431void print_repolist(struct cgit_repolist *list) 431void print_repolist(struct cgit_repolist *list)
432{ 432{
433 int i; 433 int i;
434 434
435 for(i = 0; i < list->count; i++) 435 for(i = 0; i < list->count; i++)
436 print_repo(&list->repos[i]); 436 print_repo(&list->repos[i]);
437} 437}
438 438
439 439
440static void cgit_parse_args(int argc, const char **argv) 440static void cgit_parse_args(int argc, const char **argv)
441{ 441{
442 int i; 442 int i;
443 int scan = 0; 443 int scan = 0;
444 444
445 for (i = 1; i < argc; i++) { 445 for (i = 1; i < argc; i++) {
446 if (!strncmp(argv[i], "--cache=", 8)) { 446 if (!strncmp(argv[i], "--cache=", 8)) {
447 ctx.cfg.cache_root = xstrdup(argv[i]+8); 447 ctx.cfg.cache_root = xstrdup(argv[i]+8);
448 } 448 }
449 if (!strcmp(argv[i], "--nocache")) { 449 if (!strcmp(argv[i], "--nocache")) {
450 ctx.cfg.nocache = 1; 450 ctx.cfg.nocache = 1;
451 } 451 }
452 if (!strcmp(argv[i], "--nohttp")) { 452 if (!strcmp(argv[i], "--nohttp")) {
453 ctx.env.no_http = "1"; 453 ctx.env.no_http = "1";
454 } 454 }
455 if (!strncmp(argv[i], "--query=", 8)) { 455 if (!strncmp(argv[i], "--query=", 8)) {
456 ctx.qry.raw = xstrdup(argv[i]+8); 456 ctx.qry.raw = xstrdup(argv[i]+8);
457 } 457 }
458 if (!strncmp(argv[i], "--repo=", 7)) { 458 if (!strncmp(argv[i], "--repo=", 7)) {
459 ctx.qry.repo = xstrdup(argv[i]+7); 459 ctx.qry.repo = xstrdup(argv[i]+7);
460 } 460 }
461 if (!strncmp(argv[i], "--page=", 7)) { 461 if (!strncmp(argv[i], "--page=", 7)) {
462 ctx.qry.page = xstrdup(argv[i]+7); 462 ctx.qry.page = xstrdup(argv[i]+7);
463 } 463 }
464 if (!strncmp(argv[i], "--head=", 7)) { 464 if (!strncmp(argv[i], "--head=", 7)) {
465 ctx.qry.head = xstrdup(argv[i]+7); 465 ctx.qry.head = xstrdup(argv[i]+7);
466 ctx.qry.has_symref = 1; 466 ctx.qry.has_symref = 1;
467 } 467 }
468 if (!strncmp(argv[i], "--sha1=", 7)) { 468 if (!strncmp(argv[i], "--sha1=", 7)) {
469 ctx.qry.sha1 = xstrdup(argv[i]+7); 469 ctx.qry.sha1 = xstrdup(argv[i]+7);
470 ctx.qry.has_sha1 = 1; 470 ctx.qry.has_sha1 = 1;
471 } 471 }
472 if (!strncmp(argv[i], "--ofs=", 6)) { 472 if (!strncmp(argv[i], "--ofs=", 6)) {
473 ctx.qry.ofs = atoi(argv[i]+6); 473 ctx.qry.ofs = atoi(argv[i]+6);
474 } 474 }
475 if (!strncmp(argv[i], "--scan-tree=", 12)) { 475 if (!strncmp(argv[i], "--scan-tree=", 12)) {
476 scan++; 476 scan++;
477 scan_tree(argv[i] + 12); 477 scan_tree(argv[i] + 12);
478 } 478 }
479 } 479 }
480 if (scan) { 480 if (scan) {
481 qsort(cgit_repolist.repos, cgit_repolist.count, 481 qsort(cgit_repolist.repos, cgit_repolist.count,
482 sizeof(struct cgit_repo), cmp_repos); 482 sizeof(struct cgit_repo), cmp_repos);
483 print_repolist(&cgit_repolist); 483 print_repolist(&cgit_repolist);
484 exit(0); 484 exit(0);
485 } 485 }
486} 486}
487 487
488static int calc_ttl() 488static int calc_ttl()
489{ 489{
490 if (!ctx.repo) 490 if (!ctx.repo)
491 return ctx.cfg.cache_root_ttl; 491 return ctx.cfg.cache_root_ttl;
492 492
493 if (!ctx.qry.page) 493 if (!ctx.qry.page)
494 return ctx.cfg.cache_repo_ttl; 494 return ctx.cfg.cache_repo_ttl;
495 495
496 if (ctx.qry.has_symref) 496 if (ctx.qry.has_symref)
497 return ctx.cfg.cache_dynamic_ttl; 497 return ctx.cfg.cache_dynamic_ttl;
498 498
499 if (ctx.qry.has_sha1) 499 if (ctx.qry.has_sha1)
500 return ctx.cfg.cache_static_ttl; 500 return ctx.cfg.cache_static_ttl;
501 501
502 return ctx.cfg.cache_repo_ttl; 502 return ctx.cfg.cache_repo_ttl;
503} 503}
504 504
505int main(int argc, const char **argv) 505int main(int argc, const char **argv)
506{ 506{
507 const char *path; 507 const char *path;
508 char *qry; 508 char *qry;
509 int err, ttl; 509 int err, ttl;
510 510
511 prepare_context(&ctx); 511 prepare_context(&ctx);
512 cgit_repolist.length = 0; 512 cgit_repolist.length = 0;
513 cgit_repolist.count = 0; 513 cgit_repolist.count = 0;
514 cgit_repolist.repos = NULL; 514 cgit_repolist.repos = NULL;
515 515
516 cgit_parse_args(argc, argv); 516 cgit_parse_args(argc, argv);
517 parse_configfile(ctx.env.cgit_config, config_cb); 517 parse_configfile(ctx.env.cgit_config, config_cb);
518 ctx.repo = NULL; 518 ctx.repo = NULL;
519 http_parse_querystring(ctx.qry.raw, querystring_cb); 519 http_parse_querystring(ctx.qry.raw, querystring_cb);
520 520
521 /* If virtual-root isn't specified in cgitrc, lets pretend 521 /* If virtual-root isn't specified in cgitrc, lets pretend
522 * that virtual-root equals SCRIPT_NAME. 522 * that virtual-root equals SCRIPT_NAME.
523 */ 523 */
524 if (!ctx.cfg.virtual_root) 524 if (!ctx.cfg.virtual_root)
525 ctx.cfg.virtual_root = ctx.cfg.script_name; 525 ctx.cfg.virtual_root = ctx.cfg.script_name;
526 526
527 /* If no url parameter is specified on the querystring, lets 527 /* If no url parameter is specified on the querystring, lets
528 * use PATH_INFO as url. This allows cgit to work with virtual 528 * use PATH_INFO as url. This allows cgit to work with virtual
529 * urls without the need for rewriterules in the webserver (as 529 * urls without the need for rewriterules in the webserver (as
530 * long as PATH_INFO is included in the cache lookup key). 530 * long as PATH_INFO is included in the cache lookup key).
531 */ 531 */
532 path = ctx.env.path_info; 532 path = ctx.env.path_info;
533 if (!ctx.qry.url && path) { 533 if (!ctx.qry.url && path) {
534 if (path[0] == '/') 534 if (path[0] == '/')
535 path++; 535 path++;
536 ctx.qry.url = xstrdup(path); 536 ctx.qry.url = xstrdup(path);
537 if (ctx.qry.raw) { 537 if (ctx.qry.raw) {
538 qry = ctx.qry.raw; 538 qry = ctx.qry.raw;
539 ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); 539 ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry));
540 free(qry); 540 free(qry);
541 } else 541 } else
542 ctx.qry.raw = ctx.qry.url; 542 ctx.qry.raw = xstrdup(ctx.qry.url);
543 cgit_parse_url(ctx.qry.url); 543 cgit_parse_url(ctx.qry.url);
544 } 544 }
545 545
546 ttl = calc_ttl(); 546 ttl = calc_ttl();
547 ctx.page.expires += ttl*60; 547 ctx.page.expires += ttl*60;
548 if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) 548 if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
549 ctx.cfg.nocache = 1; 549 ctx.cfg.nocache = 1;
550 if (ctx.cfg.nocache) 550 if (ctx.cfg.nocache)
551 ctx.cfg.cache_size = 0; 551 ctx.cfg.cache_size = 0;
552 err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, 552 err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root,
553 ctx.qry.raw, ttl, process_request, &ctx); 553 ctx.qry.raw, ttl, process_request, &ctx);
554 if (err) 554 if (err)
555 cgit_print_error(fmt("Error processing page: %s (%d)", 555 cgit_print_error(fmt("Error processing page: %s (%d)",
556 strerror(err), err)); 556 strerror(err), err));
557 return err; 557 return err;
558} 558}