From owner-p4-projects@FreeBSD.ORG Thu Aug 5 23:43:31 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2585A1065676; Thu, 5 Aug 2010 23:43:31 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DDBED106564A for ; Thu, 5 Aug 2010 23:43:30 +0000 (UTC) (envelope-from ivoras@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id C89B88FC08 for ; Thu, 5 Aug 2010 23:43:30 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.4/8.14.4) with ESMTP id o75NhUUi073245 for ; Thu, 5 Aug 2010 23:43:30 GMT (envelope-from ivoras@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.4/8.14.4/Submit) id o75NhU6Y073243 for perforce@freebsd.org; Thu, 5 Aug 2010 23:43:30 GMT (envelope-from ivoras@FreeBSD.org) Date: Thu, 5 Aug 2010 23:43:30 GMT Message-Id: <201008052343.o75NhU6Y073243@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ivoras@FreeBSD.org using -f From: Ivan Voras To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 181920 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Aug 2010 23:43:31 -0000 http://p4web.freebsd.org/@@181920?ac=10 Change 181920 by ivoras@ursaminor on 2010/08/05 23:42:41 Write real man page, add more dependancy checking. Affected files ... .. //depot/projects/soc2010/pkg_patch/src/patch/Makefile#30 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#20 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#20 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#29 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#29 edit .. //depot/projects/soc2010/pkg_patch/src/patch/main.c#30 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#28 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#28 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#13 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#12 edit .. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#3 edit .. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#28 edit .. //depot/projects/soc2010/pkg_patch/src/patch/support.c#27 edit .. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#8 edit .. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#8 edit Differences ... ==== //depot/projects/soc2010/pkg_patch/src/patch/Makefile#30 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#20 (text+ko) ==== @@ -270,8 +270,9 @@ char backup_pkg[PATH_MAX]; struct pkgxjob xpatch; struct pkg_patch pp; + struct pplist *pl; Package pkg_live, pkg_new; - struct pplist *pl; + enum CMP_NAME depcheck; FILE **fpvect; unsigned int err_count, n_patched_files, i; @@ -380,6 +381,26 @@ err_count++; } } + /* Check dependancies of the new package */ + depcheck = check_dependencies(&pkg_new, NULL); + if (depcheck == CMP_NO_MATCH || depcheck == CMP_BASE_MATCH) + printf("Dependancy error processing %s:\n", file_patch); + if (depcheck == CMP_NO_MATCH) { + if (!Force) + errx(1, "New package dependancies not satisfied"); + else + warnx("New package dependancies not satisfied" + " -- forced continue"); + } + if (depcheck == CMP_BASE_MATCH) { + printf("New package dependancies weakly matched - version " + "mismatch.\n"); + if (!Force) { + if (!y_or_n(0, "Continue?")) + errx(1, "Aborted."); + } else + printf("Forced continue.\n"); + } if (err_count != 0) errx(1, "Found %u errors. Cannot continue.", err_count); @@ -483,7 +504,7 @@ goto error_cleanup; } } - /* Step 6 - apply other classes - files to add, remove, dirs to rmdir */ + /* Step 6 - apply other cases - files to add, remove, dirs to rmdir */ STAILQ_FOREACH(pl, &pp.pp_add, linkage) { char livefile[PATH_MAX]; ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#20 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#29 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#29 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/main.c#30 (text+ko) ==== @@ -14,7 +14,7 @@ * FreeBSD install - a package for the installation and maintainance * of non-core utilities. * - * This is the "binary patch" module. + * This is the "binary patch" utility main module. */ #include @@ -117,7 +117,7 @@ asprintf(&my_tmp, "%spkg_patch.%d.%d", _PATH_TMP, getpid(), time(NULL)); if (mkdir(my_tmp, 0700) != 0) errx(1, "Cannot create working directory: %s", my_tmp); - if (Verbose) + if (Verbose > 1) printf("Using temporary directory: %s\n", my_tmp); } ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#28 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#28 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#13 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#12 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#3 (text+ko) ==== @@ -20,557 +20,71 @@ .Os .Sh NAME .Nm pkg_patch -.Nd a utility for managing binary package patches. THIS MANUAL PAGE IS NOT COMPLETED YET AND IS ONLY COPIED FROM pkg_add !!! +.Nd a utility for managing binary package patches. .Sh SYNOPSIS .Nm +.Op Fl f +.Op Fl v +.Fl a Ar patchfile +.Nm +.Op Fl b +.Op Fl v +.Fl c Ar source_package target_package patch_file +.Nm .Op Fl b -.Op Fl a Ar patchfile -.Op Fl c Ar package1 package2 patchfile +.Op Fl v +.Fl m Ar source_dir target_dir patch_dir +.Nm +.Op Fl v +.Fl u Ar patch_url +.Nm +.Fl h .Sh DESCRIPTION The .Nm command is used to work with patches to binary packages - creating them from existing binary packages and applying them to live systems. -THE REST OF THIS PAGE IS BOGUS. -.Sh WARNING -.Bf -emphasis -Since the -.Nm -command may execute scripts or programs contained within a package file, -your system may be susceptible to -.Dq Em trojan horses -or other subtle -attacks from miscreants who create dangerous package files. -.Pp -You are advised to verify the competence and identity of those who -provide installable package files. -For extra protection, use the -.Fl M -flag to extract the package file, and inspect its contents and scripts to -ensure it poses no danger to your system's integrity. -Pay particular -attention to any +INSTALL, +POST-INSTALL, +DEINSTALL, +POST-DEINSTALL, -+REQUIRE or +MTREE_DIRS files, and inspect the +CONTENTS file for -.Cm @cwd , -.Cm @mode -(check for setuid), -.Cm @dirrm , -.Cm @exec , -and -.Cm @unexec -directives, and/or use the -.Xr pkg_info 1 -command to examine the package file. -.Ef +It implements infrastructure for mass package creation and distribution +over the web. .Sh OPTIONS The following command line arguments are supported: .Bl -tag -width indent -.It Ar pkg-name Op Ar pkg-name ... -The named packages are installed. -A package name of -.Fl -will cause -.Nm -to read from stdin. -If the packages are not found in the current -working directory, -.Nm -will search them in each directory named by -.Ev PKG_PATH . -.It Fl v , -verbose +.It Fl v Turn on verbose output. -.It Fl K , -keep -Keep any downloaded package in -.Ev PKGDIR -if it is defined or in current directory by default. -.It Fl i , -no-deps -Install the package without fetching and installing -dependencies. -.It Fl I , -no-script -If any installation scripts (pre-install or post-install) exist for a given -package, do not execute them. -.It Fl n , -dry-run -Do not actually install a package, just report the steps that -would be taken if it was. -.It Fl R , -no-record -Do not record the installation of a package. -This means -that you cannot deinstall it later, so only use this option if -you know what you are doing! -.It Fl r , -remote -Use the remote fetching feature. -This will determine the appropriate -objformat and release and then fetch and install the package. -.It Fl f , -force -Force installation to proceed even if prerequisite packages are not -installed or the requirements script fails. -Although +.It Fl f +Force continuing operation even if non-critical errors are encountered, +such as error in installed package state or unsatisfied dependancies. +.It Fl a +Apply the specified package patch to the current live system. +The currently installed package must match the source package from which +the patch was generated. +.It Fl c +Create a package patch from two specified binary package files. +.It Fl m +Mass-create package patches from two directories of packages. +The .Nm -will still try to find and auto-install missing prerequisite packages, -a failure to find one will not be fatal. -.It Fl F -Already installed packages are not an error. -.It Fl p , -prefix Ar prefix -Set -.Ar prefix -as the directory in which to extract files from a package. -If a package has set its default directory, it will be overridden -by this flag. -Note that only the first -.Cm @cwd -directive will be replaced, since -.Nm -has no way of knowing which directory settings are relative and -which are absolute. -It is rare in any case to see more than one -directory transition made, but when such does happen and you wish -to have control over *all* directory transitions, then you -may then wish to look into the use of -.Cm MASTER -and -.Cm SLAVE -modes (see the -.Fl M -and -.Fl S -options). -If the -.Fl p -flag appears after any -.Fl P -flag on the command line, it overrides its effect, causing -.Nm -not to use the given -.Ar prefix -recursively. -.It Fl P Ar prefix -Does the same as the -.Fl p -option, except that the given -.Ar prefix -is also used recursively for the dependency packages, if any. -If the -.Fl P -flag appears after any -.Fl p -flag on the command line, it overrides its effect, causing -.Nm -to use the given -.Ar prefix -recursively. -.It Fl t , -template Ar template -Use -.Ar template -as the input to -.Xr mktemp 3 -when creating a -.Dq staging area . -By default, this is the string -.Pa /var/tmp/instmp.XXXXXX , -but it may be necessary to override it in the situation where -space in your -.Pa /var/tmp -directory is limited. -Be sure to leave some number of `X' characters -for -.Xr mktemp 3 -to fill in with a unique ID. -.Pp -You can get a performance boost by setting the staging area -.Ar template -to reside on the same disk partition as target directories for package -file installation; often this is -.Pa /usr . -.It Fl M , -master -Run in -.Cm MASTER -mode. -This is a very specialized mode for running -.Nm -and is meant to be run in conjunction with -.Cm SLAVE -mode. -When run in this mode, -.Nm -does no work beyond extracting the package into a temporary staging -area (see the -.Fl t -option), reading in the packing list, and then dumping it (prefaced by -the current staging area) to stdout where it may be filtered by a -program such as -.Xr sed 1 . -When used in conjunction with -.Cm SLAVE -mode, it allows you to make radical changes to the package structure -before acting on its contents. -.It Fl S , -slave -Run in -.Cm SLAVE -mode. -This is a very specialized mode for running -.Nm -and is meant to be run in conjunction with -.Cm MASTER -mode. -When run in this mode, -.Nm -expects the release contents to be already extracted and waiting -in the staging area, the location of which is read as a string -from stdin. -The complete packing list is also read from stdin, -and the contents then acted on as normal. -.It Fl C , -chroot Ar chrootdir -Before doing any operations, -.Xr chroot 2 -to the -.Ar chrootdir -directory so that all package files, and the package database, are -installed to -.Ar chrootdir . -Note that -.Ar chrootdir -needs to be a fairly complete file system, including everything normally -needed by -.Nm -to run. -This flag was added to help support operations done by -.Xr sysinstall 8 -and is not expected to be useful for much else. -Be careful that -.Ar chrootdir -is properly configured and cannot be modified by normal users, -versions of commands like -.Xr fetch 1 -may be run inside -.Ar chrootdir -as a side effect. -.El -.Pp -One or more -.Ar pkg-name -arguments may be specified, each being either a file containing the -package (these usually end with a -.Dq .tbz -suffix) or a -URL pointing at a file available on an ftp site. -Thus you may -extract files directly from their anonymous ftp locations (e.g.\& -.Nm -.Li ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1.14.7.tbz ) . -Note: If you wish to use -.Bf -emphasis -passive mode -.Ef -ftp in such transfers, set -the variable -.Bf -emphasis -FTP_PASSIVE_MODE -.Ef -to some value in your environment. -Otherwise, the more standard -ACTIVE mode may be used. -If -.Nm -consistently fails to fetch a package from a site known to work, -it may be because you have a firewall that demands the usage of -.Bf -emphasis -passive mode -.Ef -ftp. +will attempt to match each package from the source directory to exactly +one package in the target directory and produce both patches and the +index file in the specified patch directory. +The resulting directory will be called the "package patch repository." +.It Fl u +Compare the current system state with the package patch repository and +update any packages found to need updating. .Sh TECHNICAL DETAILS The .Nm -utility extracts each package's -.Dq "packing list" -into a special staging directory (see -.Sx ENVIRONMENT ) , -parses it, and then runs -through the following sequence to fully extract the contents of the package: -.Bl -enum -.It -A check is made to determine if the package is already recorded as installed. -If it is, installation is terminated. -.It -A check is made to determine if the package conflicts (from -.Ic @conflicts -directives, see -.Xr pkg_create 1 ) -with an already installed package. -If it is, installation is terminated. -.It -Scan all the package dependencies (from -.Ic @pkgdep -directives, see -.Xr pkg_create 1 ) -are read from the packing list. -If any of these required packages is not currently installed, -an attempt is made to find and install it; -if the missing package cannot be found or installed, -the installation is terminated. -.It -Search for any -.Ic @option -directives which control how the package is added to the system. -At the time of this writing, the only currently implemented option is -.Ic @option Cm extract-in-place -which will cause the package to be extracted directly into its -prefix directory without moving through a staging area. -.It -If -.Ic @option Cm extract-in-place -is enabled, the package is now extracted directly into its -final location, otherwise it is extracted into the staging area. -.It -If a requirements script -.Pa +REQUIRE -exists for the package (see the -.Fl r -flag of -.Xr pkg_create 1 ) , -then execute it with the following arguments: -.Pp -.D1 Ar pkg-name Li INSTALL -.Pp -where -.Ar pkg-name -is the name of the package in question and the -.Dq Li INSTALL -keyword denotes this as an installation requirements check (useful if -you want to have one script serving multiple functions). -.It -If a pre-install script -.Pa +INSTALL -exists for the package, -it is then executed with the following arguments: -.Pp -.D1 Ar pkg-name Li PRE-INSTALL -.Pp -where -.Ar pkg-name -is the name of the package in question and -.Dq Li PRE-INSTALL -is a keyword denoting this as the preinstallation phase. -.Pp -.Sy Note : -The -.Dq Li PRE-INSTALL -keyword will not appear if separate scripts for pre-install and post-install -are given during package creation time (using the -.Fl i -and -.Fl I -flags to -.Xr pkg_create 1 ) . -.It -If -.Cm @option Cm extract-in-place -is not used, then the packing list (this is the -.Pa +CONTENTS -file) is now used as a guide for moving (or copying, as necessary) files from -the staging area into their final locations. -.It -If an mtree file -.Pa +MTREE_DIRS -exists for the package (see the -.Fl m -flag of -.Xr pkg_create 1 ) , -then -.Xr mtree 8 -is invoked as: -.Pp -.D1 Nm mtree Fl U f Pa +MTREE_DIRS Fl d e p Ar prefix -.Pp -where -.Ar prefix -is either the prefix specified with the -.Fl p -or -.Fl P -flag or, -if neither flag was specified, the name of the first directory named by a -.Ic @cwd -directive within this package. -.It -If a post-install script -.Pa +POST-INSTALL -exists for the package, -it is then executed with the following arguments: -.Pp -.D1 Ar pkg-name Li POST-INSTALL -.Pp -where -.Ar pkg-name -is the name of the package in question and -.Dq Li POST-INSTALL -is a keyword denoting this as the post-installation phase. -.Pp -.Sy Note : -The -.Dq Li POST-INSTALL -keyword will not appear if separate scripts for pre-install and post-install -are given during package creation time (using the -.Fl i -and -.Fl I -flags to -.Xr pkg_create 1 ) . -.Pp -Reasoning behind passing keywords such as -.Dq Li POST-INSTALL -and -.Dq Li PRE-INSTALL -is that this allows you to write a single -install -script that does both -.Dq before -and -.Dq after -actions. -But, separating the -functionality is more advantageous and easier from a maintenance viewpoint. -.It -After installation is complete, a copy of the -description -.Pq Pa +DESC , -comment -.Pq Pa +COMMENT , -pre-install script -.Pq Pa +INSTALL , -post-install script -.Pq Pa +POST-INSTALL , -deinstall script -.Pq Pa +DEINSTALL , -post-deinstall script -.Pq Pa +POST-DEINSTALL , -requirements script -.Pq Pa +REQUIRE , -display -.Pq Pa +DISPLAY , -mtree -.Pq Pa +MTREE_DIRS , -and packing list -.Pq Pa +CONTENTS -files are copied into -.Pa /var/db/pkg/ Ns Aq Ar pkg-name -for subsequent possible use by -.Xr pkg_delete 1 . -Any package dependencies are recorded in the other packages' -.Pa /var/db/pkg/ Ns Ao Ar other-pkg Ac Ns Pa /+REQUIRED_BY -file -(if the environment variable -.Ev PKG_DBDIR -is set, this overrides the -.Pa /var/db/pkg/ -path shown above). -.It -Finally, the staging area is deleted and the program terminates. -.El -.Pp -All the scripts are called with the environment variable -.Ev PKG_PREFIX -set to the installation prefix (see the -.Fl p -and -.Fl P -options above). -This allows a package author to write a script -that reliably performs some action on the directory where the package -is installed, even if the user might change it with the -.Fl p -or -.Fl P -flags to -.Nm . -.Sh ENVIRONMENT -The value of the -.Ev PKG_PATH -is used if a given package cannot be found. -The environment variable -should be a series of entries separated by colons. -Each entry -consists of a directory name. -The current directory may be indicated -implicitly by an empty directory name, or explicitly by a single -period. -.Pp -The environment variable -.Ev PKG_DBDIR -specifies an alternative location for the installed package database, -default location is +utility operates on binary package files and on the live system, including +the package database in .Pa /var/db/pkg . -.Pp -The environment variables -.Ev PKG_TMPDIR -and -.Ev TMPDIR , -in that order, are taken to name temporary directories where +All modes of operation require .Nm -will attempt to create its staging area in. -If these variables are not present or if the directories named lack -sufficient space, then +to be run as the superuser. +Currently, .Nm -will use the first of -.Pa /var/tmp , -.Pa /tmp -or -.Pa /usr/tmp -with sufficient space. -.Pp -The environment variable -.Ev PACKAGEROOT -specifies an alternate location for -.Nm -to fetch from. -The fetch URL is built using this environment variable and the automatic -directory logic that -.Nm -uses when the -.Fl r -option is invoked. -An example setting would be -.Qq Li ftp://ftp3.FreeBSD.org . -.Pp -The environment variable -.Ev PACKAGESITE -specifies an alternate location for -.Nm -to fetch from. -This variable subverts the automatic directory logic -that -.Nm -uses when the -.Fl r -option is invoked. -Thus it should be a complete URL to the remote package file(s). -.Pp -The environment variable -.Ev PKGDIR -specifies an alternative location to save downloaded packages to when -.Fl K -option is used. -.Sh FILES -.Bl -tag -width /var/db/pkg -compact -.It Pa /var/tmp -Temporary directory for creating the staging area, if environmental variables -.Ev PKG_TMPDIR -or -.Ev TMPDIR -do not point to a suitable directory. -.It Pa /tmp -Next choice if -.Pa /var/tmp -does not exist or has insufficient space. -.It Pa /usr/tmp -Last choice if -.Pa /var/tmp -and -.Pa /tmp -are not suitable for creating the staging area. -.It Pa /var/db/pkg -Default location of the installed package database. -.El +does not invoke any scripts specified in the package files. .Sh SEE ALSO +.Xr pkg_add 1 , .Xr pkg_create 1 , .Xr pkg_delete 1 , .Xr pkg_info 1 , @@ -579,21 +93,14 @@ .Xr sysconf 3 , .Xr mtree 8 .Sh AUTHORS -.An Jordan Hubbard -.Sh CONTRIBUTORS -.An John Kohl Aq jtk@rational.com +.An Ivan Voras Aq ivoras@freebsd.org .Sh BUGS -Hard links between files in a distribution are only preserved if either -(1) the staging area is on the same file system as the target directory of -all the links to the file, or (2) all the links to the file are bracketed by -.Cm @cwd -directives in the contents file, -.Em and -the link names are extracted with a single -.Cm tar -command (not split between -invocations due to exec argument-space limitations--this depends on the -value returned by -.Fn sysconf _SC_ARG_MAX ) . -.Pp -Sure to be others. +Many low-level details of +.Nm +(such as hard link handling, etc) depend on the behaviour of the +.Xr tar 1 +utility. +This is also the reason why +.Nm +needs superuser privileges while running in all modes of operation. + ==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#28 (text+ko) ==== @@ -72,6 +72,8 @@ 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; @@ -156,5 +158,7 @@ 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); #endif ==== //depot/projects/soc2010/pkg_patch/src/patch/support.c#27 (text+ko) ==== @@ -691,7 +691,7 @@ /* * Check for conflicts from metadata in the new package to recorded packages. * Returns (i+1) if the given package pnew conflicts on the i'th element - * in pkglist. + * in pkglist. Returns 0 if no conflict detected. */ int check_conflicts(Package *pnew, char **pkglist) @@ -722,3 +722,79 @@ * if needed. */ return (0); } + + +/* + * Compare two package names based on their individual components. Returns + * the amount of similarity between the names. + */ +enum CMP_NAME +compare_package_names(char *pkg1, char *pkg2) +{ + char base1[PKGNAME_MAX], ver1[PKGNAME_MAX]; + char base2[PKGNAME_MAX], ver2[PKGNAME_MAX]; + + if (pkg1 == NULL || pkg2 == NULL) + return (CMP_NO_MATCH); + parse_package_name(pkg1, base1, ver1, NULL); + parse_package_name(pkg2, base2, ver2, NULL); + if (strncmp(base1, base2, PKGNAME_MAX) != 0) + return (CMP_NO_MATCH); + if (strncmp(ver1, ver2, PKGNAME_MAX) != 0) + return (CMP_BASE_MATCH); + return (CMP_FULL_MATCH); +} + + +/* + * Check package dependencies on the given pkglist or the currently installed + * packages. + */ +enum CMP_NAME +check_dependencies(Package *pnew, char **pkglist) +{ + int er, i; + PackingList pl; + enum CMP_NAME best; + + best = CMP_FULL_MATCH; + if (pkglist == NULL) { + pkglist = matchinstalled(MATCH_ALL, NULL, &er); + if (pkglist == NULL || er != 0) { + warnx("Cannot fetch a list of installed packages " + "(matchinstalled(MATCH_ALL...))"); + return (-1); + } + } + pl = pnew->head; + while (pl != NULL) { + if (pl->type == PLIST_PKGDEP) { + enum CMP_NAME match; + int found = 0; + + for (i = 0; pkglist[i] != NULL; i++) { + match = compare_package_names(pl->name, + pkglist[i]); + if (match == CMP_BASE_MATCH) { + if (best == CMP_FULL_MATCH) + best = CMP_BASE_MATCH; + found = 1; + break; + } else if (match == CMP_FULL_MATCH) { + found = 1; + break; + } + } + if (!found) { + warnx("Dependancy not found: %s", + pl->name); + best = CMP_NO_MATCH; + break; + } + } + pl = pl->next; + } + /* XXX: When libpkg grows a storefree() API, use it to free pkglist + * if needed. */ + return (best); +} ==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#8 (text+ko) ==== @@ -117,7 +117,7 @@ static void -split_filename(char *path, char *fname, int len) +extract_filename(char *path, char *fname, int len) { strncpy(fname, strrchr(path, '/')+1, len); } @@ -188,7 +188,7 @@ if (Verbose > 1) printf("Patching from %s (index file: %s)\n", url_base, url_index); - split_filename(url_index, index_fname, PATH_MAX); + extract_filename(url_index, index_fname, PATH_MAX); snprintf(local_index, PATH_MAX, "%s/%s", my_tmp, index_fname); if (Verbose > 2) printf("Downloading pkgpatchindex to %s\n", local_index); @@ -292,7 +292,6 @@ } } - scount = 1; while (scount != 0) { int ndeps = 0, ndeps_found = 0; ==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#8 (text+ko) ====