diff options
Diffstat (limited to 'release/sysinstall/dist.c')
-rw-r--r-- | release/sysinstall/dist.c | 353 |
1 files changed, 206 insertions, 147 deletions
diff --git a/release/sysinstall/dist.c b/release/sysinstall/dist.c index f01c5b5..3db283d 100644 --- a/release/sysinstall/dist.c +++ b/release/sysinstall/dist.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dist.c,v 1.34 1995/05/29 14:38:31 jkh Exp $ + * $Id: dist.c,v 1.35.2.35 1995/06/10 14:20:10 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -44,88 +44,12 @@ #include "sysinstall.h" unsigned int Dists; +unsigned int DESDists; unsigned int SrcDists; unsigned int XF86Dists; unsigned int XF86ServerDists; unsigned int XF86FontDists; -static int distSetXF86(char *str); - -int -distReset(char *str) -{ - Dists = 0; - SrcDists = 0; - XF86Dists = 0; - XF86ServerDists = 0; - XF86FontDists = 0; - return 0; -} - -int -distSetDeveloper(char *str) -{ - Dists = _DIST_DEVELOPER; - SrcDists = DIST_SRC_ALL; - return 0; -} - -int -distSetXDeveloper(char *str) -{ - Dists = _DIST_XDEVELOPER; - SrcDists = DIST_SRC_ALL; - distSetXF86(NULL); - return 0; -} - -int -distSetUser(char *str) -{ - Dists = _DIST_USER; - return 0; -} - -int -distSetXUser(char *str) -{ - Dists = _DIST_XUSER; - distSetXF86(NULL); - return 0; -} - -int -distSetMinimum(char *str) -{ - Dists = DIST_BIN; - return 0; -} - -int -distSetEverything(char *str) -{ - Dists = DIST_ALL; - SrcDists = DIST_SRC_ALL; - distSetXF86(NULL); - return 0; -} - -int -distSetSrc(char *str) -{ - dmenuOpenSimple(&MenuSrcDistributions); - if (SrcDists) - Dists |= DIST_SRC; - return 0; -} - -static int -distSetXF86(char *str) -{ - dmenuOpenSimple(&MenuXF86Select); - return 0; -} - typedef struct _dist { char *my_name; char *my_dir; @@ -134,27 +58,41 @@ typedef struct _dist { struct _dist *my_dist; } Distribution; +extern Distribution DistTable[]; +extern Distribution DESDistTable[]; extern Distribution SrcDistTable[]; extern Distribution XF86DistTable[]; extern Distribution XF86FontDistTable[]; extern Distribution XF86ServerDistTable[]; - /* The top-level distribution categories */ static Distribution DistTable[] = { { "bin", "/", &Dists, DIST_BIN, NULL }, { "games", "/", &Dists, DIST_GAMES, NULL }, +{ "help", NULL, &Dists, DIST_HELP, NULL }, { "manpages", "/", &Dists, DIST_MANPAGES, NULL }, { "proflibs", "/", &Dists, DIST_PROFLIBS, NULL }, { "dict", "/", &Dists, DIST_DICT, NULL }, +{ "info", "/", &Dists, DIST_INFO, NULL }, { "src", "/", &Dists, DIST_SRC, SrcDistTable }, -{ "des", "/", &Dists, DIST_DES, NULL }, +{ "des", "/", &Dists, DIST_DES, DESDistTable }, { "compat1x", "/", &Dists, DIST_COMPAT1X, NULL }, { "compat20", "/", &Dists, DIST_COMPAT20, NULL }, +{ "commerce", "/usr/local", &Dists, DIST_COMMERCIAL, NULL }, +{ "xperimnt", "/usr/local", &Dists, DIST_EXPERIMENTAL, NULL }, { "XF86311", "/usr", &Dists, DIST_XF86, XF86DistTable }, { NULL }, }; +/* The DES distribution (not for export!) */ +static Distribution DESDistTable[] = { +{ "des", "/", &DESDists, DIST_DES_DES, NULL }, +{ "krb", "/", &DESDists, DIST_DES_KERBEROS, NULL }, +{ "ssecure", "/usr/src", &DESDists, DIST_DES_SSECURE, NULL }, +{ "sebones", "/usr/src", &DESDists, DIST_DES_SEBONES, NULL }, +{ NULL }, +}; + /* The /usr/src distribution */ static Distribution SrcDistTable[] = { { "sbase", "/usr/src", &SrcDists, DIST_SRC_BASE, NULL }, @@ -171,8 +109,6 @@ static Distribution SrcDistTable[] = { { "ssys", "/usr/src", &SrcDists, DIST_SRC_SYS, NULL }, { "subin", "/usr/src", &SrcDists, DIST_SRC_UBIN, NULL }, { "susbin", "/usr/src", &SrcDists, DIST_SRC_USBIN, NULL }, -{ "XF86-xc", "/usr/X11R6/src", &SrcDists, DIST_SRC_XF86, NULL }, -{ "XF86-co", "/usr/X11R6/src", &SrcDists, DIST_SRC_XF86, NULL }, { NULL }, }; @@ -181,15 +117,17 @@ static Distribution XF86DistTable[] = { { "X311bin", "/usr", &XF86Dists, DIST_XF86_BIN, NULL }, { "X311lib", "/usr", &XF86Dists, DIST_XF86_LIB, NULL }, { "X311doc", "/usr", &XF86Dists, DIST_XF86_DOC, NULL }, -{ "Xf86311", "/usr", &XF86Dists, DIST_XF86_FONTS, XF86FontDistTable }, +{ "XF86311", "/usr", &XF86Dists, DIST_XF86_FONTS, XF86FontDistTable }, { "X311man", "/usr", &XF86Dists, DIST_XF86_MAN, NULL }, { "X311prog", "/usr", &XF86Dists, DIST_XF86_PROG, NULL }, { "X311link", "/usr", &XF86Dists, DIST_XF86_LINK, NULL }, { "X311pex", "/usr", &XF86Dists, DIST_XF86_PEX, NULL }, { "X311lbx", "/usr", &XF86Dists, DIST_XF86_LBX, NULL }, { "X311xicf", "/usr", &XF86Dists, DIST_XF86_XINIT, NULL }, -{ "X311xdmcf", "/usr", &XF86Dists, DIST_XF86_XDMCF, NULL }, -{ "Xf86311", "/usr", &XF86Dists, DIST_XF86_SERVER, XF86ServerDistTable }, +{ "X311xdcf", "/usr", &XF86Dists, DIST_XF86_XDMCF, NULL }, +{ "XF86311", "/usr", &XF86Dists, DIST_XF86_SERVER, XF86ServerDistTable }, +{ "XF86-xc", "/usr/X11R6/src", &XF86Dists, DIST_XF86_SRC, NULL }, +{ "XF86-co", "/usr/X11R6/src", &XF86Dists, DIST_XF86_SRC, NULL }, { NULL }, }; @@ -197,8 +135,9 @@ static Distribution XF86DistTable[] = { static Distribution XF86ServerDistTable[] = { { "X3118514", "/usr", &XF86ServerDists, DIST_XF86_SERVER_8514, NULL }, { "X311AGX", "/usr", &XF86ServerDists, DIST_XF86_SERVER_AGX, NULL }, -{ "X311Mch3", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MACH32,NULL }, -{ "X311Mch8", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MACH8, NULL }, +{ "X311Ma8", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MACH8, NULL }, +{ "X311Ma32", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MACH32,NULL }, +{ "X311Ma64", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MACH64,NULL }, { "X311Mono", "/usr", &XF86ServerDists, DIST_XF86_SERVER_MONO, NULL }, { "X311P9K", "/usr", &XF86ServerDists, DIST_XF86_SERVER_P9000, NULL }, { "X311S3", "/usr", &XF86ServerDists, DIST_XF86_SERVER_S3, NULL }, @@ -219,6 +158,121 @@ static Distribution XF86FontDistTable[] = { { NULL }, }; +int +distReset(char *str) +{ + Dists = 0; + SrcDists = 0; + XF86Dists = 0; + XF86ServerDists = 0; + XF86FontDists = 0; + return 0; +} + +int +distSetDeveloper(char *str) +{ + distReset(NULL); + Dists = _DIST_DEVELOPER; + SrcDists = DIST_SRC_ALL; + return 0; +} + +int +distSetXDeveloper(char *str) +{ + distReset(NULL); + Dists = _DIST_DEVELOPER | DIST_XF86; + SrcDists = DIST_SRC_ALL; + XF86Dists = DIST_XF86_BIN | DIST_XF86_LIB | DIST_XF86_PROG | DIST_XF86_MAN | DIST_XF86_SERVER | DIST_XF86_FONTS; + XF86ServerDists = DIST_XF86_SERVER_SVGA; + XF86FontDists = DIST_XF86_FONTS_MISC; + distSetXF86(NULL); + return 0; +} + +int +distSetKernDeveloper(char *str) +{ + distReset(NULL); + Dists = _DIST_DEVELOPER; + SrcDists = DIST_SRC_SYS; + return 0; +} + +int +distSetUser(char *str) +{ + distReset(NULL); + Dists = _DIST_USER; + return 0; +} + +int +distSetXUser(char *str) +{ + distReset(NULL); + Dists = _DIST_USER; + XF86Dists = DIST_XF86_BIN | DIST_XF86_LIB | DIST_XF86_MAN | DIST_XF86_SERVER | DIST_XF86_FONTS; + XF86ServerDists = DIST_XF86_SERVER_SVGA; + XF86FontDists = DIST_XF86_FONTS_MISC; + distSetXF86(NULL); + return 0; +} + +int +distSetMinimum(char *str) +{ + distReset(NULL); + Dists = DIST_BIN; + return 0; +} + +int +distSetEverything(char *str) +{ + Dists = DIST_ALL; + SrcDists = DIST_SRC_ALL; + XF86Dists = DIST_XF86_ALL; + XF86ServerDists = DIST_XF86_SERVER_ALL; + XF86FontDists = DIST_XF86_FONTS_ALL; + return 0; +} + +int +distSetDES(char *str) +{ + dmenuOpenSimple(&MenuDESDistributions); + if (DESDists) + Dists |= DIST_DES; + return 0; +} + +int +distSetSrc(char *str) +{ + dmenuOpenSimple(&MenuSrcDistributions); + if (SrcDists) + Dists |= DIST_SRC; + return 0; +} + +int +distSetXF86(char *str) +{ + dmenuOpenSimple(&MenuXF86Select); + if (XF86ServerDists) + XF86Dists |= DIST_XF86_SERVER; + if (XF86FontDists) + XF86Dists |= DIST_XF86_FONTS; + if (XF86Dists) + Dists |= DIST_XF86; + if (isDebug()) + msgDebug("SetXF86 Masks: Server: %0x, Fonts: %0x, XDists: %0x, Dists: %0x\n", + XF86ServerDists, XF86FontDists, XF86Dists, Dists); + return 0; +} + static Boolean distExtract(char *parent, Distribution *me) { @@ -228,37 +282,49 @@ distExtract(char *parent, Distribution *me) const char *tmp; Attribs *dist_attr; - status = FALSE; - if (mediaDevice->init) - if (!(*mediaDevice->init)(mediaDevice)) - return FALSE; + status = TRUE; + if (isDebug()) + msgDebug("distExtract: parent: %s, me: %s\n", parent ? parent : "(none)", me->my_name); + /* Loop through to see if we're in our parent's plans */ for (i = 0; me[i].my_name; i++) { - /* If we're not doing it, we're not doing it */ + dist = me[i].my_name; + path = parent ? parent : dist; + + /* If our bit isn't set, go to the next */ if (!(me[i].my_bit & *(me[i].my_mask))) continue; + /* This is shorthand for "dist currently disabled" */ + if (!me[i].my_dir) { + *(me[i].my_mask) &= ~(me[i].my_bit); + continue; + } + /* Recurse if actually have a sub-distribution */ if (me[i].my_dist) { - status = distExtract(me[i].my_name, me[i].my_dist); + status = distExtract(dist, me[i].my_dist); goto done; } - dist = me[i].my_name; - path = parent ? parent : me[i].my_name; - + /* First try to get the distribution as a single file */ snprintf(buf, 512, "%s/%s.tgz", path, dist); - fd = (*mediaDevice->get)(buf); - if (fd != -1) { + if (isDebug()) + msgDebug("Trying to get large piece: %s\n", buf); + /* Set it as an "exploratory get" so that we don't loop unnecessarily on it */ + mediaDevice->flags |= OPT_EXPLORATORY_GET; + fd = (*mediaDevice->get)(mediaDevice, buf, NULL); + mediaDevice->flags &= ~OPT_EXPLORATORY_GET; + if (fd >= 0) { msgNotify("Extracting %s into %s directory...", me[i].my_name, me[i].my_dir); status = mediaExtractDist(me[i].my_dir, fd); - if (mediaDevice->close) - (*mediaDevice->close)(mediaDevice, fd); - else - close(fd); + (*mediaDevice->close)(mediaDevice, fd); goto done; } + else if (fd == -2) /* Hard error, can't continue */ + return FALSE; + /* If we couldn't get it as one file then we need to get multiple pieces; get info file telling us how many */ snprintf(buf, sizeof buf, "/stand/info/%s/%s.inf", path, dist); if (!access(buf, R_OK)) { if (isDebug()) @@ -273,56 +339,42 @@ distExtract(char *parent, Distribution *me) msgDebug("Looking for attribute `pieces'\n"); tmp = attr_match(dist_attr, "pieces"); if (tmp) - numchunks = atoi(tmp); + numchunks = strtol(tmp, 0, 0); else numchunks = 0; } - else + else { + if (isDebug()) + msgDebug("Couldn't open attributes file: %s\n", buf); numchunks = 0; + } + if (!numchunks) + continue; if (isDebug()) msgDebug("Attempting to extract distribution from %u chunks.\n", numchunks); - if (numchunks < 2 ) { - snprintf(buf, 512, "%s/%s", path, dist); - if (numchunks) - strcat(buf,".aa"); - fd = (*mediaDevice->get)(buf); - if (fd == -1) { - status = FALSE; - } else { - msgNotify("Extracting %s into %s directory...", me[i].my_name, me[i].my_dir); - status = mediaExtractDist(me[i].my_dir, fd); - if (mediaDevice->close) - (*mediaDevice->close)(mediaDevice, fd); - else - close(fd); - } - goto done; - } - + /* We have one or more chunks, go pick them up */ mediaExtractDistBegin(me[i].my_dir, &fd2, &zpid, &cpid); dialog_clear(); for (chunk = 0; chunk < numchunks; chunk++) { int n, retval; char prompt[80]; - int retries = 0; - snprintf(buf, 512, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); -retry: - fd = (*mediaDevice->get)(buf); + snprintf(buf, 512, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); + if (isDebug()) + msgDebug("trying for piece %d of %d: %s\n", chunk, numchunks, buf); + fd = (*mediaDevice->get)(mediaDevice, buf, dist_attr); if (fd < 0) { - if (++retries < 5) - goto retry; - msgConfirm("failed to retreive piece file %s after 5 retries!\nAborting the transfer", buf); + dialog_clear(); + msgConfirm("failed to retreive piece file %s!\nAborting the transfer", buf); goto punt; } snprintf(prompt, 80, "Extracting %s into %s directory...", me[i].my_name, me[i].my_dir); - dialog_gauge(" Progress ", prompt, 8, 15, 6, 50, (int) ((float) (chunk + 1) / numchunks * 100)); + dialog_gauge("Progress", prompt, 8, 15, 6, 50, (int)((float)(chunk + 1) / numchunks * 100)); while ((n = read(fd, buf, sizeof buf)) > 0) { retval = write(fd2, buf, n); - if (retval != n) - { + if (retval != n) { if (mediaDevice->close) (*mediaDevice->close)(mediaDevice, fd); else @@ -331,10 +383,7 @@ retry: goto punt; } } - if (mediaDevice->close) - (*mediaDevice->close)(mediaDevice, fd); - else - close(fd); + (*mediaDevice->close)(mediaDevice, fd); } close(fd2); status = mediaExtractDistEnd(zpid, cpid); @@ -347,19 +396,20 @@ retry: done: if (!status) { - if (getenv(NO_CONFIRMATION)) + if (OptFlags & OPT_NO_CONFIRM) status = TRUE; - else - status = msgYesNo("Unable to transfer the %s distribution from %s.\nDo you want to retry this distribution later?", me[i].my_name, mediaDevice->name); + else { + if (me[i].my_dist) { + msgConfirm("Unable to transfer all components of the %s distribution.\nIf this is a CDROM install, it may be because export restrictions prohibit\nDES code from being shipped from the U.S. Try to get this code from a\nlocal FTP site instead!"); + status = TRUE; + } + else + status = msgYesNo("Unable to transfer the %s distribution from %s.\nDo you want to try to retrieve it again?", me[i].my_name, mediaDevice->name); + } } - if (status) { - /* Extract was successful, remove ourselves from further consideration */ + /* Extract was successful, remove ourselves from further consideration */ + if (status) *(me[i].my_mask) &= ~(me[i].my_bit); - } - } - if (mediaDevice->shutdown && parent == NULL) { - (*mediaDevice->shutdown)(mediaDevice); - mediaDevice = NULL; } return status; } @@ -369,9 +419,18 @@ distExtractAll(void) { int retries = 0; + /* First try to initialize the state of things */ + if (!(*mediaDevice->init)(mediaDevice)) + return; + /* Try for 3 times around the loop, then give up. */ while (Dists && ++retries < 3) distExtract(NULL, DistTable); + + /* Anything left? */ if (Dists) - msgConfirm("Couldn't extract all of the dists. Residue: %0x", Dists); + msgConfirm("Couldn't extract all of the distributions. This may\nbe because the specified distributions are not available from the\ninstallation media you've chosen (residue: %0x)", Dists); + + /* Close up shop and go home */ + (*mediaDevice->shutdown)(mediaDevice); } |