Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
pkg which now use absolute path not real patch of the argument
Baptiste Daroussin committed 14 years ago
commit f82b0421a89d4a9b092193c5b2ee7288aec9ad09
parent 4d37c07a6fca344427e5c37d7e1031cf2e2ad445
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);