Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Nov 2010 13:47:13 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r214677 - user/ae/usr.sbin/sade
Message-ID:  <201011021347.oA2DlDrc051265@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Nov  2 13:47:13 2010
New Revision: 214677
URL: http://svn.freebsd.org/changeset/base/214677

Log:
  Add frontend to tunefs dialog.

Modified:
  user/ae/usr.sbin/sade/ufsed.c

Modified: user/ae/usr.sbin/sade/ufsed.c
==============================================================================
--- user/ae/usr.sbin/sade/ufsed.c	Tue Nov  2 13:04:25 2010	(r214676)
+++ user/ae/usr.sbin/sade/ufsed.c	Tue Nov  2 13:47:13 2010	(r214677)
@@ -258,6 +258,113 @@ ufslist_reread(struct ufslist *fslist)
 	return (error);
 }
 
+static int
+tunefs_keyhndl(int key)
+{
+	switch (key) {
+	case ' ':
+	case KEY_UP:
+	case KEY_DOWN:
+	case KEY_LEFT:
+	case KEY_RIGHT:
+		return (key);
+	}
+	return (0);
+}
+
+static void
+ufsed_tunefs(history_t hist, struct ufsinfo *pfs)
+{
+	struct custom_dlg dlg;
+	struct dlg_item *item;
+	DLG_BUTTON *btnOk, *btnCancel, *btnCustom;
+	DLG_EDIT *eLabel;
+	WINDOW *win;
+	uint32_t flags;
+	int q, h, w, ret, i;
+	char *title_buf;
+	struct {
+		DLG_CHECKBOX	*item;
+		uint32_t	flag;
+		const char	*label;
+		const char	*arg;
+	} checkbox[] = {
+		{ NULL, FS_DOSOFTDEP, "Soft Updates", "-n" },
+		{ NULL, FS_SUJ, "SU journaling", "-j" },
+		{ NULL, FS_ACLS, "POSIX.1e ACL", "-a" },
+		{ NULL, FS_MULTILABEL, "MAC multilabel", "-l" },
+		{ NULL, FS_GJOURNAL, "GEOM journaling", "-J" },
+		{ NULL, FS_NFS4ACLS, "NFSv4 ALC", "-N" }
+	};
+
+	win = savescr();
+	dlg_init(&dlg);
+	asprintf(&title_buf, "Change a file system parameters for \"%s\":",
+	    pfs->partname);
+	dlg_add_label(&dlg, 1, 2, 55, 2, title_buf);
+	eLabel = dlg_add_edit(&dlg, 3, 2, 24, "Volume Label:",
+	    MAXVOLLEN, pfs->volname);
+	for (i = 0; i < sizeof(checkbox) / sizeof(checkbox[0]); i++)
+		checkbox[i].item = dlg_add_checkbox(&dlg,
+		    (i < 1) ? 7: 2 + i, (i < 1) ? 2: 30, 24, 1,
+		    (checkbox[i].flag & pfs->flags) != 0,
+		    checkbox[i].label);
+	btnOk = dlg_add_button(&dlg, 9, 14, "  Ok  ");
+	btnCancel = dlg_add_button(&dlg, 9, 26, "Cancel");
+	btnCustom = dlg_add_button(&dlg, 9, 38, "Custom");
+	use_helpline("Press F1 for help");
+	dlg_autosize(&dlg, &w, &h);
+	dlg_open_dialog(&dlg, w + 1, h + 1, "Change File System");
+	q = 0;
+	do {
+		ret = dlg_proc(&dlg, tunefs_keyhndl);
+		if (ret == DE_ESC) {
+			q = 1;
+			break;
+		}
+		item = dlg_focus_get(&dlg);
+		switch (ret) {
+		case DE_CR:
+			if (item == btnCancel)
+				q = 1;
+			else if (item == btnOk)
+				q = 2;
+			else if (item == btnCustom)
+				q = 3;
+			else
+				dlg_focus_next(&dlg);
+			break;
+		case KEY_UP:
+		case KEY_LEFT:
+			dlg_focus_prev(&dlg);
+			break;
+		case KEY_DOWN:
+		case KEY_RIGHT:
+			dlg_focus_next(&dlg);
+			break;
+		case ' ':
+			if (item->type == CHECKBOX)
+				dlg_checkbox_toggle(&dlg, item);
+		};
+	} while (q == 0);
+
+	flags = 0;
+	for (i = 0; i < sizeof(checkbox) / sizeof(checkbox[0]); i++) {
+		if (dlg_checkbox_checked(&dlg, checkbox[i].item))
+			flags |= checkbox[i].flag;
+		else
+			flags &= ~checkbox[i].flag;
+	}
+	if (flags != pfs->flags) {
+		/* something changed */
+	}
+	restorescr(win);
+	dlg_close_dialog(&dlg);
+	dlg_free(&dlg);
+	free(title_buf);
+}
+
+
 #define	FSED_MENU_TOP		4
 #define	FSED_BOTTOM_HEIGHT	7
 #define	LABEL(l)		((l) ? (l): "-")
@@ -345,8 +452,9 @@ resize:
 			tmps = "unknown";
 		}
 		mvprintw(FSED_MENU_TOP, 30, "%-20s%s", "File System:", tmps);
-		if (selected->magic == FS_UFS1_MAGIC ||
-		    selected->magic == FS_UFS2_MAGIC) {
+#define	IS_UFS(pfs) \
+	((pfs)->magic == FS_UFS1_MAGIC || (pfs)->magic == FS_UFS2_MAGIC)
+		if (IS_UFS(selected)) {
 			mvprintw(FSED_MENU_TOP + 1, 30, "%-20s%s",
 			    "last mountpoint:",
 			    LABEL(selected->fsmnt));
@@ -386,8 +494,13 @@ resize:
 
 		key = toupper(getch());
 		switch (key) {
-		case '\r':
-		case '\n':
+		case 'M':
+			if (!IS_UFS(selected)) {
+				msg = "Can not modify 'unknown' file system. "
+				    "First create an UFS file system.";
+				break;
+			}
+			ufsed_tunefs(hist, selected);
 			break;
 		case KEY_ESC:
 		case 'Q':



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011021347.oA2DlDrc051265>