diff options
author | fjoe <fjoe@FreeBSD.org> | 2011-11-24 13:24:06 +0000 |
---|---|---|
committer | fjoe <fjoe@FreeBSD.org> | 2011-11-24 13:24:06 +0000 |
commit | 7e5bec7de10881e3780fd16867f20f1917dc5ad0 (patch) | |
tree | a5bb7ade6aaa08c5587a1d8d4d1e004bfc89bff2 /usr.sbin | |
parent | b93ba3b0f158601d8784267e0019c49f959e5c69 (diff) | |
download | FreeBSD-src-7e5bec7de10881e3780fd16867f20f1917dc5ad0.zip FreeBSD-src-7e5bec7de10881e3780fd16867f20f1917dc5ad0.tar.gz |
Port to new libdialog.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/tzsetup/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/tzsetup/tzsetup.c | 166 |
2 files changed, 126 insertions, 46 deletions
diff --git a/usr.sbin/tzsetup/Makefile b/usr.sbin/tzsetup/Makefile index 4bf9dd7..4ef6533 100644 --- a/usr.sbin/tzsetup/Makefile +++ b/usr.sbin/tzsetup/Makefile @@ -3,11 +3,11 @@ PROG= tzsetup MAN= tzsetup.8 -CFLAGS+= -I${.CURDIR}/../../gnu/lib/libodialog -I. +CFLAGS+= -I${.CURDIR}/../../contrib/dialog -I. WARNS?= 3 -DPADD= ${LIBODIALOG} ${LIBNCURSES} -LDADD= -lodialog -lncurses +DPADD= ${LIBDIALOG} ${LIBNCURSESW} ${LIBM} +LDADD= -ldialog -lncursesw -lm .include <bsd.prog.mk> diff --git a/usr.sbin/tzsetup/tzsetup.c b/usr.sbin/tzsetup/tzsetup.c index 5a9ea0a..78f917a 100644 --- a/usr.sbin/tzsetup/tzsetup.c +++ b/usr.sbin/tzsetup/tzsetup.c @@ -35,7 +35,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <dialog.h> #include <err.h> #include <errno.h> #include <stdio.h> @@ -49,6 +48,8 @@ __FBSDID("$FreeBSD$"); #include <sys/queue.h> #include <sys/stat.h> +#include <dialog.h> + #define _PATH_ZONETAB "/usr/share/zoneinfo/zone.tab" #define _PATH_ISO3166 "/usr/share/misc/iso3166" #define _PATH_ZONEINFO "/usr/share/zoneinfo" @@ -56,8 +57,92 @@ __FBSDID("$FreeBSD$"); #define _PATH_DB "/var/db/zoneinfo" #define _PATH_WALL_CMOS_CLOCK "/etc/wall_cmos_clock" +/* special return codes for `fire' actions */ +#define DITEM_FAILURE 1 + +/* flags - returned in upper 16 bits of return status */ +#define DITEM_LEAVE_MENU (1 << 16) +#define DITEM_RECREATE (1 << 18) + +/* for use in describing more exotic behaviors */ +typedef struct dialogMenuItem { + char *prompt; + char *title; + int (*fire)(struct dialogMenuItem *self); + void *data; +} dialogMenuItem; + +static int +xdialog_menu(const char *title, const char *cprompt, int height, int width, + int menu_height, int item_no, dialogMenuItem *ditems) +{ + int i, result, choice; + DIALOG_LISTITEM *listitems; + DIALOG_VARS save_vars; + + dlg_save_vars(&save_vars); + + /* initialize list items */ + listitems = dlg_calloc(DIALOG_LISTITEM, item_no); + assert_ptr(listitems, "xdialog_menu"); + for (i = 0; i < item_no; i++) { + listitems[i].name = ditems[i].prompt; + listitems[i].text = ditems[i].title; + } + + /* calculate width */ + if (width < 0) { + int tag_x = 0; + + for (i = 0; i < item_no; i++) { + int j, l; + + l = strlen(listitems[i].name); + for (j = 0; j < item_no; j++) { + int k = strlen(listitems[j].text); + tag_x = MAX(tag_x, l + k + 2); + } + } + width = MAX(dlg_count_columns(cprompt), title != NULL ? dlg_count_columns(title) : 0); + width = MAX(width, tag_x + 4) + 4; + } + width = MAX(width, 24); + if (width > COLS) + width = COLS; + +again: + dialog_vars.default_item = ditems[choice].prompt; + result = dlg_menu(title, cprompt, height, width, + menu_height, item_no, listitems, &choice, NULL); + switch (result) { + case DLG_EXIT_ESC: + result = -1; + break; + case DLG_EXIT_OK: + if (ditems[choice].fire != NULL) { + int status; + + status = ditems[choice].fire(ditems + choice); + if (status & DITEM_RECREATE) { + dlg_clear(); + goto again; + } + } + result = 0; + break; + case DLG_EXIT_CANCEL: + default: + result = 1; + break; + } + + free(listitems); + dlg_restore_vars(&save_vars); + return result; +} + static char path_zonetab[MAXPATHLEN], path_iso3166[MAXPATHLEN], - path_zoneinfo[MAXPATHLEN], path_localtime[MAXPATHLEN], + path_zoneinfo[MAXPATHLEN], path_localtime[MAXPATHLEN], path_db[MAXPATHLEN], path_wall_cmos_clock[MAXPATHLEN]; static int reallydoit = 1; @@ -77,8 +162,6 @@ static int set_zone_utc(void); struct continent { dialogMenuItem *menu; int nitems; - int ch; - int sc; }; static struct continent africa, america, antarctica, arctic, asia, atlantic; @@ -98,7 +181,7 @@ static struct continent_names { { "Europe", &europe }, { "Indian", &indian }, { "Pacific", &pacific }, - { "UTC", &utc } + { "UTC", &utc } }; static struct continent_items { @@ -134,7 +217,7 @@ continent_country_menu(dialogMenuItem *continent) int rv; if (strcmp(continent->title, "UTC") == 0) - return set_zone_utc(); + return set_zone_utc(); /* Short cut -- if there's only one country, don't post a menu. */ if (contp->nitems == 1) @@ -152,8 +235,8 @@ continent_country_menu(dialogMenuItem *continent) } menulen = contp->nitems < 16 ? contp->nitems : 16; - rv = dialog_menu(title, prompt, -1, -1, menulen, -contp->nitems, - contp->menu, 0, &contp->ch, &contp->sc); + rv = xdialog_menu(title, prompt, -1, -1, menulen, contp->nitems, + contp->menu); if (rv == 0) return (DITEM_LEAVE_MENU); return (DITEM_RECREATE); @@ -266,7 +349,7 @@ add_zone_to_country(int lineno, const char *tlc, const char *descr, if (tlc[0] < 'A' || tlc[0] > 'Z' || tlc[1] < 'A' || tlc[1] > 'Z') errx(1, "%s:%d: country code `%s' invalid", path_zonetab, lineno, tlc); - + cp = &countries[CODE2INT(tlc)]; if (cp->name == 0) errx(1, "%s:%d: country code `%s' unknown", path_zonetab, @@ -280,7 +363,7 @@ add_zone_to_country(int lineno, const char *tlc, const char *descr, zp = malloc(sizeof(*zp)); if (zp == 0) errx(1, "malloc(%zu)", sizeof(*zp)); - + if (cp->nzones == 0) TAILQ_INIT(&cp->zones); @@ -451,9 +534,7 @@ make_menus(void) memset(dmi, 0, sizeof(*dmi)); asprintf(&dmi->prompt, "%d", ++cp->continent->nitems); dmi->title = cp->name; - dmi->checked = 0; dmi->fire = set_zone_whole_country; - dmi->selected = 0; dmi->data = cp; } else { cp->submenu = malloc(cp->nzones * sizeof(*dmi)); @@ -466,9 +547,7 @@ make_menus(void) memset(dmi, 0, sizeof(*dmi)); asprintf(&dmi->prompt, "%d", ++cp->nzones); dmi->title = zp->descr; - dmi->checked = 0; dmi->fire = set_zone_multi; - dmi->selected = 0; dmi->data = zp; for (zp2 = TAILQ_FIRST(&cp->zones); @@ -482,9 +561,7 @@ make_menus(void) memset(dmi, 0, sizeof(*dmi)); asprintf(&dmi->prompt, "%d", ++cont->nitems); dmi->title = cp->name; - dmi->checked = 0; dmi->fire = set_zone_menu; - dmi->selected = 0; dmi->data = cp; } } @@ -503,8 +580,8 @@ set_zone_menu(dialogMenuItem *dmi) snprintf(prompt, sizeof(prompt), "Select a zone which observes the same time as your locality."); menulen = cp->nzones < 16 ? cp->nzones : 16; - rv = dialog_menu(title, prompt, -1, -1, menulen, -cp->nzones, - cp->submenu, 0, 0, 0); + rv = xdialog_menu(title, prompt, -1, -1, menulen, cp->nzones, + cp->submenu); if (rv != 0) return (DITEM_RECREATE); return (DITEM_LEAVE_MENU); @@ -515,7 +592,7 @@ set_zone_utc(void) { if (!confirm_zone(NULL)) return (DITEM_FAILURE | DITEM_RECREATE); - + return (install_zoneinfo_file(NULL)); } @@ -559,7 +636,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Could not delete %s: %s", path_localtime, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); @@ -571,7 +648,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Could not delete %s: %s", path_db, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); @@ -579,7 +656,7 @@ install_zoneinfo_file(const char *zoneinfo_file) } return (DITEM_LEAVE_MENU); } - + if (copymode) { fd1 = open(zoneinfo_file, O_RDONLY, 0); if (fd1 < 0) { @@ -588,7 +665,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Could not open %s: %s", zoneinfo_file, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); @@ -603,7 +680,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Could not open %s: %s", path_localtime, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); @@ -619,7 +696,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Error copying %s to %s %s", zoneinfo_file, path_localtime, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); /* Better to leave none than a corrupt one. */ @@ -635,7 +712,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Cannot access %s: %s", zoneinfo_file, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); @@ -648,7 +725,7 @@ install_zoneinfo_file(const char *zoneinfo_file) path_localtime, zoneinfo_file, strerror(errno)); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); @@ -667,7 +744,7 @@ install_zoneinfo_file(const char *zoneinfo_file) "Created symbolic link from %s to %s", zoneinfo_file, path_localtime); if (usedialog) - dialog_mesgbox(title, prompt, 8, 72); + dialog_msgbox(title, prompt, 8, 72, 1); else fprintf(stderr, "%s\n", prompt); #endif @@ -701,7 +778,7 @@ confirm_zone(const char *filename) time_t t = time(0); struct tm *tm; int rv; - + setenv("TZ", filename == NULL ? "" : filename, 1); tzset(); tm = localtime(&t); @@ -748,12 +825,6 @@ usage(void) exit(1); } -#if defined(__sparc64__) -#define DIALOG_UTC dialog_yesno -#else -#define DIALOG_UTC dialog_noyes -#endif - int main(int argc, char **argv) { @@ -858,15 +929,24 @@ main(int argc, char **argv) /* FALLTHROUGH */ } - init_dialog(); + init_dialog(stdin, stdout); if (skiputc == 0) { + DIALOG_VARS save_vars; + int yesno; + snprintf(title, sizeof(title), "Select local or UTC (Greenwich Mean Time) clock"); snprintf(prompt, sizeof(prompt), "Is this machine's CMOS clock set to UTC? " "If it is set to local time,\n" "or you don't know, please choose NO here!"); - if (!DIALOG_UTC(title, prompt, 7, 72)) { + dlg_save_vars(&save_vars); +#if !defined(__sparc64__) + dialog_vars.defaultno = TRUE; +#endif + yesno = dialog_yesno(title, prompt, 7, 73); + dlg_restore_vars(&save_vars); + if (!yesno) { if (reallydoit) unlink(path_wall_cmos_clock); } else { @@ -882,7 +962,7 @@ main(int argc, char **argv) close(fd); } } - dialog_clear_norefresh(); + dlg_clear(); } if (optind == argc - 1) { snprintf(title, sizeof(title), "Default timezone provided"); @@ -890,18 +970,18 @@ main(int argc, char **argv) "\nUse the default `%s' zone?", argv[optind]); if (!dialog_yesno(title, prompt, 7, 72)) { rv = install_zoneinfo_file(argv[optind]); - dialog_clear(); + dlg_clear(); end_dialog(); exit(rv & ~DITEM_LEAVE_MENU); } - dialog_clear_norefresh(); + dlg_clear(); } snprintf(title, sizeof(title), "Time Zone Selector"); snprintf(prompt, sizeof(prompt), "Select a region"); - dialog_menu(title, prompt, -1, -1, NCONTINENTS, -NCONTINENTS, - continents, 0, NULL, NULL); + xdialog_menu(title, prompt, -1, -1, NCONTINENTS, NCONTINENTS, + continents); - dialog_clear(); + dlg_clear(); end_dialog(); return (0); } |