From owner-svn-src-user@FreeBSD.ORG Tue Nov 2 13:47:14 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 252731065694; Tue, 2 Nov 2010 13:47:14 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1434C8FC25; Tue, 2 Nov 2010 13:47:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id oA2DlDGB051268; Tue, 2 Nov 2010 13:47:13 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oA2DlDrc051265; Tue, 2 Nov 2010 13:47:13 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201011021347.oA2DlDrc051265@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Tue, 2 Nov 2010 13:47:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r214677 - user/ae/usr.sbin/sade X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Nov 2010 13:47:14 -0000 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':