pkgsrc-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
pkg/33884: PKG_PATH handling is weird
>Number: 33884
>Category: pkg
>Synopsis: PKG_PATH handling is weird
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: pkg-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Jul 01 13:05:00 +0000 2006
>Originator: YAMAMOTO Takashi <yamt%mwd.biglobe.ne.jp@localhost>
>Release: NetBSD 3.99.21
>Organization:
>Environment:
System: NetBSD kaeru 3.99.21 NetBSD 3.99.21 (build.kaeru.xen.nodebug) #: Fri
Jun 30 09:45:59 JST 2006
takashi@kaeru:/home/takashi/work/kernel/build.kaeru.xen.nodebug i386
Architecture: i386
Machine: i386
>Description:
the behaviour of PKG_PATH is not straightforward, at best.
if you do:
PKG_PATH=/aa;/bb pkg_add cc/dd.tgz
a package "dd.tgz" will be searched in the following order:
1. ./cc/cc/dd.tgz <= weird
2. /aa/cc/dd.tgz
3. /bb/cc/dd.tgz
see this thread:
http://mail-index.NetBSD.org/tech-pkg/2002/10/29/0002.html
>How-To-Repeat:
>Fix:
i'm using the following patch. (revert path_prepend hack)
i think it can make some people unhappy, tho.
Index: add/perform.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/pkg_install/add/perform.c,v
retrieving revision 1.120
diff -u -p -r1.120 perform.c
--- add/perform.c 24 Apr 2006 13:36:22 -0000 1.120
+++ add/perform.c 1 Jul 2006 12:54:10 -0000
@@ -1079,9 +1079,7 @@ pkg_perform(lpkg_head_t *pkgs)
err_cnt = pkg_do(NULL, NULL);
else {
while ((lpp = TAILQ_FIRST(pkgs)) != NULL) {
- path_prepend_from_pkgname(lpp->lp_name);
err_cnt += pkg_do(lpp->lp_name, pkgs);
- path_prepend_clear();
TAILQ_REMOVE(pkgs, lpp, lp_link);
free_lpkg(lpp);
}
Index: lib/path.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/pkg_install/lib/path.c,v
retrieving revision 1.8
diff -u -p -r1.8 path.c
--- lib/path.c 5 Nov 2005 13:11:02 -0000 1.8
+++ lib/path.c 1 Jul 2006 12:54:10 -0000
@@ -1,4 +1,4 @@
-/* $NetBSD: path.c,v 1.8 2005/11/05 13:11:02 wiz Exp $ */
+/* $NetBSD: path.c,v 1.2 2002/08/08 00:17:39 yamt Exp $ */
/*-
* Copyright (c)2002 YAMAMOTO Takashi,
@@ -44,9 +44,6 @@ __RCSID("$NetBSD: path.c,v 1.8 2005/11/0
#include "lib.h"
struct pathhead PkgPath = TAILQ_HEAD_INITIALIZER(PkgPath);
-static struct path *prepend = 0;
-
-static struct path *path_new_entry(const char *cp, size_t len);
/*
* path_create: make PkgPath from a given string.
@@ -59,6 +56,8 @@ path_create(const char *path)
{
const char *cp;
size_t len;
+ char cwd[MAXPATHLEN];
+ size_t cwdlen;
path_free();
@@ -69,6 +68,10 @@ path_create(const char *path)
if (Verbose)
printf("parsing: %s\n", path);
+ if (getcwd(cwd, sizeof(cwd)) == NULL)
+ err(1, "getcwd");
+ cwdlen = strlen(cwd);
+
cp = path;
while (*cp) {
len = strcspn(cp, ";");
@@ -76,7 +79,28 @@ path_create(const char *path)
/* add a new path */
struct path *new;
- new = path_new_entry(cp, len);
+ new = malloc(sizeof(*new));
+ if (new == NULL)
+ err(1, "path_create");
+
+ if (!IS_FULLPATH(cp) && !IS_URL(cp)) {
+ /* this is a relative path */
+ size_t total;
+
+ total = cwdlen + 1 + len + 1;
+ new->pl_path = malloc(total);
+ if (new->pl_path == NULL)
+ err(1, "path_create");
+ snprintf(new->pl_path, total, "%s/%*.*s", cwd,
(int)len, (int)len, cp);
+ }
+ else {
+ new->pl_path = malloc(len + 1);
+ if (new->pl_path == NULL)
+ err(1, "path_create");
+ memcpy(new->pl_path, cp, len);
+ new->pl_path[len] = '\0';
+ }
+
if (Verbose)
printf("path: %s\n", new->pl_path);
TAILQ_INSERT_TAIL(&PkgPath, new, pl_entry);
@@ -105,69 +129,6 @@ path_free()
}
/*
- * path_new_entry: Generate a new 'struct path' entry to be included in
- * 'PkgPath' using the first 'len' characters of 'cp'.
- */
-static struct path *
-path_new_entry(const char *cp, size_t len)
-{
- struct path *new;
-
- new = malloc(sizeof(*new));
- if (new == NULL)
- err(EXIT_FAILURE, "path_create");
-
- if (!IS_FULLPATH(cp) && !IS_URL(cp)) {
- /* this is a relative path */
- size_t total;
- char cwd[MaxPathSize];
- size_t cwdlen;
-
- if (getcwd(cwd, sizeof(cwd)) == NULL)
- err(EXIT_FAILURE, "getcwd");
- cwdlen = strlen(cwd);
- total = cwdlen + 1 + len + 1;
- new->pl_path = malloc(total);
- if (new->pl_path == NULL)
- err(EXIT_FAILURE, "path_create");
- snprintf(new->pl_path, total, "%s/%*.*s", cwd, (int)len,
(int)len, cp);
- }
- else {
- new->pl_path = malloc(len + 1);
- if (new->pl_path == NULL)
- err(EXIT_FAILURE, "path_create");
- memcpy(new->pl_path, cp, len);
- new->pl_path[len] = '\0';
- }
- return new;
-}
-
-/*
- * path_prepend_from_pkgname: prepend the path for a package onto 'PkgPath'
- */
-void
-path_prepend_from_pkgname(const char *pkgname)
-{
- char *ptr;
- if ((ptr = strrchr(pkgname , '/'))) {
- prepend = path_new_entry(pkgname, ptr - pkgname);
- TAILQ_INSERT_HEAD(&PkgPath, prepend, pl_entry);
- }
-}
-
-/*
- * path_prepend_clear: Remove any prepended entry from 'PkgPath'
- */
-void
-path_prepend_clear()
-{
- if (prepend) {
- TAILQ_REMOVE(&PkgPath, prepend, pl_entry);
- prepend = 0;
- }
-}
-
-/*
* path_setenv: construct string from PkgPath and set it to a environment.
*
* => the environment name is given by envname.
Index: lib/path.h
===================================================================
RCS file: /cvsroot/src/usr.sbin/pkg_install/lib/path.h,v
retrieving revision 1.4
diff -u -p -r1.4 path.h
--- lib/path.h 2 Sep 2003 07:35:03 -0000 1.4
+++ lib/path.h 1 Jul 2006 12:54:10 -0000
@@ -35,6 +35,4 @@ TAILQ_HEAD(pathhead, path);
extern struct pathhead PkgPath;
void path_create(const char *);
void path_free(void);
-void path_prepend_from_pkgname(const char *);
-void path_prepend_clear(void);
void path_setenv(const char *);
>Unformatted:
Home |
Main Index |
Thread Index |
Old Index