aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorMurray Stokely <murray@FreeBSD.org>2002-04-13 13:00:42 +0000
committerMurray Stokely <murray@FreeBSD.org>2002-04-13 13:00:42 +0000
commitbb2d14481b485409745ebd0374d0c73095b8c197 (patch)
tree5ea7aa06f682486f3f195e370800d64af684621e /usr.sbin
parent76ce87ffba344818041c92249fb5922ee9e74ce1 (diff)
downloadsrc-bb2d14481b485409745ebd0374d0c73095b8c197.tar.gz
src-bb2d14481b485409745ebd0374d0c73095b8c197.zip
Add support for an additional field to the packages/INDEX file. If
present, this field specifies the media volume that the disc is contained on. If the volume of a given packages is different than the current volume of mediaDevice, then the user is prompted -- "This is disc #%d. Package %s is on disc #%d\n" "Would you like to switch discs now?\n" If the user selects yes, then DEVICE_SHUTDOWN is called and the user is then prompted -- "Please remove disc #%d from you drive, and add disc #%d" This works well for a carefully crafted INDEX file, but more work needs to be done to sort dependencies on a given package based on the volume that they reside on, to minimize the amount of disc flipping required of the user. This commit is a no-op for normal INDEX files and FreeBSD CDs. These additional features are only used if the INDEX and cdrom.inf file have multi-volume support.
Notes
Notes: svn path=/head/; revision=94601
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/sysinstall/index.c53
1 files changed, 45 insertions, 8 deletions
diff --git a/usr.sbin/sysinstall/index.c b/usr.sbin/sysinstall/index.c
index bc6f3f80ca73..08847908f6bb 100644
--- a/usr.sbin/sysinstall/index.c
+++ b/usr.sbin/sysinstall/index.c
@@ -200,7 +200,7 @@ strip(char *buf)
}
static IndexEntryPtr
-new_index(char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *deps)
+new_index(char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *deps, int volume)
{
IndexEntryPtr tmp = safe_malloc(sizeof(IndexEntry));
@@ -213,6 +213,7 @@ new_index(char *name, char *pathto, char *prefix, char *comment, char *descr, ch
tmp->deps = _strdup(deps);
tmp->depc = 0;
tmp->installed = package_exists(name);
+ tmp->volume = volume;
return tmp;
}
@@ -269,11 +270,17 @@ readline(FILE *fp, char *buf, int max)
return rv;
}
+/*
+ * XXX - this function should do error checking, and skip corrupted INDEX
+ * lines without a set number of '|' delimited fields.
+ */
+
int
-index_parse(FILE *fp, char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *cats, char *rdeps)
+index_parse(FILE *fp, char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *cats, char *rdeps, int *volume)
{
char line[10240];
char junk[2048];
+ char volstr[2048];
char *cp;
int i;
@@ -289,10 +296,20 @@ index_parse(FILE *fp, char *name, char *pathto, char *prefix, char *comment, cha
cp += copy_to_sep(maint, cp, '|');
cp += copy_to_sep(cats, cp, '|');
cp += copy_to_sep(junk, cp, '|'); /* build deps - not used */
+ cp += copy_to_sep(rdeps, cp, '|');
+ if (index(cp, '|'))
+ cp += copy_to_sep(junk, cp, '|'); /* url - not used */
+ else {
+ strncpy(junk, cp, 1023);
+ *volume = 0;
+ return 0;
+ }
if (index(cp, '|'))
- copy_to_sep(rdeps, cp, '|');
- else
- strncpy(rdeps, cp, 1023);
+ cp += copy_to_sep(volstr, cp, '|'); /* media volume */
+ else {
+ strncpy(volstr, cp, 1023);
+ }
+ *volume = atoi(volstr);
return 0;
}
@@ -300,13 +317,14 @@ int
index_read(FILE *fp, PkgNodePtr papa)
{
char name[127], pathto[255], prefix[255], comment[255], descr[127], maint[127], cats[511], deps[2048];
+ int volume;
PkgNodePtr i;
- while (index_parse(fp, name, pathto, prefix, comment, descr, maint, cats, deps) != EOF) {
+ while (index_parse(fp, name, pathto, prefix, comment, descr, maint, cats, deps, &volume) != EOF) {
char *cp, *cp2, tmp[1024];
IndexEntryPtr idx;
- idx = new_index(name, pathto, prefix, comment, descr, maint, deps);
+ idx = new_index(name, pathto, prefix, comment, descr, maint, deps, volume);
/* For now, we only add things to menus if they're in categories. Keywords are ignored */
for (cp = strcpy(tmp, cats); (cp2 = strchr(cp, ' ')) != NULL; cp = cp2 + 1) {
*cp2 = '\0';
@@ -651,7 +669,26 @@ index_extract(Device *dev, PkgNodePtr top, PkgNodePtr who, Boolean depended)
*/
if (id->installed == 1)
- return DITEM_SUCCESS;
+ return DITEM_SUCCESS;
+
+ /*
+ * What if the package is not available on the current media volume?
+ *
+ */
+ if (id->volume != dev->volume) {
+ if (!msgYesNo("This is disc #%d. Package %s is on disc #%d\n"
+ "Would you like to switch discs now?\n", dev->volume,
+ id->name, id->volume)) {
+ DEVICE_SHUTDOWN(mediaDevice);
+ msgConfirm("Please remove disc #%d from your drive, and add disc #%d\n",
+ dev->volume, id->volume);
+ DEVICE_INIT(mediaDevice);
+ /* XXX, at this point we check to see if this is the
+ * correct disc, and if not, we loop */
+ } else {
+ return DITEM_FAILURE;
+ }
+ }
if (id && id->deps && strlen(id->deps)) {
char t[1024], *cp, *cp2;