[RFC PATCH 5/6] libutil: Convert rootdir to a dynamically allocated array

Punit Agrawal <[email protected]>
Newsgroups gmane.comp.gnu.global.bugs
Message-ID <[email protected]>
In preparation for dropping the use of PATH_MAX, convert rootdir to a
dynamically allocated array. As rootdir is used to cache state across
function calls (iterating over files), free the buffer when it is no
longer being used (find_close).
---
 libutil/find.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/libutil/find.c b/libutil/find.c
index 1863df4..14d59d5 100644
--- a/libutil/find.c
+++ b/libutil/find.c
@@ -97,7 +97,7 @@ static regex_t *skip;			/**< regex for skipping units */
 static regex_t *suff;			/**< regex for suffixes */
 static FILE *ip;
 static FILE *temp;
-static char rootdir[PATH_MAX];
+static char *rootdir;
 static char cwddir[MAXPATHLEN];
 static int find_mode;
 static int find_eof;
@@ -635,7 +635,7 @@ find_open(const char *start, int explain)
 
 	if (!start)
 		start = "./";
-        if (realpath(start, rootdir) == NULL)
+        if ((rootdir = realpath(start, NULL)) == NULL)
                 die("cannot get real path of '%s'.", trimpath(dir));
 	/*
 	 * setup stack.
@@ -664,6 +664,7 @@ find_open(const char *start, int explain)
 void
 find_open_filelist(const char *filename, const char *root, int explain)
 {
+	size_t rootdir_len;
 	assert(find_mode == 0);
 	find_mode = FILELIST_OPEN;
 	find_explain = explain;
@@ -689,11 +690,19 @@ find_open_filelist(const char *filename, const char *root, int explain)
 	}
 	/*
 	 * rootdir always ends with '/'.
+	 *
+	 * rootdir_len is two characters longer than root to be able
+	 * to append a "/" if needed and the string terminator
+	 * ofcourse.
 	 */
-	if (!strcmp(root+ROOT, "/"))
-		strlimcpy(rootdir, root, sizeof(rootdir));
-	else
-		snprintf(rootdir, sizeof(rootdir), "%s/", root);
+	rootdir_len = strlen(root) + 2;
+	rootdir = malloc(rootdir_len);
+	if (!rootdir)
+		die("short of memory.");
+
+	snprintf(rootdir, rootdir_len, "%s%s", root,
+		 strcmp(root+ROOT, "/") ? "/" : "");
+
 	strlimcpy(cwddir, root, sizeof(cwddir));
 }
 /**
@@ -909,6 +918,8 @@ find_close(void)
 	} else {
 		die("find_close: internal error.");
 	}
+	if (rootdir)
+		free(rootdir);
 	if (suff)
 		regfree(suff);
 	if (skip)
-- 
2.11.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.