#ifndef DPKG_H #define DPKG_H #include "templates.h" #include "memory.h" #include /************************************************************************** * Coping with an rfc822-esque field */ typedef struct dpkg_entry dpkg_entry; struct dpkg_entry { char *name; char *value; }; typedef struct dpkg_paragraph dpkg_paragraph; struct dpkg_paragraph { int n_entries; int n_allocated; dpkg_entry *entry; }; /************************************************************************** * Coping with a package (or many pkgs) as an abstract entity */ typedef enum {dr_NOOP,dr_LT,dr_LTEQ,dr_EQ,dr_GTEQ,dr_GT} dependency_relation; extern char *dependency_relation_sym[]; typedef struct dependency dependency; struct dependency { char *package; dependency_relation op; char *version; }; LIST(deplist, dependency*); LIST(deplistlist, deplist*); LIST(packagenamelist, char*); LIST(ownedpackagenamelist, char*); typedef struct dpkg_package dpkg_package; struct dpkg_package { char *package; char *version; char *source; char *source_ver; int priority; int arch_all; deplistlist *depends[4]; deplist *conflicts; ownedpackagenamelist *provides; dpkg_paragraph *details; }; LIST(packagelist, dpkg_package *); LIST(ownedpackagelist, dpkg_package *); typedef struct satisfieddep satisfieddep; struct satisfieddep { /* dependency *dep; */ deplist *depl; packagelist *pkgs; }; LIST(satisfieddeplist, satisfieddep *); /************************************************************************** * Coping with a source package (and collections thereof) as an abstract * entity, owning a bunch of binary packages */ typedef struct dpkg_source dpkg_source; struct dpkg_source { char *package; char *version; int fake; struct dpkg_sources *owner; ownedpackagelist **packages; /* one for each architecture */ dpkg_paragraph *details; }; HASH(sourcetbl,char *,dpkg_source *); typedef struct dpkg_sources dpkg_sources; struct dpkg_sources { int n_arches; char **archname; sourcetbl *sources; ownedpackagelist **unclaimedpackages; /* one for each arch */ }; /************************************************************************** */ typedef struct dpkg_collected_package dpkg_collected_package; struct dpkg_collected_package { dpkg_package *pkg; int installed, conflicted; enum { UNKNOWN, YES } installable; packagenamelist *mayaffect; /* on update, the installability_checked of each /mayaffect/ed package * is cleared, and the mayaffect list is cleared. * * note that installable = NO couldn't be maintained over adding a package * to testing. installable = YES can be, thanks to the mayaffect list * (once a package is removed, everything it mayaffect must be set back * to unknown, but everything else is okay) */ }; LIST(collpackagelist, dpkg_collected_package *); /************************************************************************** */ typedef struct dpkg_provision dpkg_provision; struct dpkg_provision { char *version; dpkg_collected_package *pkg; }; LIST(virtualpkg, dpkg_provision); HASH(virtualpkgtbl,char *,virtualpkg *); HASH(packagetbl,char *,dpkg_collected_package *); typedef struct dpkg_packages dpkg_packages; struct dpkg_packages { char *arch; packagetbl *packages; virtualpkgtbl *virtualpkgs; }; typedef struct dpkg_source_note dpkg_source_note; struct dpkg_source_note { dpkg_source *source; /* unowned */ int n_arches; packagelist **binaries; /* one for each arch */ }; HASH(sourcenotetbl, char *, dpkg_source_note *); LIST(source_note_list, dpkg_source_note *); /* contains a copy of the previous source_note */ LIST(source_note_listlist, source_note_list *); /* contains a copy of all the source_notes modified by the last op */ typedef struct dpkg_sources_note dpkg_sources_note; struct dpkg_sources_note { unsigned long magic; sourcenotetbl *sources; int n_arches; dpkg_packages **pkgs; char **archname; source_note_listlist *undo; }; void free_packages(dpkg_packages *pkgs); void free_sources(dpkg_sources *s); dpkg_packages *get_architecture(dpkg_sources *srcs, char *arch); /* parsing things */ int checkinstallable(dpkg_packages *pkgs, collpackagelist *instoneof); int checkinstallable2(dpkg_packages *pkgs, char *pkgname); satisfieddeplist *checkunsatisfiabledeps(dpkg_packages *pkgs, deplistlist *deps); dpkg_sources *read_directory(char *dir, int n_arches, char *archname[]); void write_directory(char *dir, dpkg_sources *srcs); void free_source(dpkg_source *s); /* adding and deleting and stuff */ dpkg_sources_note *new_sources_note(int n_arches, char **archname); void remove_source(dpkg_sources_note *srcsn, char *name); void upgrade_source(dpkg_sources_note *srcsn, dpkg_source *src); void upgrade_arch(dpkg_sources_note *srcsn, dpkg_source *src, char *arch); void write_notes(char *dir, dpkg_sources_note *srcsn); void free_sources_note(dpkg_sources_note *srcsn); void free_source_note(dpkg_source_note *srcn); void undo_change(dpkg_sources_note *srcsn); int can_undo(dpkg_sources_note *srcsn); void commit_changes(dpkg_sources_note *srcsn); int versioncmp(char *left, char *right); int cmpversions(char *left, int op, char *right); void add_package(dpkg_packages *pkgs, dpkg_package *pkg); void remove_package(dpkg_packages *pkgs, dpkg_collected_package *pkg); deplist *read_dep_and(char *buf); deplistlist *read_dep_andor(char *buf); ownedpackagenamelist *read_packagenames(char *buf); dpkg_packages *new_packages(char *arch); #endif