diff options
| author | Maxim Sobolev <sobomax@FreeBSD.org> | 2001-03-15 10:47:00 +0000 |
|---|---|---|
| committer | Maxim Sobolev <sobomax@FreeBSD.org> | 2001-03-15 10:47:00 +0000 |
| commit | a6586506115ed34fc11089ada2f874a3a5c9d6df (patch) | |
| tree | 62ed46bb4e9a17d154b1811540e4a8f9d4ee6c53 /usr.sbin/pkg_install/lib | |
| parent | bdc8631e01562f18e4f3305428717739d8af83a4 (diff) | |
Notes
Diffstat (limited to 'usr.sbin/pkg_install/lib')
| -rw-r--r-- | usr.sbin/pkg_install/lib/Makefile | 3 | ||||
| -rw-r--r-- | usr.sbin/pkg_install/lib/deps.c | 113 | ||||
| -rw-r--r-- | usr.sbin/pkg_install/lib/lib.h | 4 |
3 files changed, 119 insertions, 1 deletions
diff --git a/usr.sbin/pkg_install/lib/Makefile b/usr.sbin/pkg_install/lib/Makefile index 990bfe3e19fc..0fb00b2e0700 100644 --- a/usr.sbin/pkg_install/lib/Makefile +++ b/usr.sbin/pkg_install/lib/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ LIB= install -SRCS= file.c msg.c plist.c str.c exec.c global.c pen.c match.c +SRCS= file.c msg.c plist.c str.c exec.c global.c pen.c match.c \ + deps.c CFLAGS+= ${DEBUG} NOPROFILE= yes NOPIC= yes diff --git a/usr.sbin/pkg_install/lib/deps.c b/usr.sbin/pkg_install/lib/deps.c new file mode 100644 index 000000000000..4c06da8df1fa --- /dev/null +++ b/usr.sbin/pkg_install/lib/deps.c @@ -0,0 +1,113 @@ +#ifndef lint +static const char rcsid[] = + "$FreeBSD$"; +#endif + +/* + * FreeBSD install - a package for the installation and maintainance + * of non-core utilities. + * + * 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. + * + * Maxim Sobolev + * 14 March 2001 + * + * Routines used to do various operations with dependencies + * among installed packages. + * + */ + +#include "lib.h" + +#include <err.h> +#include <stdio.h> + +/* + * Sort given NULL-terminated list of installed packages (pkgs) in + * such a way that if package A depends on package B then after + * sorting A will be listed before B no matter how they were + * originally positioned in the list. + */ +int +sortdeps(char **pkgs) +{ + char *tmp; + int i, j, loop_cnt; + int err_cnt = 0; + + for (i = 0; pkgs[i]; i++) { + /* + * Check to see if any other package in pkgs[i+1:] depends + * on pkgs[i] and swap those two packages if so. + */ + loop_cnt = 0; + for (j = i + 1; pkgs[j]; j++) { + if (chkifdepends(pkgs[j], pkgs[i]) == 1) { + /* + * Try to avoid deadlock if package A depends on B which in + * turn depends on C and C due to an error depends on A. + * Use ugly but simple method, becase it Should Never + * Happen[tm] in the real life anyway. + */ + if (loop_cnt > 4096) { + warnx("dependency loop detected for package %s", pkgs[j]); + err_cnt++; + break; + } + loop_cnt++; + tmp = pkgs[i]; + pkgs[i] = pkgs[j]; + pkgs[j] = tmp; + /* + * Another iteration requred to check if new pkgs[i] + * itself has any packages that depend on it + */ + j = i + 1; + } + } + } + return err_cnt; +} + +/* + * Check to see if pkgname1 depends on pkgname2. + * Returns 1 if depends, 0 if not, and -1 if error occured. + */ +int +chkifdepends(char *pkgname1, char *pkgname2) +{ + FILE *fp; + char fname[FILENAME_MAX]; + char fbuf[FILENAME_MAX]; + char *tmp; + int retval; + + sprintf(fname, "%s/%s/%s", + (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR, + pkgname2, REQUIRED_BY_FNAME); + fp = fopen(fname, "r"); + if (fp == NULL) { + /* Probably pkgname2 doesn't have any packages that depend on it */ + return 0; + } + + retval = 0; + while (fgets(fbuf, sizeof(fbuf), fp) != NULL) { + if (fbuf[strlen(fbuf)-1] == '\n') + fbuf[strlen(fbuf)-1] = '\0'; + if (strcmp(fbuf, pkgname1) == 0) { /* match */ + retval = 1; + break; + } + } + + fclose(fp); + return retval; +} diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h index fae802da1430..0ed689984366 100644 --- a/usr.sbin/pkg_install/lib/lib.h +++ b/usr.sbin/pkg_install/lib/lib.h @@ -177,6 +177,10 @@ int pkg_perform(char **); /* Query installed packages */ char **matchinstalled(match_t, char **, int *); +/* Dependencies */ +int sortdeps(char **); +int chkifdepends(char *, char *); + /* Externs */ extern Boolean Verbose; extern Boolean Fake; |
