Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
absolutepath() refactoring
Alexandre Perrin committed 12 years ago
commit 3afe4d3fba59ff90fc9fc00c3c9a811dad33cd37
parent 0ccac59
1 file changed +40 -57
modified pkg/utils.c
@@ -98,81 +98,64 @@ query_yesno(const char *msg, ...)
	if (c == 'y' || c == 'Y')
		r = true;
	else if (c == '\n' || c == EOF)
-
		return false;
+
		return (false);

	while ((c = getchar()) != '\n' && c != EOF)
		continue;

-
	return r;
+
	return (r);
}

/* unlike realpath(3), this routine does not expand symbolic links */
char *
-
absolutepath(const char *src, char *dest, size_t dest_len) {
-
	char * res;
-
	size_t res_len, res_size, len;
-
	char pwd[MAXPATHLEN];
-
	const char *ptr = src;
-
	const char *next;
-
	const char *slash;
-

-
	len = strlen(src);
-

-
	if (len != 0 && src[0] != '/') {
-
		if (getcwd(pwd, sizeof(pwd)) == NULL)
-
			return NULL;
-

-
		res_len = strlen(pwd);
-
		res_size = res_len + 1 + len + 1;
-
		res = malloc(res_size);
-
		strlcpy(res, pwd, res_size);
-
	} else {
-
		res_size = (len > 0 ? len : 1) + 1;
-
		res = malloc(res_size);
-
		res_len = 0;
+
absolutepath(const char *src, char *dest, size_t dest_size) {
+
	size_t dest_len, src_len, cur_len;
+
	const char *cur, *next;
+

+
	src_len = strlen(src);
+
	bzero(dest, dest_size);
+
	if (src_len != 0 && src[0] != '/') {
+
		/* relative path, we use cwd */
+
		if (getcwd(dest, dest_size) == NULL)
+
			return (NULL);
	}
+
	dest_len = strlen(dest);

-
	next = src;
-
	for (ptr = src; next != NULL ; ptr = next + 1) {
-
		next = strchr(ptr, '/');
-

+
	for (cur = next = src; next != NULL; cur = next + 1) {
+
		next = strchr(cur, '/');
		if (next != NULL)
-
			len = next - ptr;
+
			cur_len = next - cur;
		else
-
			len = strlen(ptr);
-

-
		switch (len) {
-
		case 2:
-
			if (ptr[0] == '.' && ptr[1] == '.') {
-
				slash = strrchr(res, '/');
-
				if (slash != NULL) {
-
					res_len = slash - res;
-
					res[res_len] = '\0';
-
				}
-
				continue;
-
			}
-
			break;
-
		case 1:
-
			if (ptr[0] == '.')
-
				continue;
+
			cur_len = strlen(cur);

-
			break;
-
		case 0:
+
		/* check for special cases "", "." and ".." */
+
		if (cur_len == 0)
+
			continue;
+
		else if (cur_len == 1 && cur[0] == '.')
+
			continue;
+
		else if (cur_len == 2 && cur[0] == '.' && cur[1] == '.') {
+
			const char *slash = strrchr(dest, '/');
+
			if (slash != NULL) {
+
				dest_len = slash - dest;
+
				dest[dest_len] = '\0';
+
			}
			continue;
		}
-
		res[res_len++] = '/';
-
		strlcpy(res + res_len, ptr, res_size);
-
		res_len += len;
-
		res[res_len] = '\0';
-
	}

-
	if (res_len == 0)
-
		strlcpy(res, "/", res_size);
+
		if (dest_len + 1 + cur_len >= dest_size)
+
			return (NULL);
+
		dest[dest_len++] = '/';
+
		(void)memcpy(dest + dest_len, cur, cur_len);
+
		dest_len += cur_len;
+
		dest[dest_len] = '\0';
+
	}

-
	strlcpy(dest, res, dest_len);
-
	free(res);
+
	if (dest_len == 0) {
+
		if (strlcpy(dest, "/", dest_size) >= dest_size)
+
			return (NULL);
+
	}

-
	return &dest[0];
+
	return (dest);
}

/* what the pkg needs to load in order to display the requested info */