fix path join '/' - stagit-gopher - A git gopher frontend. (mirror)
 (HTM) git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/stagit-gopher/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fc60d78d8917fb930227ecc53936c9216e6298c2
 (DIR) parent c13c4119501291e5c276d4d1217491b16a2a7ff9
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun,  1 May 2016 14:38:57 +0200
       
       fix path join '/'
       
       add joinpath() function to handle this.
       
       Diffstat:
         M stagit-index.c                      |      42 ++++++++++++++-----------------
         M stagit.c                            |      39 ++++++++++++++-----------------
       
       2 files changed, 37 insertions(+), 44 deletions(-)
       ---
 (DIR) diff --git a/stagit-index.c b/stagit-index.c
       @@ -140,13 +140,25 @@ err:
                return ret;
        }
        
       +void
       +joinpath(char *buf, size_t bufsiz, const char *path, const char *path2)
       +{
       +        int r;
       +
       +        r = snprintf(buf, bufsiz, "%s%s%s",
       +                repodir, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
       +        if (r == -1 || (size_t)r >= bufsiz)
       +                errx(1, "path truncated: '%s%s%s'",
       +                        path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
       +}
       +
        int
        main(int argc, char *argv[])
        {
                const git_error *e = NULL;
                FILE *fp;
                char path[PATH_MAX], repodirabs[PATH_MAX + 1];
       -        int i, r, ret = 0;
       +        int i, ret = 0;
        
                if (argc < 2) {
                        fprintf(stderr, "%s [repodir...]\n", argv[0]);
       @@ -176,20 +188,12 @@ main(int argc, char *argv[])
                                name = "";
        
                        /* read description or .git/description */
       -                description[0] = '\0';
       -                r = snprintf(path, sizeof(path), "%s%s%s",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
       -                if (r == -1 || (size_t)r >= sizeof(path))
       -                        errx(1, "path truncated: '%s%s%s'",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
       +                joinpath(path, sizeof(path), repodir, "description");
                        if (!(fp = fopen(path, "r"))) {
       -                        r = snprintf(path, sizeof(path), "%s%s%s",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
       -                        if (r == -1 || (size_t)r >= sizeof(path))
       -                                errx(1, "path truncated: '%s%s%s'",
       -                                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
       +                        joinpath(path, sizeof(path), repodir, ".git/description");
                                fp = fopen(path, "r");
                        }
       +                description[0] = '\0';
                        if (fp) {
                                if (!fgets(description, sizeof(description), fp))
                                        description[0] = '\0';
       @@ -197,20 +201,12 @@ main(int argc, char *argv[])
                        }
        
                        /* read owner or .git/owner */
       -                owner[0] = '\0';
       -                r = snprintf(path, sizeof(path), "%s%s%s",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "owner");
       -                if (r == -1 || (size_t)r >= sizeof(path))
       -                        errx(1, "path truncated: '%s%s%s'",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "owner");
       +                joinpath(path, sizeof(path), repodir, "owner");
                        if (!(fp = fopen(path, "r"))) {
       -                        r = snprintf(path, sizeof(path), "%s%s%s",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/owner");
       -                        if (r == -1 || (size_t)r >= sizeof(path))
       -                                errx(1, "path truncated: '%s%s%s'",
       -                                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/owner");
       +                        joinpath(path, sizeof(path), repodir, ".git/owner");
                                fp = fopen(path, "r");
                        }
       +                owner[0] = '\0';
                        if (fp) {
                                if (!fgets(owner, sizeof(owner), fp))
                                        owner[0] = '\0';
 (DIR) diff --git a/stagit.c b/stagit.c
       @@ -970,6 +970,18 @@ err:
                return 0;
        }
        
       +void
       +joinpath(char *buf, size_t bufsiz, const char *path, const char *path2)
       +{
       +        int r;
       +
       +        r = snprintf(buf, bufsiz, "%s%s%s",
       +                repodir, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
       +        if (r == -1 || (size_t)r >= bufsiz)
       +                errx(1, "path truncated: '%s%s%s'",
       +                        path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
       +}
       +
        int
        main(int argc, char *argv[])
        {
       @@ -978,13 +990,14 @@ main(int argc, char *argv[])
                const git_error *e = NULL;
                FILE *fp, *fpread;
                char path[PATH_MAX], repodirabs[PATH_MAX + 1], *p;
       -        int r, status;
       +        int status;
        
                if (argc != 2) {
                        fprintf(stderr, "%s <repodir>\n", argv[0]);
                        return 1;
                }
                repodir = argv[1];
       +
                if (!realpath(repodir, repodirabs))
                        err(1, "realpath");
        
       @@ -1017,17 +1030,9 @@ main(int argc, char *argv[])
                                *p = '\0';
        
                /* read description or .git/description */
       -        r = snprintf(path, sizeof(path), "%s%s%s",
       -                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
       -        if (r == -1 || (size_t)r >= sizeof(path))
       -                errx(1, "path truncated: '%s%s%s'",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
       +        joinpath(path, sizeof(path), repodir, "description");
                if (!(fpread = fopen(path, "r"))) {
       -                r = snprintf(path, sizeof(path), "%s%s%s",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
       -                if (r == -1 || (size_t)r >= sizeof(path))
       -                        errx(1, "path truncated: '%s%s%s'",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
       +                joinpath(path, sizeof(path), repodir, ".git/description");
                        fpread = fopen(path, "r");
                }
                if (fpread) {
       @@ -1037,17 +1042,9 @@ main(int argc, char *argv[])
                }
        
                /* read url or .git/url */
       -        r = snprintf(path, sizeof(path), "%s%s%s",
       -                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "url");
       -        if (r == -1 || (size_t)r >= sizeof(path))
       -                errx(1, "path truncated: '%s%s%s'",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "url");
       +        joinpath(path, sizeof(path), repodir, "url");
                if (!(fpread = fopen(path, "r"))) {
       -                r = snprintf(path, sizeof(path), "%s%s%s",
       -                        repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/url");
       -                if (r == -1 || (size_t)r >= sizeof(path))
       -                        errx(1, "path truncated: '%s%s%s'",
       -                                repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/url");
       +                joinpath(path, sizeof(path), repodir, ".git/url");
                        fpread = fopen(path, "r");
                }
                if (fpread) {