commit fc60d78d8917fb930227ecc53936c9216e6298c2 (patch)
parent c13c4119501291e5c276d4d1217491b16a2a7ff9
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(-)
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';
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) {