The following commit has been merged in the master branch:
commit 4fb7afa06cbfef51a67b3e6da7648fa126e9f84c
Author: Guillem Jover <[email protected]>
Date: Tue Jun 16 22:07:58 2009 +0200
Move diversion db parsing into a new file
diff --git a/src/Makefile.am b/src/Makefile.am
index 19d864c..33854e1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,6 +18,7 @@ dpkg_SOURCES = \
enquiry.c \
errors.c \
filesdb.c filesdb.h \
+ divertdb.c \
statdb.c \
help.c \
main.c main.h \
@@ -40,6 +41,7 @@ dpkg_LDADD = \
dpkg_query_SOURCES = \
filesdb.c filesdb.h \
+ divertdb.c \
pkg-array.c pkg-array.h \
pkg-show.c \
query.c
diff --git a/src/divertdb.c b/src/divertdb.c
new file mode 100644
index 0000000..7c0d7cd
--- /dev/null
+++ b/src/divertdb.c
@@ -0,0 +1,134 @@
+/*
+ * dpkg - main program for package management
+ * divertdb.c - management of database of diverted files
+ *
+ * Copyright © 1995 Ian Jackson <[email protected]>
+ * Copyright © 2000, 2001 Wichert Akkerman <[email protected]>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+#include <compat.h>
+
+#include <dpkg-i18n.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include <pwd.h>
+#include <grp.h>
+#include <sys/types.h>
+
+#include <dpkg.h>
+#include <dpkg-db.h>
+#include <dpkg-priv.h>
+
+#include "filesdb.h"
+#include "main.h"
+
+static struct diversion *diversions = NULL;
+static FILE *diversionsfile = NULL;
+
+void
+ensure_diversions(void)
+{
+ static struct varbuf vb;
+
+ struct stat stab1, stab2;
+ char linebuf[MAXDIVERTFILENAME];
+ FILE *file;
+ struct diversion *ov, *oicontest, *oialtname;
+ int l;
+
+ varbufreset(&vb);
+ varbufaddstr(&vb, admindir);
+ varbufaddstr(&vb, "/" DIVERSIONSFILE);
+ varbufaddc(&vb, 0);
+
+ onerr_abort++;
+
+ file = fopen(vb.buf,"r");
+ if (!file) {
+ if (errno != ENOENT)
+ ohshite(_("failed to open diversions file"));
+ if (!diversionsfile) {
+ onerr_abort--;
+ return;
+ }
+ } else if (diversionsfile) {
+ if (fstat(fileno(diversionsfile), &stab1))
+ ohshite(_("failed to fstat previous diversions file"));
+ if (fstat(fileno(file), &stab2))
+ ohshite(_("failed to fstat diversions file"));
+ if (stab1.st_dev == stab2.st_dev &&
+ stab1.st_ino == stab2.st_ino) {
+ fclose(file);
+ onerr_abort--;
+ return;
+ }
+ }
+ if (diversionsfile)
+ fclose(diversionsfile);
+ diversionsfile = file;
+ setcloexec(fileno(diversionsfile), vb.buf);
+
+ for (ov = diversions; ov; ov = ov->next) {
+ ov->useinstead->divert->camefrom->divert = NULL;
+ ov->useinstead->divert = NULL;
+ }
+ diversions = NULL;
+ if (!file) {
+ onerr_abort--;
+ return;
+ }
+
+ while ((l = fgets_checked(linebuf, sizeof(linebuf), file, vb.buf)) >=
0) {
+ oicontest = nfmalloc(sizeof(struct diversion));
+ oialtname = nfmalloc(sizeof(struct diversion));
+
+ oialtname->camefrom = findnamenode(linebuf, 0);
+ oialtname->useinstead = NULL;
+
+ fgets_must(linebuf, sizeof(linebuf), file, vb.buf);
+ oicontest->useinstead = findnamenode(linebuf, 0);
+ oicontest->camefrom = NULL;
+
+ fgets_must(linebuf, sizeof(linebuf), file, vb.buf);
+ oicontest->pkg = oialtname->pkg = strcmp(linebuf, ":") ?
+ findpackage(linebuf) : NULL;
+
+ if (oialtname->camefrom->divert ||
+ oicontest->useinstead->divert)
+ ohshit(_("conflicting diversions involving `%.250s' or
`%.250s'"),
+ oialtname->camefrom->name,
oicontest->useinstead->name);
+
+ oialtname->camefrom->divert = oicontest;
+ oicontest->useinstead->divert = oialtname;
+
+ oicontest->next = diversions;
+ diversions = oicontest;
+ }
+ if (ferror(file))
+ ohshite(_("read error in diversions [i]"));
+
+ onerr_abort--;
+}
+
diff --git a/src/filesdb.c b/src/filesdb.c
index 0529c67..153259c 100644
--- a/src/filesdb.c
+++ b/src/filesdb.c
@@ -48,8 +48,6 @@
static int allpackagesdone= 0;
static int nfiles= 0;
-static struct diversion *diversions = NULL;
-static FILE *diversionsfile = NULL;
void
ensure_package_clientdata(struct pkginfo *pkg)
@@ -333,76 +331,6 @@ void reversefilelist_abort(struct reversefilelistiter
*iterptr) {
while (reversefilelist_next(iterptr));
}
-void ensure_diversions(void) {
- static struct varbuf vb;
-
- struct stat stab1, stab2;
- char linebuf[MAXDIVERTFILENAME];
- FILE *file;
- struct diversion *ov, *oicontest, *oialtname;
- int l;
-
- varbufreset(&vb);
- varbufaddstr(&vb,admindir);
- varbufaddstr(&vb,"/" DIVERSIONSFILE);
- varbufaddc(&vb,0);
-
- onerr_abort++;
-
- file= fopen(vb.buf,"r");
- if (!file) {
- if (errno != ENOENT) ohshite(_("failed to open diversions file"));
- if (!diversionsfile) { onerr_abort--; return; }
- } else if (diversionsfile) {
- if (fstat(fileno(diversionsfile),&stab1))
- ohshite(_("failed to fstat previous diversions file"));
- if (fstat(fileno(file),&stab2))
- ohshite(_("failed to fstat diversions file"));
- if (stab1.st_dev == stab2.st_dev && stab1.st_ino == stab2.st_ino) {
- fclose(file); onerr_abort--; return;
- }
- }
- if (diversionsfile) fclose(diversionsfile);
- diversionsfile= file;
- setcloexec(fileno(diversionsfile), vb.buf);
-
- for (ov= diversions; ov; ov= ov->next) {
- ov->useinstead->divert->camefrom->divert = NULL;
- ov->useinstead->divert = NULL;
- }
- diversions = NULL;
- if (!file) { onerr_abort--; return; }
-
- while ((l = fgets_checked(linebuf, sizeof(linebuf), file, vb.buf)) >= 0) {
- oicontest= nfmalloc(sizeof(struct diversion));
- oialtname= nfmalloc(sizeof(struct diversion));
-
- oialtname->camefrom= findnamenode(linebuf, 0);
- oialtname->useinstead = NULL;
-
- fgets_must(linebuf, sizeof(linebuf), file, vb.buf);
- oicontest->useinstead= findnamenode(linebuf, 0);
- oicontest->camefrom = NULL;
-
- fgets_must(linebuf, sizeof(linebuf), file, vb.buf);
- oicontest->pkg= oialtname->pkg=
- strcmp(linebuf, ":") ? findpackage(linebuf) : NULL;
-
- if (oialtname->camefrom->divert || oicontest->useinstead->divert)
- ohshit(_("conflicting diversions involving `%.250s' or `%.250s'"),
- oialtname->camefrom->name, oicontest->useinstead->name);
-
- oialtname->camefrom->divert= oicontest;
- oicontest->useinstead->divert= oialtname;
-
- oicontest->next= diversions;
- diversions= oicontest;
- }
- if (ferror(file)) ohshite(_("read error in diversions [i]"));
-
- onerr_abort--;
-}
-
struct fileiterator {
struct filenamenode *namenode;
int nbinn;
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]