Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg which now use absolute path not real patch of the argument
Baptiste Daroussin committed 14 years ago
commit f82b0421a89d4a9b092193c5b2ee7288aec9ad09
parent 4d37c07
3 files changed +71 -3
modified pkg/utils.c
@@ -5,6 +5,7 @@
#include <errno.h>
#include <libutil.h>
#include <string.h>
+
#include <unistd.h>
#include <pkg.h>

#include "utils.h"
@@ -29,6 +30,73 @@ query_yesno(const char *msg)
        return r;
}

+
char *
+
absolutepath(const char *src, size_t src_len, 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;
+

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

+
		res_len = strlen(pwd);
+
		res_size = res_len + 1 + src_len + 1;
+
		res = malloc(res_size);
+
		strlcpy(res, pwd, res_size);
+
	} else {
+
		res_size = (src_len > 0 ? src_len : 1) + 1;
+
		res = malloc(res_size);
+
		res_len = 0;
+
	}
+

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

+
		if (next != NULL)
+
			len = next - ptr;
+
		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;
+

+
				break;
+
			case 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);
+

+
	strlcpy(dest, res, dest_len);
+
	free(res);
+

+
	return &dest[0];
+
}
+

+

int
print_info(struct pkg * const pkg, unsigned int opt)
{
modified pkg/utils.h
@@ -15,5 +15,6 @@

bool query_yesno(const char *msg);
int print_info(struct pkg * const pkg, unsigned int opt);
+
char *absolutepath(const char *src, size_t src_len, char *dest, size_t dest_len);

#endif
modified pkg/which.c
@@ -10,6 +10,7 @@
#include <sysexits.h>

#include "which.h"
+
#include "utils.h"

void
usage_which(void)
@@ -25,7 +26,6 @@ exec_which(int argc, char **argv)
	struct pkgdb_it *it;
	struct pkg *pkg = NULL;
	char pathabs[MAXPATHLEN + 1];
-
	char pathabsdir[MAXPATHLEN + 1];
	int ret = EPKG_OK, retcode = EPKG_OK;
	const char *name, *version;

@@ -39,8 +39,7 @@ exec_which(int argc, char **argv)
		return (EX_IOERR);
	}

-
	realpath(dirname(argv[1]), pathabsdir);
-
	snprintf(pathabs, sizeof(pathabs), "%s/%s", pathabsdir, basename(argv[1]));
+
	absolutepath(argv[1], strlen(argv[1]), pathabs, sizeof(pathabs));

	if ((it = pkgdb_query_which(db, pathabs)) == NULL) {
		return (EX_IOERR);