From owner-svn-src-user@FreeBSD.ORG Tue Nov 9 10:58:20 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 2871E106566B; Tue, 9 Nov 2010 10:58:20 +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 174B38FC17; Tue, 9 Nov 2010 10:58:20 +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 oA9AwJ6N007389; Tue, 9 Nov 2010 10:58:19 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oA9AwJDS007387; Tue, 9 Nov 2010 10:58:19 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201011091058.oA9AwJDS007387@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Tue, 9 Nov 2010 10:58:19 +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: r215033 - 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, 09 Nov 2010 10:58:20 -0000 Author: ae Date: Tue Nov 9 10:58:19 2010 New Revision: 215033 URL: http://svn.freebsd.org/changeset/base/215033 Log: Add frontend dialog to newfs(8). Ask user what to do with unsaved changes when leaving editor. Print out UFS id only when it is valid. 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 9 10:28:02 2010 (r215032) +++ user/ae/usr.sbin/sade/ufsed.c Tue Nov 9 10:58:19 2010 (r215033) @@ -317,8 +317,8 @@ ufsed_tunefs(history_t hist, struct ufsi (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"); - btnAdvanced = dlg_add_button(&dlg, 9, 38, "Advanced"); + btnAdvanced = dlg_add_button(&dlg, 9, 25, "Advanced"); + btnCancel = dlg_add_button(&dlg, 9, 38, "Cancel"); use_helpline("Press F1 for help"); dlg_autosize(&dlg, &w, &h); dlg_open_dialog(&dlg, w + 1, h + 1, "Change File System"); @@ -356,6 +356,7 @@ again: }; } while (q == 0); + /* TODO: handle advanced button */ if (q != 2) goto done; @@ -412,6 +413,204 @@ done: dlg_free(&dlg); } +static void +ufsed_newfs(history_t hist, struct ufsinfo *pfs) +{ + struct custom_dlg dlg; + struct dlg_item *item; + struct de_devlist devlist; + struct de_device *pdev; + DLG_BUTTON *btnCreate, *btnCancel, *btnAdvanced; + DLG_EDIT *eLabel, *eBlock, *eFrag, *eSector; + WINDOW *win; + uint64_t num, tmp; + int q, h, w, ret, i; + char buf[CMDLEN_MAX], *s, *volname; + struct { + DLG_CHECKBOX *item; + uint32_t flag; + const char *label; + const char *arg; + } checkbox[] = { + { NULL, 0, "Erase content", "-E" }, + { NULL, FS_DOSOFTDEP, "Soft Updates", "-U" }, + { NULL, FS_GJOURNAL, "GEOM journaling", "-J" }, + { NULL, FS_MULTILABEL, "MAC multilabel", "-l" }, +#define NEWFSOPS_COUNT 4 + { NULL, FS_SUJ, "SU journaling", "-j" }, + { NULL, FS_ACLS, "POSIX.1e ACL", "-a" }, + { NULL, FS_NFS4ACLS, "NFSv4 ACL", "-N"} + }; + + win = savescr(); + dlg_init(&dlg); + snprintf(buf, sizeof(buf), + "Create new file system on \"%s\":", pfs->partname); + dlg_add_label(&dlg, 1, 2, 55, 2, buf); + eLabel = dlg_add_edit(&dlg, 3, 2, 24, "Volume Label:", + MAXVOLLEN, NULL); + eBlock = dlg_add_edit(&dlg, 7, 2, 24, "Block Size:", 8, "16384"); + eFrag = dlg_add_edit(&dlg, 11, 2, 24, "Fragment Size:", 8, "2048"); + + ret = de_devlist_get(&devlist); + if (ret == 0) { + pdev = de_dev_find(&devlist, pfs->devname); + if (pdev) + num = pdev->de_sectorsize; + else + num = 512; + de_devlist_free(&devlist); + } + snprintf(buf, sizeof(buf), "%u", (uint32_t)num); + eSector = dlg_add_edit(&dlg, 3, 30, 24, "Sector Size:", 8, buf); + for (i = 0; i < sizeof(checkbox) / sizeof(checkbox[0]); i++) + checkbox[i].item = dlg_add_checkbox(&dlg, + 8 + i, 30, 24, 1, 0, checkbox[i].label); + btnCreate = dlg_add_button(&dlg, 16, 14, "Create"); + btnAdvanced = dlg_add_button(&dlg, 16, 25, "Advanced"); + btnCancel = dlg_add_button(&dlg, 16, 38, "Cancel"); + use_helpline("Press F1 for help"); + dlg_autosize(&dlg, &w, &h); + dlg_open_dialog(&dlg, w + 1, h + 1, "Create File System"); +again: + 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 == btnCreate) + q = 2; + else if (item == btnAdvanced) + 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); + + if (q != 2) + goto done; + + snprintf(buf, sizeof(buf), "%s", _PATH_NEWFS); + /* Volume Label */ + volname = s = dlg_edit_get_value(&dlg, eLabel); + if (s != NULL && *s != '\0') { + i = 0; + while (isalnum(s[i++])); + if (s[i] != '\0') { + dmenu_open_errormsg("Invalid character in volume " + "label. Only alphanumerics characters are " + "allowed."); + goto again; + } + snprintf(buf, sizeof(buf), "%s -L \"%s\"", buf, s); + } + /* Block Size */ + s = dlg_edit_get_value(&dlg, eBlock); + if (s != NULL && *s != '\0') { + ret = expand_number(s, &num); + if (ret < 0 || num < MINBSIZE || num > MAXBSIZE || + (num & (num - 1)) != 0) { + dmenu_open_errormsg("Invalid block size."); + goto again; + } + } else + num = 16384; + snprintf(buf, sizeof(buf), "%s -b %u", buf, (uint32_t)num); + /* Fragment size */ + s = dlg_edit_get_value(&dlg, eFrag); + if (s != NULL && *s != '\0') { + ret = expand_number(s, &tmp); + if (ret < 0 || tmp > num || tmp == 0 || + (tmp & (tmp - 1)) != 0) { + dmenu_open_errormsg("Invalid fragment size."); + goto again; + } + num = tmp; + } else + num = 2048; + snprintf(buf, sizeof(buf), "%s -f %u", buf, (uint32_t)num); + /* Sector size */ + s = dlg_edit_get_value(&dlg, eSector); + if (s != NULL && *s != '\0') { + ret = expand_number(s, &tmp); + if (ret < 0 || tmp >= pfs->size || tmp < 512 || + (tmp & (tmp - 1)) != 0) { + dmenu_open_errormsg("Invalid sector size."); + goto again; + } + num = tmp; + } else + num = 512; + snprintf(buf, sizeof(buf), "%s -S %u", buf, (uint32_t)num); + for (i = 0, tmp = 0; i < NEWFSOPS_COUNT; i++) { + if (dlg_checkbox_checked(&dlg, checkbox[i].item)) { + snprintf(buf, sizeof(buf), "%s %s", buf, + checkbox[i].arg); + tmp |= checkbox[i].flag; + } + } + snprintf(buf, sizeof(buf), "%s %s%s", buf, _PATH_DEV, pfs->partname); + /* add newfs command to history */ + ret = ufsed_history_add(hist, buf); + if (ret) + dmenu_open_errormsg("Operation failed."); + else { /* do fake changes to update current view */ + pfs->magic = FS_UFS2_MAGIC; + pfs->flags = (uint32_t)tmp; + pfs->id[0] = 0; + pfs->id[1] = 0; + free(pfs->volname); + if (volname != NULL && *volname != '\0') + pfs->volname = strndup(volname, MAXVOLLEN); + else + pfs->volname = NULL; + free(pfs->fsmnt); + pfs->fsmnt = NULL; + } + snprintf(buf, sizeof(buf), "%s", PATH_TUNEFS); + for (i = NEWFSOPS_COUNT, num = 0; + i < sizeof(checkbox) / sizeof(checkbox[0]); i++) { + if (dlg_checkbox_checked(&dlg, checkbox[i].item)) { + snprintf(buf, sizeof(buf), "%s %s enable", buf, + checkbox[i].arg); + num |= checkbox[i].flag; + } + } + if (num > 0) { + snprintf(buf, sizeof(buf), "%s %s%s", buf, _PATH_DEV, + pfs->partname); + ret = ufsed_history_add(hist, buf); + if (ret) + dmenu_open_errormsg("Operation failed."); + else { /* do fake changes to update current view */ + pfs->flags |= num; + } + } +done: + restorescr(win); + dlg_close_dialog(&dlg); + dlg_free(&dlg); +} + #define FSED_MENU_TOP 4 #define FSED_BOTTOM_HEIGHT 7 @@ -506,8 +705,10 @@ resize: mvprintw(FSED_MENU_TOP + 1, 30, "%-20s%s", "last mountpoint:", LABEL(selected->fsmnt)); - mvprintw(FSED_MENU_TOP + 2, 30, "%-20s%08x%08x", - "UFS id:", selected->id[0], selected->id[1]); + if (HAS_UFSID(selected)) + mvprintw(FSED_MENU_TOP + 2, 30, + "%-20s%08x%08x", "UFS id:", + selected->id[0], selected->id[1]); mvprintw(FSED_MENU_TOP + 3, 30, "%-20s%s", "volume label:", LABEL(selected->volname)); #define FS_STATUS(pfs, flag) \ @@ -550,8 +751,20 @@ resize: } ufsed_tunefs(hist, selected); break; + case 'C': + if (IS_UFS(selected)) { + if (dmenu_open_noyes(ask_recreate_msg)) + break; + } + ufsed_newfs(hist, selected); + break; case KEY_ESC: case 'Q': + if (!history_isempty(hist) && + !dmenu_open_noyes(pending_write_msg)) { + error = history_play(hist, ufsed_history_play); + /* XXX */ + } q = 1; break; case 'W':