summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoerg <joerg>2008-08-05 19:01:27 +0000
committerjoerg <joerg>2008-08-05 19:01:27 +0000
commitc31a27c772f9289ca786e2a6879d8548ec80055d (patch)
tree7c9f05e8daae3d60715a12a2f2a1f22e349f8af1
parent26f1594eaf877c9e9022cb277d2e262dc89c5b08 (diff)
downloadpkgsrc-c31a27c772f9289ca786e2a6879d8548ec80055d.tar.gz
Add another constant for temporary +REQUIRED_BY files. Don't use mkstemp
in pkg_delete for that purpose. If more than one produce tries to change this file, breakage will happen anyway and this means the system is somewhat self-healing.
-rw-r--r--pkgtools/pkg_install/files/delete/perform.c60
-rw-r--r--pkgtools/pkg_install/files/lib/lib.h3
2 files changed, 28 insertions, 35 deletions
diff --git a/pkgtools/pkg_install/files/delete/perform.c b/pkgtools/pkg_install/files/delete/perform.c
index 3c0a68a50e6..28c074782ac 100644
--- a/pkgtools/pkg_install/files/delete/perform.c
+++ b/pkgtools/pkg_install/files/delete/perform.c
@@ -1,4 +1,4 @@
-/* $NetBSD: perform.c,v 1.23.2.3 2008/08/05 18:41:44 joerg Exp $ */
+/* $NetBSD: perform.c,v 1.23.2.4 2008/08/05 19:01:27 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.15 1997/10/13 15:03:52 jkh Exp";
#else
-__RCSID("$NetBSD: perform.c,v 1.23.2.3 2008/08/05 18:41:44 joerg Exp $");
+__RCSID("$NetBSD: perform.c,v 1.23.2.4 2008/08/05 19:01:27 joerg Exp $");
#endif
#endif
@@ -119,32 +119,25 @@ cleanup(int sig)
static int
undepend(const char *deppkgname, void *vp)
{
- char *pkg2delname = vp;
- char fname[MaxPathSize], ftmp[MaxPathSize];
- char fbuf[MaxPathSize];
- FILE *fp, *fpwr;
- int s;
+ char *fname, *fname_tmp;
+ char fbuf[MaxPathSize];
+ const char *pkg2delname = vp;
+ FILE *fp, *fpwr;
- (void) snprintf(fname, sizeof(fname), "%s/%s/%s",
- _pkgdb_getPKGDB_DIR(), deppkgname, REQUIRED_BY_FNAME);
- fp = fopen(fname, "r");
- if (fp == NULL) {
+ fname = pkgdb_pkg_file(deppkgname, REQUIRED_BY_FNAME);
+ fname_tmp = pkgdb_pkg_file(deppkgname, REQUIRED_BY_FNAME_TMP);
+
+ if ((fp = fopen(fname, "r")) == NULL) {
warnx("couldn't open dependency file `%s'", fname);
+ free(fname);
+ free(fname_tmp);
return 0;
}
- (void) snprintf(ftmp, sizeof(ftmp), "%s.XXXXXX", fname);
- s = mkstemp(ftmp);
- if (s == -1) {
- fclose(fp);
- warnx("couldn't open temp file `%s'", ftmp);
- return 0;
- }
- fpwr = fdopen(s, "w");
- if (fpwr == NULL) {
- close(s);
+ if ((fpwr = fopen(fname_tmp, "w")) == NULL) {
fclose(fp);
- warnx("couldn't fdopen temp file `%s'", ftmp);
- remove(ftmp);
+ warnx("couldn't open temporary file `%s'", fname_tmp);
+ free(fname);
+ free(fname_tmp);
return 0;
}
while (fgets(fbuf, sizeof(fbuf), fp) != NULL) {
@@ -154,20 +147,19 @@ undepend(const char *deppkgname, void *vp)
fputs(fbuf, fpwr), putc('\n', fpwr);
}
(void) fclose(fp);
- if (fchmod(s, 0644) == FAIL) {
- warnx("error changing permission of temp file `%s'", ftmp);
- fclose(fpwr);
- remove(ftmp);
- return 0;
- }
if (fclose(fpwr) == EOF) {
- warnx("error closing temp file `%s'", ftmp);
- remove(ftmp);
+ warnx("error closing temporary file `%s'", fname_tmp);
+ remove(fname_tmp);
+ free(fname);
+ free(fname_tmp);
return 0;
}
- if (rename(ftmp, fname) == -1)
- warn("error renaming `%s' to `%s'", ftmp, fname);
- remove(ftmp); /* just in case */
+ if (rename(fname_tmp, fname) == -1)
+ warn("error renaming `%s' to `%s'", fname_tmp, fname);
+ remove(fname_tmp); /* just in case */
+
+ free(fname);
+ free(fname_tmp);
return 0;
}
diff --git a/pkgtools/pkg_install/files/lib/lib.h b/pkgtools/pkg_install/files/lib/lib.h
index 915eeefb68e..52d43bbe30a 100644
--- a/pkgtools/pkg_install/files/lib/lib.h
+++ b/pkgtools/pkg_install/files/lib/lib.h
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.42.2.10 2008/08/02 20:33:50 joerg Exp $ */
+/* $NetBSD: lib.h,v 1.42.2.11 2008/08/05 19:01:27 joerg Exp $ */
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
@@ -112,6 +112,7 @@ enum {
#define INSTALL_FNAME "+INSTALL"
#define DEINSTALL_FNAME "+DEINSTALL"
#define REQUIRED_BY_FNAME "+REQUIRED_BY"
+#define REQUIRED_BY_FNAME_TMP "+REQUIRED_BY.tmp"
#define DISPLAY_FNAME "+DISPLAY"
#define MTREE_FNAME "+MTREE_DIRS"
#define BUILD_VERSION_FNAME "+BUILD_VERSION"