author | Mark Lodato <lodatom@gmail.com> | 2011-05-13 23:59:07 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2011-05-23 21:20:59 (UTC) |
commit | ec79265f2053e6dc20e0ec486719f5954d2be83d (patch) (unidiff) | |
tree | bae66fbd919c03d0204554cc0c109c7eba0e3b97 /cgit.c | |
parent | c8ea73caabcb16ffb74baa70d35650027ed772c4 (diff) | |
download | cgit-ec79265f2053e6dc20e0ec486719f5954d2be83d.zip cgit-ec79265f2053e6dc20e0ec486719f5954d2be83d.tar.gz cgit-ec79265f2053e6dc20e0ec486719f5954d2be83d.tar.bz2 |
fix virtual-root if script-name is ""
In d0cb841 (Avoid trailing slash in virtual-root), virtual-root was set
from script-name using trim_end(). However, if script-name was the
empty string (""), which happens when cgit is used to serve the root
path on a domain (/), trim_end() returns NULL and cgit acts like
virtual-root is not available. Now, set virtual-root to "" in this
case, which fixes this bug.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -664,131 +664,134 @@ static void process_cached_repolist(const char *path) | |||
664 | static void cgit_parse_args(int argc, const char **argv) | 664 | static void cgit_parse_args(int argc, const char **argv) |
665 | { | 665 | { |
666 | int i; | 666 | int i; |
667 | int scan = 0; | 667 | int scan = 0; |
668 | 668 | ||
669 | for (i = 1; i < argc; i++) { | 669 | for (i = 1; i < argc; i++) { |
670 | if (!strncmp(argv[i], "--cache=", 8)) { | 670 | if (!strncmp(argv[i], "--cache=", 8)) { |
671 | ctx.cfg.cache_root = xstrdup(argv[i]+8); | 671 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
672 | } | 672 | } |
673 | if (!strcmp(argv[i], "--nocache")) { | 673 | if (!strcmp(argv[i], "--nocache")) { |
674 | ctx.cfg.nocache = 1; | 674 | ctx.cfg.nocache = 1; |
675 | } | 675 | } |
676 | if (!strcmp(argv[i], "--nohttp")) { | 676 | if (!strcmp(argv[i], "--nohttp")) { |
677 | ctx.env.no_http = "1"; | 677 | ctx.env.no_http = "1"; |
678 | } | 678 | } |
679 | if (!strncmp(argv[i], "--query=", 8)) { | 679 | if (!strncmp(argv[i], "--query=", 8)) { |
680 | ctx.qry.raw = xstrdup(argv[i]+8); | 680 | ctx.qry.raw = xstrdup(argv[i]+8); |
681 | } | 681 | } |
682 | if (!strncmp(argv[i], "--repo=", 7)) { | 682 | if (!strncmp(argv[i], "--repo=", 7)) { |
683 | ctx.qry.repo = xstrdup(argv[i]+7); | 683 | ctx.qry.repo = xstrdup(argv[i]+7); |
684 | } | 684 | } |
685 | if (!strncmp(argv[i], "--page=", 7)) { | 685 | if (!strncmp(argv[i], "--page=", 7)) { |
686 | ctx.qry.page = xstrdup(argv[i]+7); | 686 | ctx.qry.page = xstrdup(argv[i]+7); |
687 | } | 687 | } |
688 | if (!strncmp(argv[i], "--head=", 7)) { | 688 | if (!strncmp(argv[i], "--head=", 7)) { |
689 | ctx.qry.head = xstrdup(argv[i]+7); | 689 | ctx.qry.head = xstrdup(argv[i]+7); |
690 | ctx.qry.has_symref = 1; | 690 | ctx.qry.has_symref = 1; |
691 | } | 691 | } |
692 | if (!strncmp(argv[i], "--sha1=", 7)) { | 692 | if (!strncmp(argv[i], "--sha1=", 7)) { |
693 | ctx.qry.sha1 = xstrdup(argv[i]+7); | 693 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
694 | ctx.qry.has_sha1 = 1; | 694 | ctx.qry.has_sha1 = 1; |
695 | } | 695 | } |
696 | if (!strncmp(argv[i], "--ofs=", 6)) { | 696 | if (!strncmp(argv[i], "--ofs=", 6)) { |
697 | ctx.qry.ofs = atoi(argv[i]+6); | 697 | ctx.qry.ofs = atoi(argv[i]+6); |
698 | } | 698 | } |
699 | if (!strncmp(argv[i], "--scan-tree=", 12) || | 699 | if (!strncmp(argv[i], "--scan-tree=", 12) || |
700 | !strncmp(argv[i], "--scan-path=", 12)) { | 700 | !strncmp(argv[i], "--scan-path=", 12)) { |
701 | /* HACK: the global snapshot bitmask defines the | 701 | /* HACK: the global snapshot bitmask defines the |
702 | * set of allowed snapshot formats, but the config | 702 | * set of allowed snapshot formats, but the config |
703 | * file hasn't been parsed yet so the mask is | 703 | * file hasn't been parsed yet so the mask is |
704 | * currently 0. By setting all bits high before | 704 | * currently 0. By setting all bits high before |
705 | * scanning we make sure that any in-repo cgitrc | 705 | * scanning we make sure that any in-repo cgitrc |
706 | * snapshot setting is respected by scan_tree(). | 706 | * snapshot setting is respected by scan_tree(). |
707 | * BTW: we assume that there'll never be more than | 707 | * BTW: we assume that there'll never be more than |
708 | * 255 different snapshot formats supported by cgit... | 708 | * 255 different snapshot formats supported by cgit... |
709 | */ | 709 | */ |
710 | ctx.cfg.snapshots = 0xFF; | 710 | ctx.cfg.snapshots = 0xFF; |
711 | scan++; | 711 | scan++; |
712 | scan_tree(argv[i] + 12, repo_config); | 712 | scan_tree(argv[i] + 12, repo_config); |
713 | } | 713 | } |
714 | } | 714 | } |
715 | if (scan) { | 715 | if (scan) { |
716 | qsort(cgit_repolist.repos, cgit_repolist.count, | 716 | qsort(cgit_repolist.repos, cgit_repolist.count, |
717 | sizeof(struct cgit_repo), cmp_repos); | 717 | sizeof(struct cgit_repo), cmp_repos); |
718 | print_repolist(stdout, &cgit_repolist, 0); | 718 | print_repolist(stdout, &cgit_repolist, 0); |
719 | exit(0); | 719 | exit(0); |
720 | } | 720 | } |
721 | } | 721 | } |
722 | 722 | ||
723 | static int calc_ttl() | 723 | static int calc_ttl() |
724 | { | 724 | { |
725 | if (!ctx.repo) | 725 | if (!ctx.repo) |
726 | return ctx.cfg.cache_root_ttl; | 726 | return ctx.cfg.cache_root_ttl; |
727 | 727 | ||
728 | if (!ctx.qry.page) | 728 | if (!ctx.qry.page) |
729 | return ctx.cfg.cache_repo_ttl; | 729 | return ctx.cfg.cache_repo_ttl; |
730 | 730 | ||
731 | if (ctx.qry.has_symref) | 731 | if (ctx.qry.has_symref) |
732 | return ctx.cfg.cache_dynamic_ttl; | 732 | return ctx.cfg.cache_dynamic_ttl; |
733 | 733 | ||
734 | if (ctx.qry.has_sha1) | 734 | if (ctx.qry.has_sha1) |
735 | return ctx.cfg.cache_static_ttl; | 735 | return ctx.cfg.cache_static_ttl; |
736 | 736 | ||
737 | return ctx.cfg.cache_repo_ttl; | 737 | return ctx.cfg.cache_repo_ttl; |
738 | } | 738 | } |
739 | 739 | ||
740 | int main(int argc, const char **argv) | 740 | int main(int argc, const char **argv) |
741 | { | 741 | { |
742 | const char *path; | 742 | const char *path; |
743 | char *qry; | 743 | char *qry; |
744 | int err, ttl; | 744 | int err, ttl; |
745 | 745 | ||
746 | prepare_context(&ctx); | 746 | prepare_context(&ctx); |
747 | cgit_repolist.length = 0; | 747 | cgit_repolist.length = 0; |
748 | cgit_repolist.count = 0; | 748 | cgit_repolist.count = 0; |
749 | cgit_repolist.repos = NULL; | 749 | cgit_repolist.repos = NULL; |
750 | 750 | ||
751 | cgit_parse_args(argc, argv); | 751 | cgit_parse_args(argc, argv); |
752 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); | 752 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); |
753 | ctx.repo = NULL; | 753 | ctx.repo = NULL; |
754 | http_parse_querystring(ctx.qry.raw, querystring_cb); | 754 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
755 | 755 | ||
756 | /* If virtual-root isn't specified in cgitrc, lets pretend | 756 | /* If virtual-root isn't specified in cgitrc, lets pretend |
757 | * that virtual-root equals SCRIPT_NAME, minus any possibly | 757 | * that virtual-root equals SCRIPT_NAME, minus any possibly |
758 | * trailing slashes. | 758 | * trailing slashes. |
759 | */ | 759 | */ |
760 | if (!ctx.cfg.virtual_root) | 760 | if (!ctx.cfg.virtual_root && ctx.cfg.script_name) { |
761 | ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); | 761 | ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); |
762 | if (!ctx.cfg.virtual_root) | ||
763 | ctx.cfg.virtual_root = ""; | ||
764 | } | ||
762 | 765 | ||
763 | /* If no url parameter is specified on the querystring, lets | 766 | /* If no url parameter is specified on the querystring, lets |
764 | * use PATH_INFO as url. This allows cgit to work with virtual | 767 | * use PATH_INFO as url. This allows cgit to work with virtual |
765 | * urls without the need for rewriterules in the webserver (as | 768 | * urls without the need for rewriterules in the webserver (as |
766 | * long as PATH_INFO is included in the cache lookup key). | 769 | * long as PATH_INFO is included in the cache lookup key). |
767 | */ | 770 | */ |
768 | path = ctx.env.path_info; | 771 | path = ctx.env.path_info; |
769 | if (!ctx.qry.url && path) { | 772 | if (!ctx.qry.url && path) { |
770 | if (path[0] == '/') | 773 | if (path[0] == '/') |
771 | path++; | 774 | path++; |
772 | ctx.qry.url = xstrdup(path); | 775 | ctx.qry.url = xstrdup(path); |
773 | if (ctx.qry.raw) { | 776 | if (ctx.qry.raw) { |
774 | qry = ctx.qry.raw; | 777 | qry = ctx.qry.raw; |
775 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); | 778 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); |
776 | free(qry); | 779 | free(qry); |
777 | } else | 780 | } else |
778 | ctx.qry.raw = xstrdup(ctx.qry.url); | 781 | ctx.qry.raw = xstrdup(ctx.qry.url); |
779 | cgit_parse_url(ctx.qry.url); | 782 | cgit_parse_url(ctx.qry.url); |
780 | } | 783 | } |
781 | 784 | ||
782 | ttl = calc_ttl(); | 785 | ttl = calc_ttl(); |
783 | ctx.page.expires += ttl*60; | 786 | ctx.page.expires += ttl*60; |
784 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) | 787 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) |
785 | ctx.cfg.nocache = 1; | 788 | ctx.cfg.nocache = 1; |
786 | if (ctx.cfg.nocache) | 789 | if (ctx.cfg.nocache) |
787 | ctx.cfg.cache_size = 0; | 790 | ctx.cfg.cache_size = 0; |
788 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, | 791 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
789 | ctx.qry.raw, ttl, process_request, &ctx); | 792 | ctx.qry.raw, ttl, process_request, &ctx); |
790 | if (err) | 793 | if (err) |
791 | cgit_print_error(fmt("Error processing page: %s (%d)", | 794 | cgit_print_error(fmt("Error processing page: %s (%d)", |
792 | strerror(err), err)); | 795 | strerror(err), err)); |
793 | return err; | 796 | return err; |
794 | } | 797 | } |