Table of Contents

Spkg

I don't plan to talk about/support archives explicitly (yet). There is more to spkg than that, such as removals and facilitating searching through metadata. Data will be read/written to a generic intermediate buffer then we can plugin archivers afterwards. Mnemoc will appreciating avoiding stdio anyway. (:

Proposed base structures

struct spkg_dep;
struct spkg_file;
struct spkg_md5;
struct spkg;
struct spkg_db;

struct spkg_db

The db just contains the packages installed on the system, and a table with all the “owned” files (with the file name as key and its owner).

struct spkg_db {
	struct tree pkgs;
	struct htable fltbl;
};

struct spkg

The 'spkg' package structure contains the package name and its dependencies. It also contains a list of files the package owns (symlist, flist, dirlist). These are the three major types of file. They classified as such because the removal priorities differ– you don't remove a directory then the file in it.

struct spkg { 	/* independant of archive etc */
	struct node self; 	/* node in spkg_db */
	
	char name[PKG_NAME_MAX];
	
	struct list deps; /* list of this packages dependencies */
	struct list flist; 	/* list of files with sum (node = struct spkg_file_sum) */
	struct list symlist; 	/* list of symlinks (node = struct spkg_file) */
	struct list dirlist; 	/* list of directories (node = struct spkg_file)  */
	
	/* 
	 * metadata
	 */
	char *title;	/* I  tag */
	char *text;	/* T tag */
	char *version;	/*V tag */
	char *url;	/* U  tag */
	char *author;	/* A  tag */
	char *maintainer;	/* M tag */
	char *category;	/* C tag */
	char *license;	/* L tag */
	char *stability;	/*S  tag */
	size_t files;	/* number of files the pkg owns. */
	size_t kbytes;	/* file size in kb */
};

struct spkg_file

A file contains the filename and and the owner. A file is in an entry in the spkg db (spkg_db→fltbl). In this context the filename is a key used to provide “which package owns this file?” functionality.

It is also used within a package itself as nodes in list of symlinks (spkg→symlist) and list of directories (spkg→dirlist).

struct spkg_file { 	
	struct node self; 	/* node in spkg_db->fltbl */
	struct node selfL; 	/* node in spkg->{f,dir,sum}list */
	char *fname; 	/* name of file */
	struct spkg *owner;
};

struct spkg_file_md5

This inherits the node structure of spkg_file but includes an extra field “md5” used to check if the the file has been modified. It is a node in spkg→flist.

struct spkg_file_md5 {
	struct spkg_file self;
	uint32_t md5[4];
}

struct spkg_dep

This is just a node in spkg→deps which contains the name of a package its owner depends upon. Currently we don't support depedencies particularily well. In the future, this may have an additional field to identify the type of dependency … and be used to generate dependancy graphs when more worthwhile.

struct spkg_dep {
	struct node self; 	/* node in spkg->deps */
	char *depname; 	/* name of package that owner depends upon */
};