summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall/dist.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-01-17 19:05:32 +0000
committerjhb <jhb@FreeBSD.org>2003-01-17 19:05:32 +0000
commitdc23a6cc293c5c66de9b340f144e5ac526bba8ad (patch)
tree5693ab9d8e2cce0b997fefaa64f9d54c4151f882 /usr.sbin/sysinstall/dist.c
parente4bbc64e1d967c8a58f0c9dee351e26d463366b0 (diff)
downloadFreeBSD-src-dc23a6cc293c5c66de9b340f144e5ac526bba8ad.zip
FreeBSD-src-dc23a6cc293c5c66de9b340f144e5ac526bba8ad.tar.gz
- Rename installFixupBin to installFixupBase to finish up the 'bin' to
'base' dist rename. - Rework struct dist to allow for different types of dists. There are currently three types of dists: DT_TARBALL, the traditonal gzipped and split tar file; DT_PACKAGE, a package; and DT_SUBDIST, a meta-dist in the tree that has its own array of dists as its contents. For example, the 'base' dist is a DT_TARBALL dist, the 'perl' dist is a DT_PACKAGE dist, and the 'src' dist is a DT_SUBDIST dist with its own dist table that contains 'sbase', 'ssys', etc. - Add helper macros for defining array entries for the different types of dists to try and make the statically defined dist table in dist.c more readable. - Split the logic to deal with a DT_TARBALL dist out of distExtract() and into its own distExtractTarball() function. distExtract() now calls other functions to extract each dist. - Tweak the percentage complete calculation in distExtractTarball() to do the multiply prior to the divide so it doesn't have to use floating point. - Axe the installPackage() function along with the special handling for the perl and XFree86 dists in distExtractAll() since distExtract() handles package dists directly now. - Add back in subdists for the X packages based on the split up packages that XFree86-4 uses that as closely map to the X dists we used with X 3.3.x. - Lots of things like distSetX() and the X dist masks are no longer #ifndef X_AS_PKG since we use them in both cases now. - Make the entire installFixupXFree() function #ifndef X_AS_PKG, we only call it in that case anyways, and it's not suitable for the X_AS_PKG case. - Add in X dist menus for the X_AS_PKG case. Approved by: re
Diffstat (limited to 'usr.sbin/sysinstall/dist.c')
-rw-r--r--usr.sbin/sysinstall/dist.c879
1 files changed, 449 insertions, 430 deletions
diff --git a/usr.sbin/sysinstall/dist.c b/usr.sbin/sysinstall/dist.c
index 0177929..91c24f8 100644
--- a/usr.sbin/sysinstall/dist.c
+++ b/usr.sbin/sysinstall/dist.c
@@ -45,169 +45,216 @@
unsigned int Dists;
unsigned int CRYPTODists;
unsigned int SrcDists;
-#ifndef X_AS_PKG
unsigned int XF86Dists;
unsigned int XF86ServerDists;
unsigned int XF86FontDists;
-#endif
+
+enum _disttype { DT_TARBALL, DT_SUBDIST, DT_PACKAGE };
typedef struct _dist {
char *my_name;
- char *my_dir;
unsigned int *my_mask;
unsigned int my_bit;
- struct _dist *my_dist;
+ enum _disttype my_type;
+ union {
+ char *my_string; /* DT_TARBALL & DT_PACKAGE */
+ struct _dist *my_dist; /* DT_SUBDIST */
+ } my_data;
} Distribution;
extern Distribution DistTable[];
extern Distribution CRYPTODistTable[];
extern Distribution SrcDistTable[];
-#ifndef X_AS_PKG
extern Distribution XF86DistTable[];
extern Distribution XF86FontDistTable[];
extern Distribution XF86ServerDistTable[];
-#endif
+
+#define DTE_TARBALL(name, mask, flag, directory) \
+ { name, mask, DIST_ ## flag, DT_TARBALL, { directory } }
+#define DTE_PACKAGE(name, mask, flag, package) \
+ { name, mask, DIST_ ## flag, DT_PACKAGE, { package } }
+#define DTE_SUBDIST(name, mask, flag, subdist) \
+ { name, mask, DIST_ ## flag, DT_SUBDIST, { my_dist: subdist } }
+
+#define BASE_DIST (&DistTable[0])
/* The top-level distribution categories */
static Distribution DistTable[] = {
-{ "base", "/", &Dists, DIST_BASE, NULL },
-{ "doc", "/", &Dists, DIST_DOC, NULL },
-{ "games", "/", &Dists, DIST_GAMES, NULL },
-{ "manpages", "/", &Dists, DIST_MANPAGES, NULL },
-{ "catpages", "/", &Dists, DIST_CATPAGES, NULL },
-{ "proflibs", "/", &Dists, DIST_PROFLIBS, NULL },
-{ "dict", "/", &Dists, DIST_DICT, NULL },
-{ "info", "/", &Dists, DIST_INFO, NULL },
-{ "src", "/", &Dists, DIST_SRC, SrcDistTable },
-{ "crypto", "/", &Dists, DIST_CRYPTO, CRYPTODistTable },
+ DTE_TARBALL("base", &Dists, BASE, "/"),
+ DTE_TARBALL("doc", &Dists, DOC, "/"),
+ DTE_TARBALL("games", &Dists, GAMES, "/"),
+ DTE_TARBALL("manpages", &Dists, MANPAGES, "/"),
+ DTE_TARBALL("catpages", &Dists, CATPAGES, "/"),
+ DTE_TARBALL("proflibs", &Dists, PROFLIBS, "/"),
+ DTE_TARBALL("dict", &Dists, DICT, "/"),
+ DTE_TARBALL("info", &Dists, INFO, "/"),
+ DTE_SUBDIST("src", &Dists, SRC, SrcDistTable),
+ DTE_SUBDIST("crypto", &Dists, CRYPTO, CRYPTODistTable),
#ifdef __i386__
-{ "compat1x", "/", &Dists, DIST_COMPAT1X, NULL },
-{ "compat20", "/", &Dists, DIST_COMPAT20, NULL },
-{ "compat21", "/", &Dists, DIST_COMPAT21, NULL },
-{ "compat22", "/", &Dists, DIST_COMPAT22, NULL },
-{ "compat3x", "/", &Dists, DIST_COMPAT3X, NULL },
+ DTE_TARBALL("compat1x", &Dists, COMPAT1X, "/"),
+ DTE_TARBALL("compat20", &Dists, COMPAT20, "/"),
+ DTE_TARBALL("compat21", &Dists, COMPAT21, "/"),
+ DTE_TARBALL("compat22", &Dists, COMPAT22, "/"),
+ DTE_TARBALL("compat3x", &Dists, COMPAT3X, "/"),
#endif
#if defined(__i386__) || defined(__alpha__)
-{ "compat4x", "/", &Dists, DIST_COMPAT4X, NULL },
+ DTE_TARBALL("compat4x", &Dists, COMPAT4X, "/"),
#endif
-{ "ports", "/usr", &Dists, DIST_PORTS, NULL },
-{ "local", "/", &Dists, DIST_LOCAL, NULL },
-#ifndef X_AS_PKG
-{ "XF86336", "/usr", &Dists, DIST_XF86, XF86DistTable },
-#endif
-{ NULL },
+ DTE_TARBALL("ports", &Dists, PORTS, "/usr"),
+ DTE_TARBALL("local", &Dists, LOCAL, "/"),
+ DTE_PACKAGE("perl", &Dists, PERL, "perl"),
+ DTE_SUBDIST("XFree86", &Dists, XF86, XF86DistTable),
+ { NULL },
};
/* The CRYPTO distribution */
static Distribution CRYPTODistTable[] = {
-{ "crypto", "/", &CRYPTODists, DIST_CRYPTO_CRYPTO, NULL },
-{ "krb4", "/", &CRYPTODists, DIST_CRYPTO_KERBEROS4, NULL },
-{ "krb5", "/", &CRYPTODists, DIST_CRYPTO_KERBEROS5, NULL },
-{ "ssecure", "/usr/src", &CRYPTODists, DIST_CRYPTO_SSECURE, NULL },
-{ "scrypto", "/usr/src", &CRYPTODists, DIST_CRYPTO_SCRYPTO, NULL },
-{ "skrb4", "/usr/src", &CRYPTODists, DIST_CRYPTO_SKERBEROS4, NULL },
-{ "skrb5", "/usr/src", &CRYPTODists, DIST_CRYPTO_SKERBEROS5, NULL },
-{ NULL },
+ DTE_TARBALL("crypto", &CRYPTODists, CRYPTO_CRYPTO, "/"),
+ DTE_TARBALL("krb4", &CRYPTODists, CRYPTO_KERBEROS4, "/"),
+ DTE_TARBALL("krb5", &CRYPTODists, CRYPTO_KERBEROS5, "/"),
+ DTE_TARBALL("ssecure", &CRYPTODists, CRYPTO_SSECURE, "/usr/src"),
+ DTE_TARBALL("scrypto", &CRYPTODists, CRYPTO_SCRYPTO, "/usr/src"),
+ DTE_TARBALL("skrb4", &CRYPTODists, CRYPTO_SKERBEROS4, "/usr/src"),
+ DTE_TARBALL("skrb5", &CRYPTODists, CRYPTO_SKERBEROS5, "/usr/src"),
+ { NULL },
};
/* The /usr/src distribution */
static Distribution SrcDistTable[] = {
-{ "sbase", "/usr/src", &SrcDists, DIST_SRC_BASE, NULL },
-{ "scontrib", "/usr/src", &SrcDists, DIST_SRC_CONTRIB, NULL },
-{ "sgnu", "/usr/src", &SrcDists, DIST_SRC_GNU, NULL },
-{ "setc", "/usr/src", &SrcDists, DIST_SRC_ETC, NULL },
-{ "sgames", "/usr/src", &SrcDists, DIST_SRC_GAMES, NULL },
-{ "sinclude", "/usr/src", &SrcDists, DIST_SRC_INCLUDE, NULL },
-{ "slib", "/usr/src", &SrcDists, DIST_SRC_LIB, NULL },
-{ "slibexec", "/usr/src", &SrcDists, DIST_SRC_LIBEXEC, NULL },
-{ "srelease", "/usr/src", &SrcDists, DIST_SRC_RELEASE, NULL },
-{ "sbin", "/usr/src", &SrcDists, DIST_SRC_BIN, NULL },
-{ "ssbin", "/usr/src", &SrcDists, DIST_SRC_SBIN, NULL },
-{ "sshare", "/usr/src", &SrcDists, DIST_SRC_SHARE, NULL },
-{ "ssys", "/usr/src", &SrcDists, DIST_SRC_SYS, NULL },
-{ "subin", "/usr/src", &SrcDists, DIST_SRC_UBIN, NULL },
-{ "susbin", "/usr/src", &SrcDists, DIST_SRC_USBIN, NULL },
-{ "stools", "/usr/src", &SrcDists, DIST_SRC_TOOLS, NULL },
-{ NULL },
+ DTE_TARBALL("sbase", &SrcDists, SRC_BASE, "/usr/src"),
+ DTE_TARBALL("scontrib", &SrcDists, SRC_CONTRIB, "/usr/src"),
+ DTE_TARBALL("sgnu", &SrcDists, SRC_GNU, "/usr/src"),
+ DTE_TARBALL("setc", &SrcDists, SRC_ETC, "/usr/src"),
+ DTE_TARBALL("sgames", &SrcDists, SRC_GAMES, "/usr/src"),
+ DTE_TARBALL("sinclude", &SrcDists, SRC_INCLUDE, "/usr/src"),
+ DTE_TARBALL("slib", &SrcDists, SRC_LIB, "/usr/src"),
+ DTE_TARBALL("slibexec", &SrcDists, SRC_LIBEXEC, "/usr/src"),
+ DTE_TARBALL("srelease", &SrcDists, SRC_RELEASE, "/usr/src"),
+ DTE_TARBALL("sbin", &SrcDists, SRC_BIN, "/usr/src"),
+ DTE_TARBALL("ssbin", &SrcDists, SRC_SBIN, "/usr/src"),
+ DTE_TARBALL("sshare", &SrcDists, SRC_SHARE, "/usr/src"),
+ DTE_TARBALL("ssys", &SrcDists, SRC_SYS, "/usr/src"),
+ DTE_TARBALL("subin", &SrcDists, SRC_UBIN, "/usr/src"),
+ DTE_TARBALL("susbin", &SrcDists, SRC_USBIN, "/usr/src"),
+ DTE_TARBALL("stools", &SrcDists, SRC_TOOLS, "/usr/src"),
+ { NULL },
};
-#ifndef X_AS_PKG
+#ifdef X_AS_PKG
/* The XFree86 distribution */
static Distribution XF86DistTable[] = {
-{ "XF86336", "/usr/X11R6", &XF86Dists, DIST_XF86_FONTS, XF86FontDistTable },
-{ "XF86336", "/usr/X11R6", &XF86Dists, DIST_XF86_SERVER, XF86ServerDistTable },
-{ "Xbin", "/usr/X11R6", &XF86Dists, DIST_XF86_BIN, NULL },
-{ "Xcfg", "/usr/X11R6", &XF86Dists, DIST_XF86_CFG, NULL },
-{ "Xdoc", "/usr/X11R6", &XF86Dists, DIST_XF86_DOC, NULL },
-{ "Xhtml", "/usr/X11R6", &XF86Dists, DIST_XF86_HTML, NULL },
-{ "Xlib", "/usr/X11R6", &XF86Dists, DIST_XF86_LIB, NULL },
+ DTE_SUBDIST("XFree86", &XF86Dists, XF86_FONTS, XF86FontDistTable),
+ DTE_SUBDIST("XFree86", &XF86Dists, XF86_SERVER, XF86ServerDistTable),
+ DTE_PACKAGE("Xbin", &XF86Dists, XF86_CLIENTS, "XFree86-clients"),
+ DTE_PACKAGE("Xdoc", &XF86Dists, XF86_DOC, "XFree86-documents"),
+ DTE_PACKAGE("Xlib", &XF86Dists, XF86_LIB, "XFree86-libraries"),
+ DTE_PACKAGE("Xman", &XF86Dists, XF86_MAN, "XFree86-manuals"),
+ DTE_PACKAGE("Xprog", &XF86Dists, XF86_PROG, "imake"),
+ { NULL },
+};
+
+/* The XFree86 server distribution */
+static Distribution XF86ServerDistTable[] = {
+ DTE_PACKAGE("Xsrv", &XF86ServerDists, XF86_SERVER_FB, "wrapper"),
+ DTE_PACKAGE("Xnest", &XF86ServerDists, XF86_SERVER_NEST, "XFree86-NestServer"),
+ DTE_PACKAGE("Xprt", &XF86ServerDists, XF86_SERVER_PRINT, "XFree86-PrintServer"),
+ DTE_PACKAGE("Xvfb", &XF86ServerDists, XF86_SERVER_VFB, "XFree86-VirtualFramebufferServer"),
+ { NULL }
+};
+
+/* The XFree86 font distribution */
+static Distribution XF86FontDistTable[] = {
+ DTE_PACKAGE("Xf75", &XF86FontDists, XF86_FONTS_75, "XFree86-font75dpi"),
+ DTE_PACKAGE("Xf100", &XF86FontDists, XF86_FONTS_100, "XFree86-font100dpi"),
+ DTE_PACKAGE("Xfcyr", &XF86FontDists, XF86_FONTS_CYR, "XFree86-fontCyrillic"),
+ DTE_PACKAGE("Xfscl", &XF86FontDists, XF86_FONTS_SCALE, "XFree86-fontScalable"),
+ DTE_PACKAGE("Xfnts", &XF86FontDists, XF86_FONTS_BITMAPS, "XFree86-fontDefaultBitmaps"),
+ DTE_PACKAGE("Xfsrv", &XF86FontDists, XF86_FONTS_SERVER, "XFree86-FontServer"),
+ { NULL },
+};
+
+#else /* !X_AS_PKG */
+
+/* The XFree86 distribution */
+static Distribution XF86DistTable[] = {
+ DTE_SUBDIST("XF86336", &XF86Dists, XF86_FONTS, XF86FontDistTable),
+#if defined(__i386__) && defined(PC98)
+ DTE_SUBDIST("XF86336/PC98-Servers", &XF86Dists, XF86_SERVER, XF86ServerDistTable),
+#else
+ DTE_SUBDIST("XF86336/Servers", &XF86Dists, XF86_SERVER, XF86ServerDistTable),
+#endif
+ DTE_TARBALL("Xbin", &XF86Dists, XF86_BIN, "/usr/X11R6"),
+ DTE_TARBALL("Xcfg", &XF86Dists, XF86_CFG, "/usr/X11R6"),
+ DTE_TARBALL("Xdoc", &XF86Dists, XF86_DOC, "/usr/X11R6"),
+ DTE_TARBALL("Xhtml", &XF86Dists, XF86_HTML, "/usr/X11R6"),
+ DTE_TARBALL("Xlib", &XF86Dists, XF86_LIB, "/usr/X11R6"),
#if defined(__i386__) && defined(PC98)
-{ "Xlk98", "/usr/X11R6", &XF86Dists, DIST_XF86_LKIT98, NULL },
+ DTE_TARBALL("Xlk98", &XF86Dists, XF86_LKIT98, "/usr/X11R6"),
#endif
-{ "Xlkit", "/usr/X11R6", &XF86Dists, DIST_XF86_LKIT, NULL },
-{ "Xman", "/usr/X11R6", &XF86Dists, DIST_XF86_MAN, NULL },
-{ "Xprog", "/usr/X11R6", &XF86Dists, DIST_XF86_PROG, NULL },
-{ "Xps", "/usr/X11R6", &XF86Dists, DIST_XF86_PS, NULL },
-{ "Xset", "/usr/X11R6", &XF86Dists, DIST_XF86_SET, NULL },
+ DTE_TARBALL("Xlkit", &XF86Dists, XF86_LKIT, "/usr/X11R6"),
+ DTE_TARBALL("Xman", &XF86Dists, XF86_MAN, "/usr/X11R6"),
+ DTE_TARBALL("Xprog", &XF86Dists, XF86_PROG, "/usr/X11R6"),
+ DTE_TARBALL("Xps", &XF86Dists, XF86_PS, "/usr/X11R6"),
+ DTE_TARBALL("Xset", &XF86Dists, XF86_SET, "/usr/X11R6"),
#if defined(__i386__) && defined(PC98)
-{ "X9set", "/usr/X11R6", &XF86Dists, DIST_XF86_9SET, NULL },
+ DTE_TARBALL("X9set", &XF86Dists, XF86_9SET, "/usr/X11R6"),
#endif
-{ NULL },
+ { NULL },
};
/* The XFree86 server distribution */
static Distribution XF86ServerDistTable[] = {
#if defined(__i386__) && defined(PC98)
-{ "PC98-Servers/X9480", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9480, NULL },
-{ "PC98-Servers/X9EGC", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9EGC, NULL },
-{ "PC98-Servers/X9GA9", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9GA9, NULL },
-{ "PC98-Servers/X9GAN", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9GAN, NULL },
-{ "PC98-Servers/X9LPW", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9LPW, NULL },
-{ "PC98-Servers/X9MGA", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9MGA, NULL },
-{ "PC98-Servers/X9NKV", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9NKV, NULL },
-{ "PC98-Servers/X9NS3", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9NS3, NULL },
-{ "PC98-Servers/X9SPW", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9SPW, NULL },
-{ "PC98-Servers/X9SVG", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9SVG, NULL },
-{ "PC98-Servers/X9TGU", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9TGU, NULL },
-{ "PC98-Servers/X9WEP", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9WEP, NULL },
-{ "PC98-Servers/X9WS", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9WS, NULL },
-{ "PC98-Servers/X9WSN", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_9WSN, NULL },
+ DTE_TARBALL("X9480", &XF86ServerDists, XF86_SERVER_9480, "/usr/X11R6"),
+ DTE_TARBALL("X9EGC", &XF86ServerDists, XF86_SERVER_9EGC, "/usr/X11R6"),
+ DTE_TARBALL("X9GA9", &XF86ServerDists, XF86_SERVER_9GA9, "/usr/X11R6"),
+ DTE_TARBALL("X9GAN", &XF86ServerDists, XF86_SERVER_9GAN, "/usr/X11R6"),
+ DTE_TARBALL("X9LPW", &XF86ServerDists, XF86_SERVER_9LPW, "/usr/X11R6"),
+ DTE_TARBALL("X9MGA", &XF86ServerDists, XF86_SERVER_9MGA, "/usr/X11R6"),
+ DTE_TARBALL("X9NKV", &XF86ServerDists, XF86_SERVER_9NKV, "/usr/X11R6"),
+ DTE_TARBALL("X9NS3", &XF86ServerDists, XF86_SERVER_9NS3, "/usr/X11R6"),
+ DTE_TARBALL("X9SPW", &XF86ServerDists, XF86_SERVER_9SPW, "/usr/X11R6"),
+ DTE_TARBALL("X9SVG", &XF86ServerDists, XF86_SERVER_9SVG, "/usr/X11R6"),
+ DTE_TARBALL("X9TGU", &XF86ServerDists, XF86_SERVER_9TGU, "/usr/X11R6"),
+ DTE_TARBALL("X9WEP", &XF86ServerDists, XF86_SERVER_9WEP, "/usr/X11R6"),
+ DTE_TARBALL("X9WS", &XF86ServerDists, XF86_SERVER_9WS, "/usr/X11R6"),
+ DTE_TARBALL("X9WSN", &XF86ServerDists, XF86_SERVER_9WSN, "/usr/X11R6"),
#endif
-{ "Servers/X3DL", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_3DL, NULL },
+ DTE_TARBALL("X3DL", &XF86ServerDists, XF86_SERVER_3DL, "/usr/X11R6"),
#ifdef __i386__
-{ "Servers/X8514", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_8514, NULL },
-{ "Servers/XAGX", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_AGX, NULL },
+ DTE_TARBALL("X8514", &XF86ServerDists, XF86_SERVER_8514, "/usr/X11R6"),
+ DTE_TARBALL("XAGX", &XF86ServerDists, XF86_SERVER_AGX, "/usr/X11R6"),
#endif
-{ "Servers/XI128", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_I128, NULL },
+ DTE_TARBALL("XI128", &XF86ServerDists, XF86_SERVER_I128, "/usr/X11R6"),
#ifdef __i386__
-{ "Servers/XMa8", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_MACH8, NULL },
-{ "Servers/XMa32", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_MACH32,NULL },
+ DTE_TARBALL("XMa8", &XF86ServerDists, XF86_SERVER_MACH8, "/usr/X11R6"),
+ DTE_TARBALL("XMa32", &XF86ServerDists, XF86_SERVER_MACH32, "/usr/X11R6"),
#endif
-{ "Servers/XMa64", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_MACH64,NULL },
-{ "Servers/XMono", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_MONO, NULL },
-{ "Servers/XP9K", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_P9000, NULL },
-{ "Servers/XS3", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_S3, NULL },
-{ "Servers/XS3V", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_S3V, NULL },
-{ "Servers/XSVGA", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_SVGA, NULL },
+ DTE_TARBALL("XMa64", &XF86ServerDists, XF86_SERVER_MACH64, "/usr/X11R6"),
+ DTE_TARBALL("XMono", &XF86ServerDists, XF86_SERVER_MONO, "/usr/X11R6"),
+ DTE_TARBALL("XP9K", &XF86ServerDists, XF86_SERVER_P9000, "/usr/X11R6"),
+ DTE_TARBALL("XS3", &XF86ServerDists, XF86_SERVER_S3, "/usr/X11R6"),
+ DTE_TARBALL("XS3V", &XF86ServerDists, XF86_SERVER_S3V, "/usr/X11R6"),
+ DTE_TARBALL("XSVGA", &XF86ServerDists, XF86_SERVER_SVGA, "/usr/X11R6"),
#ifdef __i386__
-{ "Servers/XVG16", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_VGA16, NULL },
-{ "Servers/XW32", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_W32, NULL },
+ DTE_TARBALL("XVG16", &XF86ServerDists, XF86_SERVER_VGA16, "/usr/X11R6"),
+ DTE_TARBALL("XW32", &XF86ServerDists, XF86_SERVER_W32, "/usr/X11R6"),
#endif
#ifdef __alpha__
-{ "Servers/XTGA", "/usr/X11R6", &XF86ServerDists, DIST_XF86_SERVER_TGA, NULL },
+ DTE_TARBALL("XTGA", &XF86ServerDists, XF86_SERVER_TGA, "/usr/X11R6"),
#endif
-{ NULL },
+ { NULL },
};
/* The XFree86 font distribution */
static Distribution XF86FontDistTable[] = {
-{ "Xfnts", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_MISC, NULL },
-{ "Xf100", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_100, NULL },
-{ "Xfcyr", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_CYR, NULL },
-{ "Xfscl", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_SCALE, NULL },
-{ "Xfnon", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_NON, NULL },
-{ "Xfsrv", "/usr/X11R6", &XF86FontDists, DIST_XF86_FONTS_SERVER, NULL },
-{ NULL },
+ DTE_TARBALL("Xfnts", &XF86FontDists, XF86_FONTS_MISC, "/usr/X11R6"),
+ DTE_TARBALL("Xf100", &XF86FontDists, XF86_FONTS_100, "/usr/X11R6"),
+ DTE_TARBALL("Xfcyr", &XF86FontDists, XF86_FONTS_CYR, "/usr/X11R6"),
+ DTE_TARBALL("Xfscl", &XF86FontDists, XF86_FONTS_SCALE, "/usr/X11R6"),
+ DTE_TARBALL("Xfnon", &XF86FontDists, XF86_FONTS_NON, "/usr/X11R6"),
+ DTE_TARBALL("Xfsrv", &XF86FontDists, XF86_FONTS_SERVER, "/usr/X11R6"),
+ { NULL },
};
#endif /* !X_AS_PKG */
@@ -226,22 +273,21 @@ distVerifyFlags(void)
else if ((Dists & DIST_CRYPTO) && !CRYPTODists)
CRYPTODists |= DIST_CRYPTO_ALL;
#ifndef X_AS_PKG
+ /* XXX : realy only for X 3.3.6 */
if (XF86Dists & DIST_XF86_SET)
XF86ServerDists |= DIST_XF86_SERVER_VGA16;
+#endif
if (XF86ServerDists)
XF86Dists |= DIST_XF86_SERVER;
if (XF86FontDists)
XF86Dists |= DIST_XF86_FONTS;
if (XF86Dists || XF86ServerDists || XF86FontDists)
Dists |= DIST_XF86;
-#endif
if (isDebug()) {
msgDebug("Dist Masks: Dists: %0x, CRYPTO: %0x, Srcs: %0x\n", Dists,
CRYPTODists, SrcDists);
-#ifndef X_AS_PKG
msgDebug("XServer: %0x, XFonts: %0x, XDists: %0x\n", XF86ServerDists,
XF86FontDists, XF86Dists);
-#endif
}
}
@@ -251,11 +297,9 @@ distReset(dialogMenuItem *self)
Dists = 0;
CRYPTODists = 0;
SrcDists = 0;
-#ifndef X_AS_PKG
XF86Dists = 0;
XF86ServerDists = 0;
XF86FontDists = 0;
-#endif
return DITEM_SUCCESS | DITEM_REDRAW;
}
@@ -275,12 +319,6 @@ distConfig(dialogMenuItem *self)
if ((cp = variable_get(VAR_DIST_SRC)) != NULL)
SrcDists = atoi(cp);
-#ifdef X_AS_PKG
- if (variable_get(VAR_DIST_X11) != NULL ||
- variable_get(VAR_DIST_XSERVER) != NULL ||
- variable_get(VAR_DIST_XFONTS) != NULL)
- Dists |= DIST_XF86;
-#else
if ((cp = variable_get(VAR_DIST_X11)) != NULL)
XF86Dists = atoi(cp);
@@ -289,7 +327,6 @@ distConfig(dialogMenuItem *self)
if ((cp = variable_get(VAR_DIST_XFONTS)) != NULL)
XF86FontDists = atoi(cp);
-#endif
distVerifyFlags();
return DITEM_SUCCESS | DITEM_REDRAW;
}
@@ -298,14 +335,16 @@ static int
distSetX(void)
{
Dists |= DIST_XF86;
-#ifndef X_AS_PKG
+#ifdef X_AS_PKG
+ XF86Dists = DIST_XF86_CLIENTS | DIST_XF86_LIB | DIST_XF86_PROG | DIST_XF86_MAN | DIST_XF86_DOC | DIST_XF86_SERVER | DIST_XF86_FONTS;
+ XF86ServerDists = DIST_XF86_SERVER_FB;
+ XF86FontDists = DIST_XF86_FONTS_BITMAPS | DIST_XF86_FONTS_75;
+#else
XF86Dists = DIST_XF86_BIN | DIST_XF86_SET | DIST_XF86_CFG | DIST_XF86_LIB | DIST_XF86_PROG | DIST_XF86_MAN | DIST_XF86_DOC | DIST_XF86_SERVER | DIST_XF86_FONTS;
XF86ServerDists = DIST_XF86_SERVER_SVGA | DIST_XF86_SERVER_VGA16;
XF86FontDists = DIST_XF86_FONTS_MISC;
- return distSetXF86(NULL);
-#else
- return DITEM_SUCCESS;
#endif
+ return distSetXF86(NULL);
}
int
@@ -400,11 +439,9 @@ distSetEverything(dialogMenuItem *self)
Dists = DIST_ALL | DIST_XF86;
SrcDists = DIST_SRC_ALL;
CRYPTODists = DIST_CRYPTO_ALL;
-#ifndef X_AS_PKG
XF86Dists = DIST_XF86_ALL;
XF86ServerDists = DIST_XF86_SERVER_ALL;
XF86FontDists = DIST_XF86_FONTS_ALL;
-#endif
i = distMaybeSetPorts(self);
distVerifyFlags();
return i;
@@ -437,17 +474,19 @@ distSetByName(Distribution *dist, char *name)
/* Loop through current set */
for (i = 0; dist[i].my_name; i++) {
- /* This is shorthand for "dist currently disabled" */
- if (!dist[i].my_dir)
- continue;
- if (!strcmp(dist[i].my_name, name)) {
- *(dist[i].my_mask) |= dist[i].my_bit;
- status = TRUE;
- }
- if (dist[i].my_dist) {
- if (distSetByName(dist[i].my_dist, name)) {
+ switch (dist[i].my_type) {
+ case DT_TARBALL:
+ case DT_PACKAGE:
+ if (!strcmp(dist[i].my_name, name)) {
+ *(dist[i].my_mask) |= dist[i].my_bit;
+ status = TRUE;
+ }
+ break;
+ case DT_SUBDIST:
+ if (distSetByName(dist[i].my_data.my_dist, name)) {
status = TRUE;
}
+ break;
}
}
distVerifyFlags();
@@ -461,17 +500,19 @@ distUnsetByName(Distribution *dist, char *name)
/* Loop through current set */
for (i = 0; dist[i].my_name; i++) {
- /* This is shorthand for "dist currently disabled" */
- if (!dist[i].my_dir)
- continue;
- if (!strcmp(dist[i].my_name, name)) {
- *(dist[i].my_mask) &= ~(dist[i].my_bit);
- status = TRUE;
- }
- if (dist[i].my_dist) {
- if (distUnsetByName(dist[i].my_dist, name)) {
+ switch (dist[i].my_type) {
+ case DT_TARBALL:
+ case DT_PACKAGE:
+ if (!strcmp(dist[i].my_name, name)) {
+ *(dist[i].my_mask) &= ~(dist[i].my_bit);
+ status = TRUE;
+ }
+ break;
+ case DT_SUBDIST:
+ if (distUnsetByName(dist[i].my_data.my_dist, name)) {
status = TRUE;
}
+ break;
}
}
return status;
@@ -542,7 +583,6 @@ distSetSrc(dialogMenuItem *self)
return i | DITEM_RESTORE;
}
-#ifndef X_AS_PKG
int
distSetXF86(dialogMenuItem *self)
{
@@ -554,7 +594,6 @@ distSetXF86(dialogMenuItem *self)
distVerifyFlags();
return i | DITEM_RESTORE;
}
-#endif
static Boolean got_intr = FALSE;
@@ -576,300 +615,306 @@ check_for_interrupt(void)
return FALSE;
}
+/*
+ * Try to get distribution as multiple pieces, locating and parsing an
+ * info file which tells us how many we need for this distribution.
+ */
static Boolean
-distExtract(char *parent, Distribution *me)
+distExtractTarball(char *path, char *dist, char *my_dir, int is_base)
{
- int i,j, status, total, intr, unmounted_dev;
+ char *buf = NULL, fname[PATH_MAX];
+ struct timeval start, stop;
+ int i, j, status, total, intr, unmounted_dev;
int cpid, zpid, fd2, chunk, numchunks;
- char *path, *dist, *buf = NULL, fname[PATH_MAX];
+ properties dist_attr = NULL;
const char *tmp;
FILE *fp;
- WINDOW *w = savescr();
- struct timeval start, stop;
- struct sigaction old, new;
- properties dist_attr = NULL;
status = TRUE;
- if (isDebug())
- msgDebug("distExtract: parent: %s, me: %s\n", parent ? parent : "(none)", me->my_name);
-
- /* Make ^C fake a sudden timeout */
- new.sa_handler = handle_intr;
- new.sa_flags = 0;
- (void)sigemptyset(&new.sa_mask);
- dialog_clear_norefresh();
- dialog_msgbox("Please Wait", "Extracting all requested distributions...", -1, -1, 0);
- sigaction(SIGINT, &new, &old);
-
- /* Loop through to see if we're in our parent's plans */
- for (i = 0; me[i].my_name; i++) {
- 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 we actually have a sub-distribution */
- if (me[i].my_dist) {
- if ((status = distExtract(dist, me[i].my_dist)) == TRUE)
- *(me[i].my_mask) &= ~(me[i].my_bit);
- goto done;
- }
-
+ numchunks = 0;
+ snprintf(fname, sizeof (fname), "%s/%s.inf", path, dist);
+
+getinfo:
+ fp = DEVICE_GET(mediaDevice, fname, TRUE);
+ intr = check_for_interrupt();
+ if (fp == (FILE *)IO_ERROR || intr || !mediaDevice) {
+ /* Hard error, can't continue */
+ if (!msgYesNo("Unable to open %s: %s.\nReinitialize media?",
+ fname, !intr ? "I/O error." : "User interrupt.")) {
+ DEVICE_SHUTDOWN(mediaDevice);
+ if (!DEVICE_INIT(mediaDevice))
+ return (FALSE);
+ goto getinfo;
+ } else
+ return (FALSE);
+ } else if (fp == NULL) {
+ /* No attributes file, so try as a single file. */
+ snprintf(fname, sizeof(fname), "%s/%s.%s", path, dist,
+ USE_GZIP ? "tgz" : "tbz");
/*
- * Try to get distribution as multiple pieces, locating and parsing an
- * info file which tells us how many we need for this distribution.
+ * Passing TRUE as 3rd parm to get routine makes this a "probing"
+ * get, for which errors are not considered too significant.
*/
- numchunks = 0;
- snprintf(fname, sizeof fname, "%s/%s.inf", path, dist);
-
- getinfo:
+ getsingle:
fp = DEVICE_GET(mediaDevice, fname, TRUE);
intr = check_for_interrupt();
if (fp == (FILE *)IO_ERROR || intr || !mediaDevice) {
/* Hard error, can't continue */
- if (!msgYesNo("Unable to open %s: %s.\nReinitialize media?",
- fname, !intr ? "I/O error." : "User interrupt.")) {
- DEVICE_SHUTDOWN(mediaDevice);
- if (!DEVICE_INIT(mediaDevice)) {
- status = FALSE;
- goto done;
- }
- else
- goto getinfo;
- }
- else {
- status = FALSE;
- goto done;
- }
- }
- else if (fp != NULL) {
- if (isDebug())
- msgDebug("Parsing attributes file for distribution %s\n", dist);
-
- dist_attr = properties_read(fileno(fp));
- intr = check_for_interrupt();
- if (intr || !dist_attr) {
- msgConfirm("Cannot parse information file for the %s distribution: %s\n"
- "Please verify that your media is valid and try again.",
- dist, !intr ? "I/O error" : "User interrupt");
- }
- else {
- tmp = property_find(dist_attr, "Pieces");
- if (tmp)
- numchunks = strtol(tmp, 0, 0);
- }
- fclose(fp);
- if (!numchunks)
- continue;
- }
- else {
- /* Try to get the distribution as a single file */
- snprintf(fname, sizeof fname, "%s/%s.%s", path, dist,
- USE_GZIP ? "tgz" : "tbz");
- /*
- * Passing TRUE as 3rd parm to get routine makes this a "probing"
- * get, for which errors are not considered too significant.
- */
- getsingle:
- fp = DEVICE_GET(mediaDevice, fname, TRUE);
- intr = check_for_interrupt();
- if (fp == (FILE *)IO_ERROR || intr || !mediaDevice) {
- /* Hard error, can't continue */
- if (intr) /* result of an interrupt */
- msgConfirm("Unable to open %s: User interrupt", fname);
- else
- msgConfirm("Unable to open %s: I/O error", fname);
- DEVICE_SHUTDOWN(mediaDevice);
- if (!DEVICE_INIT(mediaDevice)) {
- status = FALSE;
- goto done;
- }
- else
- goto getsingle;
- }
- else if (fp != NULL) {
- char *dir = root_bias(me[i].my_dir);
+ msgConfirm("Unable to open %s: %s", fname,
+ !intr ? "I/O error" : "User interrupt");
+ DEVICE_SHUTDOWN(mediaDevice);
+ if (!DEVICE_INIT(mediaDevice))
+ return (FALSE);
+ goto getsingle;
+ } else if (fp != NULL) {
+ char *dir = root_bias(my_dir);
- dialog_clear_norefresh();
- msgNotify("Extracting %s into %s directory...", dist, dir);
- status = mediaExtractDist(dir, dist, fp);
- fclose(fp);
- goto done;
- }
- else {
- status = FALSE;
- goto done;
- }
- }
+ dialog_clear_norefresh();
+ msgNotify("Extracting %s into %s directory...", dist, dir);
+ status = mediaExtractDist(dir, dist, fp);
+ fclose(fp);
+ return (status);
+ } else
+ return (FALSE);
+ }
- /* Fall through from "we got the attribute file, now get the pieces" step */
- if (!numchunks)
- continue;
+ if (isDebug())
+ msgDebug("Parsing attributes file for distribution %s\n", dist);
+
+ dist_attr = properties_read(fileno(fp));
+ intr = check_for_interrupt();
+ if (intr || !dist_attr) {
+ msgConfirm("Cannot parse information file for the %s distribution: %s\n"
+ "Please verify that your media is valid and try again.",
+ dist, !intr ? "I/O error" : "User interrupt");
+ } else {
+ tmp = property_find(dist_attr, "Pieces");
+ if (tmp)
+ numchunks = strtol(tmp, 0, 0);
+ }
+ fclose(fp);
+ if (!numchunks)
+ return (TRUE);
- if (isDebug())
- msgDebug("Attempting to extract distribution from %u chunks.\n", numchunks);
+ if (isDebug())
+ msgDebug("Attempting to extract distribution from %u chunks.\n",
+ numchunks);
- total = 0;
- (void)gettimeofday(&start, (struct timezone *)0);
+ total = 0;
+ (void)gettimeofday(&start, (struct timezone *)NULL);
- if (me[i].my_bit == DIST_BASE && RunningAsInit && !Fake) {
- unmounted_dev = 1;
- unmount("/dev", MNT_FORCE);
- } else
- unmounted_dev = 0;
+ if (is_base && RunningAsInit && !Fake) {
+ unmounted_dev = 1;
+ unmount("/dev", MNT_FORCE);
+ } else
+ unmounted_dev = 0;
- /* We have one or more chunks, initialize unpackers... */
- mediaExtractDistBegin(root_bias(me[i].my_dir), &fd2, &zpid, &cpid);
+ /* We have one or more chunks, initialize unpackers... */
+ mediaExtractDistBegin(root_bias(my_dir), &fd2, &zpid, &cpid);
- /* And go for all the chunks */
- dialog_clear_norefresh();
- for (chunk = 0; chunk < numchunks; chunk++) {
- int n, retval, last_msg, chunksize, realsize;
- char prompt[80];
-
- last_msg = 0;
-
- getchunk:
- snprintf(fname, sizeof fname, "cksum.%c%c", (chunk / 26) + 'a', (chunk % 26) + 'a');
- tmp = property_find(dist_attr, fname);
- chunksize = 0;
- if (tmp) {
- tmp=index(tmp, ' ');
- chunksize = strtol(tmp, 0, 0);
- }
- snprintf(fname, sizeof fname, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a');
- if (isDebug())
- msgDebug("trying for piece %d of %d: %s\n", chunk + 1, numchunks, fname);
- fp = DEVICE_GET(mediaDevice, fname, FALSE);
- intr = check_for_interrupt();
- if (fp <= (FILE *)0 || intr) {
- if (fp == (FILE *)0)
- msgConfirm("Failed to find %s on this media. Reinitializing media.", fname);
- else
- msgConfirm("failed to retreive piece file %s.\n"
- "%s: Reinitializing media.", fname, !intr ? "I/O error" : "User interrupt");
- DEVICE_SHUTDOWN(mediaDevice);
- if (!DEVICE_INIT(mediaDevice))
- goto punt;
- else
- goto getchunk;
- }
+ /* And go for all the chunks */
+ dialog_clear_norefresh();
+ for (chunk = 0; chunk < numchunks; chunk++) {
+ int n, retval, last_msg, chunksize, realsize;
+ char prompt[80];
+
+ last_msg = 0;
+
+ getchunk:
+ snprintf(fname, sizeof(fname), "cksum.%c%c", (chunk / 26) + 'a',
+ (chunk % 26) + 'a');
+ tmp = property_find(dist_attr, fname);
+ chunksize = 0;
+ if (tmp) {
+ tmp = index(tmp, ' ');
+ chunksize = strtol(tmp, 0, 0);
+ }
+ snprintf(fname, sizeof(fname), "%s/%s.%c%c", path, dist, (chunk / 26) + 'a',
+ (chunk % 26) + 'a');
+ if (isDebug())
+ msgDebug("trying for piece %d of %d: %s\n", chunk + 1, numchunks,
+ fname);
+ fp = DEVICE_GET(mediaDevice, fname, FALSE);
+ intr = check_for_interrupt();
+ /* XXX: this can't work if we get an I/O error */
+ if (fp <= (FILE *)NULL || intr) {
+ if (fp == NULL)
+ msgConfirm("Failed to find %s on this media. Reinitializing media.", fname);
+ else
+ msgConfirm("Failed to retreive piece file %s.\n"
+ "%s: Reinitializing media.",
+ fname, !intr ? "I/O error" : "User interrupt");
+ DEVICE_SHUTDOWN(mediaDevice);
+ if (!DEVICE_INIT(mediaDevice))
+ goto punt;
+ else
+ goto getchunk;
+ }
- snprintf(prompt, sizeof prompt, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir));
- dialog_gauge("Progress", prompt, 8, 15, 6, 50, (int)((float)(chunk + 1) / numchunks * 100));
+ snprintf(prompt, sizeof(prompt), "Extracting %s into %s directory...",
+ dist, root_bias(my_dir));
+ dialog_gauge("Progress", prompt, 8, 15, 6, 50,
+ (chunk + 1) * 100 / numchunks);
- buf = safe_realloc(buf, chunksize);
- realsize = 0;
- while (1) {
- int seconds;
+ buf = safe_realloc(buf, chunksize);
+ realsize = 0;
+ while (1) {
+ int seconds;
- n = fread(buf + realsize, 1, BUFSIZ, fp);
- if (check_for_interrupt()) {
- msgConfirm("Media read error: User interrupt.");
- fclose(fp);
- goto punt;
- }
- else if (n <= 0)
- break;
- total += n;
- realsize += n;
-
- /* Print statistics about how we're doing */
- (void) gettimeofday(&stop, (struct timezone *)0);
- stop.tv_sec = stop.tv_sec - start.tv_sec;
- stop.tv_usec = stop.tv_usec - start.tv_usec;
- if (stop.tv_usec < 0)
- stop.tv_sec--, stop.tv_usec += 1000000;
- seconds = stop.tv_sec + (stop.tv_usec / 1000000.0);
- if (!seconds)
- seconds = 1;
-
- if (seconds != last_msg) {
- last_msg = seconds;
- msgInfo("%10d bytes read from %s dist, chunk %2d of %2d @ %.1f KBytes/sec.",
- total, dist, chunk + 1, numchunks, (total / seconds) / 1000.0);
- }
+ n = fread(buf + realsize, 1, BUFSIZ, fp);
+ if (check_for_interrupt()) {
+ msgConfirm("Media read error: User interrupt.");
+ fclose(fp);
+ goto punt;
+ } else if (n <= 0)
+ break;
+ total += n;
+ realsize += n;
+
+ /* Print statistics about how we're doing */
+ (void) gettimeofday(&stop, (struct timezone *)0);
+ stop.tv_sec = stop.tv_sec - start.tv_sec;
+ stop.tv_usec = stop.tv_usec - start.tv_usec;
+ if (stop.tv_usec < 0)
+ stop.tv_sec--, stop.tv_usec += 1000000;
+ seconds = stop.tv_sec + (stop.tv_usec / 1000000.0);
+ if (!seconds)
+ seconds = 1;
+
+ if (seconds != last_msg) {
+ last_msg = seconds;
+ msgInfo("%10d bytes read from %s dist, chunk %2d of %2d @ %.1f KBytes/sec.",
+ total, dist, chunk + 1, numchunks,
+ (total / seconds) / 1000.0);
}
- fclose(fp);
-
- if (!chunksize || (realsize == chunksize)) {
- /* No substitution necessary */
- retval = write(fd2, buf, realsize);
- if (retval != realsize) {
- fclose(fp);
- dialog_clear_norefresh();
- msgConfirm("Write failure on transfer! (wrote %d bytes of %d bytes)", retval, realsize);
+ }
+ fclose(fp);
+
+ if (!chunksize || (realsize == chunksize)) {
+ /* No substitution necessary */
+ retval = write(fd2, buf, realsize);
+ if (retval != realsize) {
+ fclose(fp);
+ dialog_clear_norefresh();
+ msgConfirm("Write failure on transfer! (wrote %d bytes of %d bytes)", retval, realsize);
goto punt;
- }
- } else {
- for (j = 0; j < realsize; j++) {
- /* On finding CRLF, skip the CR; don't exceed end of buffer. */
- if ((buf[j] != 0x0d) || (j == total - 1) || (buf[j + 1] != 0x0a)) {
- retval = write(fd2, buf + j, 1);
- if (retval != 1) {
- fclose(fp);
- dialog_clear_norefresh();
- msgConfirm("Write failure on transfer! (wrote %d bytes of %d bytes)", j, chunksize);
- goto punt;
- }
+ }
+ } else {
+ for (j = 0; j < realsize; j++) {
+ /* On finding CRLF, skip the CR; don't exceed end of buffer. */
+ if ((buf[j] != 0x0d) || (j == total - 1) || (buf[j + 1] != 0x0a)) {
+ retval = write(fd2, buf + j, 1);
+ if (retval != 1) {
+ fclose(fp);
+ dialog_clear_norefresh();
+ msgConfirm("Write failure on transfer! (wrote %d bytes of %d bytes)", j, chunksize);
+ goto punt;
}
}
}
}
- close(fd2);
+ }
+ goto done;
+
+punt:
+ status = FALSE;
+done:
+ properties_free(dist_attr);
+ close(fd2);
+ if (status != FALSE)
status = mediaExtractDistEnd(zpid, cpid);
- goto done;
+ else
+ (void)mediaExtractDistEnd(zpid, cpid);
+
+ if (unmounted_dev) {
+ struct iovec iov[4];
+
+ iov[0].iov_base = "fstype";
+ iov[0].iov_len = sizeof("fstype");
+ iov[1].iov_base = "devfs";
+ iov[1].iov_len = sizeof("devfs");
+ iov[2].iov_base = "fspath";
+ iov[2].iov_len = sizeof("fstype");
+ iov[3].iov_base = "/dev";
+ iov[3].iov_len = sizeof("/dev");
+ (void)nmount(iov, 4, 0);
+ unmounted_dev = 0;
+ }
- punt:
- close(fd2);
- mediaExtractDistEnd(zpid, cpid);
- status = FALSE;
+ safe_free(buf);
+}
- done:
- if (!status) {
- dialog_clear_norefresh();
- if (me[i].my_dist) {
+static Boolean
+distExtract(char *parent, Distribution *me)
+{
+ int i, status;
+ char *path, *dist;
+ WINDOW *w = savescr();
+ struct sigaction old, new;
+
+ status = TRUE;
+ if (isDebug())
+ msgDebug("distExtract: parent: %s, me: %s\n", parent ? parent : "(none)", me->my_name);
+
+ /* Make ^C fake a sudden timeout */
+ new.sa_handler = handle_intr;
+ new.sa_flags = 0;
+ (void)sigemptyset(&new.sa_mask);
+ dialog_clear_norefresh();
+ dialog_msgbox("Please Wait", "Extracting all requested distributions...", -1, -1, 0);
+ sigaction(SIGINT, &new, &old);
+
+ /* Loop through to see if we're in our parent's plans */
+ for (i = 0; me[i].my_name; i++) {
+ 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;
+
+ switch (me[i].my_type) {
+ case DT_SUBDIST:
+ /* Recurse if we actually have a sub-distribution */
+ status = distExtract(dist, me[i].my_data.my_dist);
+ if (!status) {
+ dialog_clear_norefresh();
msgConfirm("Unable to transfer all components of the %s distribution.\n"
- "You may wish to switch media types and try again.\n", me[i].my_name);
+ "You may wish to switch media types and try again.\n",
+ me[i].my_name);
}
- else if (me[i].my_bit != DIST_LOCAL) {
- status = msgYesNo("Unable to transfer the %s distribution from\n%s.\n\n"
- "Do you want to try to retrieve it again?",
- me[i].my_name, mediaDevice->name);
- if (!status)
- --i;
+ break;
+ case DT_PACKAGE:
+ dialog_clear_norefresh();
+ msgNotify("Installing %s distribution...", dist);
+ status = (package_add(me[i].my_data.my_string) == DITEM_SUCCESS);
+ if (!status)
+ dialog_clear_norefresh();
+ break;
+ case DT_TARBALL:
+ status = distExtractTarball(path, dist, me[i].my_data.my_string,
+ &me[i] == BASE_DIST);
+ if (!status) {
+ dialog_clear_norefresh();
+ if (me[i].my_bit != DIST_LOCAL) {
+ status = msgYesNo("Unable to transfer the %s distribution from\n%s.\n\n"
+ "Do you want to try to retrieve it again?",
+ me[i].my_name, mediaDevice->name);
+ if (!status)
+ --i;
+ status = FALSE;
+ }
}
+ break;
}
- /* If extract was successful, remove ourselves from further consideration */
+
+ /*
+ * If extract was successful, remove ourselves from further
+ * consideration.
+ */
if (status)
*(me[i].my_mask) &= ~(me[i].my_bit);
- else
- continue;
- if (unmounted_dev) {
- struct iovec iov[4];
-
- iov[0].iov_base = "fstype";
- iov[0].iov_len = sizeof("fstype");
- iov[1].iov_base = "devfs";
- iov[1].iov_len = sizeof("devfs");
- iov[2].iov_base = "fspath";
- iov[2].iov_len = sizeof("fstype");
- iov[3].iov_base = "/dev";
- iov[3].iov_len = sizeof("/dev");
- (void)nmount(iov, 4, 0);
- unmounted_dev = 0;
- }
}
- safe_free(buf);
- properties_free(dist_attr);
sigaction(SIGINT, &old, NULL); /* Restore signal handler */
restorescr(w);
return status;
@@ -887,19 +932,16 @@ printSelected(char *buf, int selected, Distribution *me, int *col)
if (!(me[i].my_bit & selected))
continue;
- /* This is shorthand for "dist currently disabled" */
- if (!me[i].my_dir)
- continue;
-
*col += strlen(me[i].my_name);
if (*col > 50) {
*col = 0;
strcat(buf, "\n");
}
sprintf(&buf[strlen(buf)], " %s", me[i].my_name);
+
/* Recurse if have a sub-distribution */
- if (me[i].my_dist)
- printSelected(buf, *(me[i].my_mask), me[i].my_dist, col);
+ if (me[i].my_type == DT_SUBDIST)
+ printSelected(buf, *(me[i].my_mask), me[i].my_data.my_dist, col);
}
}
@@ -909,10 +951,6 @@ distExtractAll(dialogMenuItem *self)
int old_dists, retries = 0, status = DITEM_SUCCESS;
char buf[512];
WINDOW *w;
- int want_perl_package = 0;
-#ifdef X_AS_PKG
- int want_x_package = 0;
-#endif
/* paranoia */
if (!Dists) {
@@ -930,33 +968,14 @@ distExtractAll(dialogMenuItem *self)
w = savescr();
msgNotify("Attempting to install all selected distributions..");
- /* Clear perl dist flag, but remember it was present. */
- if (Dists & DIST_PERL) {
- want_perl_package = 1;
- Dists &= ~DIST_PERL;
- }
-#ifdef X_AS_PKG
- /* Clear any XFree86 dist flags, but remember they were present. */
- if(Dists & DIST_XF86)
- want_x_package = 1;
- Dists &= ~DIST_XF86;
-#endif
-
/* Try for 3 times around the loop, then give up. */
while (Dists && ++retries < 3)
distExtract(NULL, DistTable);
- if (want_perl_package)
- status |= installPackage(NULL, "Perl", "perl");
-#ifdef X_AS_PKG
- if (want_x_package)
- status |= installPackage(NULL, "XFree86", "XFree86-4");
-#endif
-
dialog_clear_norefresh();
- /* Only do bin fixup if bin dist was successfully extracted */
+ /* Only do base fixup if base dist was successfully extracted */
if ((old_dists & DIST_BASE) && !(Dists & DIST_BASE))
- status |= installFixupBin(self);
+ status |= installFixupBase(self);
#ifndef X_AS_PKG
if (old_dists & DIST_XF86)
status |= installFixupXFree(self);
OpenPOWER on IntegriCloud