/*- * Copyright 2010. Ivan Voras * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. */ /* * FreeBSD install - a package for the installation and maintainance * of non-core utilities. * * This module contains common definitions across pkg_patch. */ #ifndef _PKG_PATCH_H_ #define _PKG_PATCH_H_ #ifndef _PATH_TAR #define _PATH_TAR "/usr/bin/tar" #endif #ifndef _PATH_BSDIFF #define _PATH_BSDIFF "/usr/bin/bsdiff" #endif #ifndef _PATH_BSPATCH #define _PATH_BSPATCH "/usr/bin/bspatch" #endif #ifndef _PATH_GZIP #define _PATH_GZIP "/usr/bin/gzip" #endif #ifndef _PATH_BZIP2 #define _PATH_BZIP2 "/usr/bin/bzip2" #endif #ifndef _PATH_PKG_CREATE #define _PATH_PKG_CREATE "/usr/sbin/pkg_create" #endif #ifndef _PATH_PKG_DELETE #define _PATH_PKG_DELETE "/usr/sbin/pkg_delete" #endif #ifndef _PATH_PKG_ADD #define _PATH_PKG_ADD "/usr/sbin/pkg_add" #endif #ifndef PKG_FORMAT_EXT #define PKG_FORMAT_EXT "tbz" #endif #ifndef BSDIFF_EXT #define BSDIFF_EXT "bsdiff" #endif #ifndef PKGNAME_MAX #define PKGNAME_MAX 200 #endif #define PKGPATCH_FNAME "+PKGPATCH" #define PKGPATCH_VERSION_MAJOR 1 #define PKGPATCH_VERSION_MINOR 0 #define PKGPATCHINDEX_FNAME "PKGPATCHINDEX" #define PKGPATCH_SITE_URL "http://people.freebsd.org/~ivoras/pkgpatch" #define PKGPATCH_BACKUP_DIR_ENV "PKG_BACKUPDIR" #define PKGPATCH_BACKUP_DIR_DEFAULT "/var/backups/pkg" #define PKGPATCH_BACKUP_DIR (getenv(PKGPATCH_BACKUP_DIR_ENV) ? \ getenv(PKGPATCH_BACKUP_DIR_ENV) : PKGPATCH_BACKUP_DIR_DEFAULT) #define PREFIX_ENV "PREFIX" #define PREFIX_DEFAULT "/usr/local" #define PREFIX (getenv(PREFIX_ENV) ? getenv(PREFIX_ENV) : PREFIX_DEFAULT) enum PP_OP { PP_NONE, PP_MKPATCH, PP_APPLY, PP_MKPATCHDIR, PP_UPDATEWEB }; enum CMP_NAME { CMP_FULL_MATCH, CMP_BASE_MATCH, CMP_NO_MATCH, CMP_ERROR }; struct pkgxjob { char *filename; FILE *fp; }; SLIST_HEAD(filelist_head, filelist); struct filelist { char filename[PATH_MAX]; struct stat st; SLIST_ENTRY(filelist) linkage; }; SLIST_HEAD(pathlist_head, pathlist); struct pathlist { char path[PATH_MAX]; SLIST_ENTRY(pathlist) linkage; }; SLIST_HEAD(pkgjoinlist_head, pkgjoinlist); struct pkgjoinlist { char name1[PKGNAME_MAX]; char name2[PKGNAME_MAX]; SLIST_ENTRY(pkgjoinlist) linkage; }; enum PPMETHOD { PPMETHOD_UNKNOWN, PPMETHOD_CP, PPMETHOD_BSDIFF, PPMETHOD_LN }; STAILQ_HEAD(pplist_head, pplist); struct pplist { char filename[PATH_MAX]; enum PPMETHOD method; STAILQ_ENTRY(pplist) linkage; }; struct pkg_patch { short int version_major; short int version_minor; char source[PATH_MAX]; char target[PATH_MAX]; struct pplist_head pp_add; struct pplist_head pp_remove; struct pplist_head pp_rmdir; struct pplist_head pp_patch; }; #ifndef PKG_PATCH_MAIN extern int argc; extern char **argv; extern enum PP_OP patch_op; extern char *my_tmp; extern int flag_bsdiff; extern char *pkg_repo_url; #endif int strendswith(const char *bigstr, const char *end); int rm_rf(char *dir); int cp(char *from, char *to); int pkgxjob_start(struct pkgxjob *job, char *dir, char *filename); int pkgxjob_finish(struct pkgxjob *job); int filelist_gather(char *dir, struct filelist_head *head); int filelist_diff(struct filelist_head *fl1, struct filelist_head *fl2, struct filelist_head *diff); int filelist_intersect(struct filelist_head *fl1, struct filelist_head *fl2, struct filelist_head *flisect); int filelist_intersect_pkg(struct filelist_head *fl1, struct filelist_head *f2, struct pkgjoinlist_head *jlist); unsigned int filelist_count(struct filelist_head *flist); void filelist_free(struct filelist_head *flist); void pkgjoinlist_free(struct pkgjoinlist_head *plist); void parse_package_name(char *pkgfile, char *basename, char *version, char *suffix); int copy_file_absolute(char *from, char *to); int copy_file_attrs(char *from, struct stat *st_from, char *to); int replicate_dirtree(char *from, char *to); void read_pkgpatch_file(char *filename, struct pkg_patch *pp); unsigned int pplist_count(struct pplist_head *ppl); char *time_to_iso8601(time_t t); time_t iso8601_to_time(char *t); char *time_ctime(time_t t); void baton_twirl(void); Package *pkg_read_plist(char *pfilename); int check_conflicts(Package *pnew, char **pkglist); enum CMP_NAME compare_package_names(char *pkg1, char *pkg2); enum CMP_NAME check_dependencies(Package *pnew, char **pkglist); char *find_filename(char *fullname); #endif