/*
 * dpkg - main program for package management
 * filesdb.h - management of database of files installed on system
 *
 * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
 * Copyright © 2008-2010 Guillem Jover <guillem@debian.org>
 *
 * 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 of the License, 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef FILESDB_H
#define FILESDB_H

#include <dpkg/file.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, within filesdb.c - the published
 * interface is ensure_*_available).
 */

struct pkginfo;

/* Flags to findnamenode(). */
enum fnnflags {
    /* Do not need to copy filename. */
    fnn_nocopy = 000001,
    /* findnamenode may return NULL. */
    fnn_nonew = 000002,
};

struct filenamenode {
  struct filenamenode *next;
  const char *name;
  struct filepackages *packages;
  struct diversion *divert;

  /* We allow the administrator to override the owner, group and mode of
   * a file. If such an override is present we use that instead of the
   * stat information stored in the archive.
   *
   * This functionality used to be in the suidmanager package. */
  struct file_stat *statoverride;

  /*
   * Fields from here on are used by archives.c &c, and cleared by
   * filesdbinit.
   */

  /* Set to zero when a new node is created. */
  enum {
    /* In the newconffiles list. */
    fnnf_new_conff = 000001,
    /* In the new filesystem archive. */
    fnnf_new_inarchive = 000002,
    /* In the old package's conffiles list. */
    fnnf_old_conff = 000004,
    /* Obsolete conffile. */
    fnnf_obs_conff = 000100,
    /* Must remove from other packages' lists. */
    fnnf_elide_other_lists = 000010,
    /* >= 1 instance is a dir, cannot rename over. */
    fnnf_no_atomic_overwrite = 000020,
    /* New file has been placed on the disk. */
    fnnf_placed_on_disk = 000040,
    fnnf_deferred_fsync = 000200,
    fnnf_deferred_rename = 000400,
    /* Path being filtered. */
    fnnf_filtered = 001000,
  } flags;

  /* Valid iff this namenode is in the newconffiles list. */
  const char *oldhash;

  struct stat *filestat;
  struct trigfileint *trig_interested;
};

struct fileinlist {
  struct fileinlist *next;
  struct filenamenode *namenode;
};

/*
 * 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 contested 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 contested 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
 * contested 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 diversion {
  struct filenamenode *useinstead;
  struct filenamenode *camefrom;
  struct pkginfo *pkg;

  /* The ‘contested’ halves are in this list for easy cleanup. */
  struct diversion *next;
};

const char *pkgadmindir(void);
const char *pkgadminfile(struct pkginfo *pkg, const char *filetype);

struct filepackages_iterator;
struct filepackages_iterator *filepackages_iter_new(struct filenamenode *fnn);
struct pkginfo *filepackages_iter_next(struct filepackages_iterator *i);
void filepackages_iter_free(struct filepackages_iterator *i);

void filesdbinit(void);

struct fileiterator;
struct fileiterator *iterfilestart(void);
struct filenamenode *iterfilenext(struct fileiterator *i);
void iterfileend(struct fileiterator *i);

void ensure_package_clientdata(struct pkginfo *pkg);

void ensure_diversions(void);

uid_t statdb_parse_uid(const char *str);
gid_t statdb_parse_gid(const char *str);
mode_t statdb_parse_mode(const char *str);
void ensure_statoverrides(void);

#define LISTFILE           "list"

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, enum fnnflags flags);
void write_filelist_except(struct pkginfo *pkg, struct fileinlist *list,
                           enum fnnflags mask);

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 */
