ctucx.git: stagit

ctucx' stagit fork

commit fc60d78d8917fb930227ecc53936c9216e6298c2
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.
2 files changed, 37 insertions(+), 44 deletions(-)
M
stagit-index.c
|
42
+++++++++++++++++++-----------------------
M
stagit.c
|
39
++++++++++++++++++---------------------
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) {