PERFORCE change 82814 for review

soc-andrew soc-andrew at FreeBSD.org
Tue Aug 30 03:51:44 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=82814

Change 82814 by soc-andrew at soc-andrew_serv on 2005/08/30 03:51:36

	Add a basic package installation menu. There is no dependency handling yet.

Affected files ...

.. //depot/projects/soc2005/bsdinstaller/src/contrib/bsdinstaller/backend/installer/fn_configure.c#3 edit
.. //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/fn_install_freebsd.c#8 edit

Differences ...

==== //depot/projects/soc2005/bsdinstaller/src/contrib/bsdinstaller/backend/installer/fn_configure.c#3 (text+ko) ====

@@ -354,6 +354,7 @@
 	commands_free(cmds);	
 }
 
+#if 0
 void
 fn_install_packages(struct i_fn_args *a)
 {
@@ -444,6 +445,7 @@
 	dfui_form_free(f);
 	dfui_response_free(r);
 }
+#endif
 
 void
 fn_remove_packages(struct i_fn_args *a)

==== //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/fn_install_freebsd.c#8 (text+ko) ====

@@ -43,8 +43,11 @@
  * It is based on the DragonFlyBSD version of fn_install_os
  */
 
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <sys/utsname.h>
 
+#include <dirent.h>
 #include <limits.h>
 #include <string.h>
 
@@ -92,7 +95,8 @@
 static int pre_install(struct i_fn_args *);
 static int do_install(struct i_fn_args *);
 static int post_install(struct i_fn_args *);
-void fn_install_os(struct i_fn_args *a);
+void fn_install_os(struct i_fn_args *);
+void fn_select_packages(struct i_fn_args*, struct aura_dict*, char*);
 
 static int
 pre_install(struct i_fn_args *a)
@@ -245,7 +249,6 @@
 	}
 	if (install_ports == 1) {
 		dist_set_location("/mnt/usr");
-		printf("%d\n", dist_extract(a->c, "ports"));
 	}
 
 	i_log(a, ">>> Done");
@@ -453,3 +456,218 @@
 	post_install(a);
 }
 
+/*
+ * Lists all packages and installs selected ones
+ */
+void
+fn_install_packages(struct i_fn_args *a)
+{
+	struct dfui_field *fi;
+	struct dfui_form *f;
+	struct dfui_response *r;
+	DIR *d;
+	struct dirent *de;
+	struct aura_dict *packages;
+	int done = 0;
+
+	f = dfui_form_create(
+	    "install_packages",
+	    _("Install Packages"),
+	    _("Select optional software packages that you want "
+	    "installed on this system.  This form lists only the "
+	    "software packages available from the LiveCD. Thousands "
+	    "more are available via the internet once FreeBSD "
+	    "is installed."),
+	    "",
+
+	    "p", "special", "fbsdinstaller_install_packages",
+
+	    NULL
+	);
+
+	d = opendir("/usr/packages/");
+	if (d == NULL) {
+		inform(a->c, _("Could not find the package directory."));
+		dfui_form_free(f);
+		return;
+	}
+
+	while ((de = readdir(d)) != NULL) {
+		/* I tried to use de->d_type == DT_DIR but d_type was always 0 */
+		struct stat sb;
+		char file[PATH_MAX];
+
+		if (de->d_name[0] == '.')
+			continue;
+
+		snprintf(file, PATH_MAX, "/usr/packages/%s", de->d_name);
+		stat(file, &sb);
+
+		if (!S_ISDIR(sb.st_mode))
+			continue;
+
+		dfui_form_action_add(f, de->d_name,
+		    dfui_info_new(de->d_name, "", ""));
+	}
+
+	closedir(d);
+
+	dfui_form_action_add(f, "ok",
+	    dfui_info_new(_("Accept and Install"), "", ""));
+	dfui_form_action_add(f, "cancel",
+	    dfui_info_new(_("Cancel"), "", ""));
+
+	packages = aura_dict_new(13, AURA_DICT_LIST);
+
+	while (done == 0)
+	{
+		if (!dfui_be_present(a->c, f, &r))
+			abort_backend();
+
+		if (strcmp(dfui_response_get_action_id(r), "cancel") == 0) {
+			done = 1;
+		} else if (strcmp(dfui_response_get_action_id(r), "ok") == 0) {
+			/* Install the packages */
+			char *key;
+			int key_len;
+
+			aura_dict_rewind(packages);
+			while (!aura_dict_eof(packages)) {
+				struct commands *cmds;
+
+				/* Set dist_name */
+				aura_dict_get_current_key(packages, (void*)&key,
+				    &key_len);
+				key[key_len] = '\0';
+
+				cmds = commands_new();
+
+				command_add(cmds,
+				    "cp /usr/packages/All/%s.tbz /mnt/tmp",
+				    key);
+				command_add(cmds,
+				    "pkg_add -C /mnt /tmp/%s.tbz", key);
+				command_add(cmds, "rm /mnt/tmp/%s.tbz", key);
+
+				commands_execute(a, cmds);
+				commands_free(cmds);
+
+				aura_dict_next(packages);
+			}
+
+			done = 1;
+		} else {
+			/* move to the next level window */
+			fn_select_packages(a, packages,
+			    (char*)dfui_response_get_action_id(r));
+		}
+	}
+
+	aura_dict_free(packages);
+
+	dfui_response_free(r);
+	dfui_form_free(f);
+}
+
+void
+fn_select_packages(struct i_fn_args *a, struct aura_dict *packages, char *dir)
+{
+	struct dfui_field *fi;
+	struct dfui_form *f;
+	struct dfui_response *r;
+	struct dfui_dataset *ds;
+	DIR *d;
+	struct dirent *de;
+	char dir_name[PATH_MAX];
+
+	f = dfui_form_create(
+	    "install_packages",
+	    _("Install Packages"),
+	    _("Select optional software packages that you want "
+	    "installed on this system.  This form lists only the "
+	    "software packages installed on the LiveCD; thousands "
+	    "more are available via the internet once FreeBSD "
+	    "is installed."),
+	    "",
+
+	    "p", "special", "fbsdinstaller_install_packages",
+
+	    "f", "install", "Install?",
+	    "Install this Package", "",
+	    "p", "control", "checkbox",
+
+	    "f", "package", "Package name",
+	    "The name of the Package to install", "",
+	    "p", "editable", "false",
+
+	    "a", "ok", "Back", "", "",
+
+	    NULL
+	);
+
+	dfui_form_set_multiple(f, 1);
+
+	snprintf(dir_name, PATH_MAX, "/usr/packages/%s", dir);
+
+	d = opendir(dir_name);
+	if (d == NULL) {
+		inform(a->c, _("Could not find the package directory."));
+		dfui_form_free(f);
+		return;
+	}
+
+	while ((de = readdir(d)) != NULL) {
+		/* I tried to use de->d_type == DT_DIR but d_type was always 0 */
+		struct stat sb;
+		char file[PATH_MAX];
+		char *extension;
+
+		if (de->d_name[0] == '.')
+			continue;
+
+		snprintf(file, PATH_MAX, "/usr/packages/%s/%s", dir, de->d_name);
+		stat(file, &sb);
+
+		if (!S_ISREG(sb.st_mode))
+			continue;
+
+		extension = strstr(de->d_name, ".tbz");
+		if (extension != NULL)
+			extension[0] = '\0';
+
+		ds = dfui_dataset_new();
+		dfui_dataset_celldata_add(ds, "install", "N");
+		dfui_dataset_celldata_add(ds, "package", de->d_name);
+		dfui_form_dataset_add(f, ds);
+	}
+
+	closedir(d);
+
+	if (!dfui_be_present(a->c, f, &r))
+		abort_backend();
+
+	if (strcmp(dfui_response_get_action_id(r), "ok") == 0) {
+		/* Add the packages and dependencies to the dictonary */
+		for (ds = dfui_response_dataset_get_first(r); ds != NULL;
+		     ds = dfui_dataset_get_next(ds)) {
+			char install[2];
+
+			/* Copy the value of the install field to install */
+			strncpy(install, dfui_dataset_get_value(ds, "install"), 2);
+
+			if (strncasecmp(install, "Y", 2) == 0) {
+				/* Select this dist for installation */
+				char *package;
+				int len;
+
+				package = (char*)dfui_dataset_get_value(ds, "package");
+				len = strlen(package);
+				aura_dict_store(packages, package, len,
+				    package, len);
+			}
+		}
+	}
+
+	dfui_response_free(r);
+	dfui_form_free(f);
+}


More information about the p4-projects mailing list