summaryrefslogtreecommitdiff
path: root/main/filesdb.h
diff options
context:
space:
mode:
Diffstat (limited to 'main/filesdb.h')
-rw-r--r--main/filesdb.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/main/filesdb.h b/main/filesdb.h
new file mode 100644
index 000000000..f650c51f5
--- /dev/null
+++ b/main/filesdb.h
@@ -0,0 +1,127 @@
+/*
+ * dpkg - main program for package management
+ * filesdb.h - management of database of files installed on system
+ *
+ * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ *
+ * 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.
+ */
+
+#ifndef FILESDB_H
+#define FILESDB_H
+
+/*
+ * Data structure here is as follows:
+ *
+ * For each package we have a `struct fileinlist *', the head of
+ * a list of files in that package. They are in `forwards' order.
+ * Each entry has a pointer to the `struct filenamenode'.
+ *
+ * The struct filenamenodes are in a hash table, indexed by name.
+ * (This hash table is not visible to callers.)
+ *
+ * Each filenamenode has a (possibly empty) list of `struct
+ * filepackage', giving a list of the packages listing that
+ * filename.
+ *
+ * When we read files contained info about a particular package
+ * we set the `files' member of the clientdata struct to the
+ * appropriate thing. When not yet set the files pointer is
+ * made to point to `fileslist_uninited' (this is available only
+ * internally, withing filesdb.c - the published interface is
+ * ensure_*_available).
+ */
+
+struct pkginfo;
+
+struct filenamenode {
+ struct filenamenode *next;
+ char *name;
+ struct filepackages *packages;
+ struct diversion *divert;
+ /* Fields from here on are used by archives.c &c, and cleared by
+ * filesdbinit.
+ */
+ enum {
+ fnnf_new_conff= 000001, /* in the newconffiles list */
+ fnnf_new_inarchive= 000002, /* in the new filesystem archive */
+ fnnf_old_conff= 000004, /* in the old package's conffiles list */
+ fnnf_elide_other_lists= 000010, /* must remove from other packages' lists */
+ fnnf_no_atomic_overwrite= 000020, /* >=1 instance is a dir, cannot rename over */
+ } flags; /* Set to zero when a new node is created. */
+ const char *oldhash; /* valid iff this namenode is in the newconffiles list */
+};
+
+struct fileinlist {
+ struct fileinlist *next;
+ struct filenamenode *namenode;
+};
+
+struct diversion {
+ /* When we deal with an `overridden' file, every package except
+ * the overriding one is considered to contain the other file
+ * instead. Both files have entries in the filesdb database, and
+ * they refer to each other via these diversion structures.
+ *
+ * The contended filename's filenamenode has an diversion entry
+ * with useinstead set to point to the redirected filename's
+ * filenamenode; the redirected filenamenode has camefrom set to the
+ * contended filenamenode. Both sides' diversion entries will
+ * have pkg set to the package (if any) which is allowed to use the
+ * contended filename.
+ *
+ * Packages that contain either version of the file will all
+ * refer to the contended filenamenode in their per-file package lists
+ * (both in core and on disk). References are redirected to the other
+ * filenamenode's filename where appropriate.
+ */
+ struct filenamenode *useinstead;
+ struct filenamenode *camefrom;
+ struct pkginfo *pkg;
+ struct diversion *next;
+ /* The `contested' halves are in this list for easy cleanup. */
+};
+
+#define PERFILEPACKAGESLUMP 10
+
+struct filepackages {
+ struct filepackages *more;
+ struct pkginfo *pkgs[PERFILEPACKAGESLUMP];
+ /* pkgs is a null-pointer-terminated list; anything after the first null
+ * is garbage
+ */
+};
+
+struct fileiterator;
+struct fileiterator *iterfilestart(void);
+struct filenamenode *iterfilenext(struct fileiterator *i);
+void iterfileend(struct fileiterator *i);
+
+void ensure_diversions(void);
+
+void ensure_packagefiles_available(struct pkginfo *pkg);
+void ensure_allinstfiles_available(void);
+void ensure_allinstfiles_available_quiet(void);
+void note_must_reread_files_inpackage(struct pkginfo *pkg);
+struct filenamenode *findnamenode(const char *filename);
+void write_filelist_except(struct pkginfo *pkg, struct fileinlist *list, int leaveout);
+
+struct reversefilelistiter { struct fileinlist *todo; };
+
+void reversefilelist_init(struct reversefilelistiter *iterptr, struct fileinlist *files);
+struct filenamenode *reversefilelist_next(struct reversefilelistiter *iterptr);
+void reversefilelist_abort(struct reversefilelistiter *iterptr);
+
+#endif /* FILESDB_H */