- Replace rcsid with __FBSDID.

- Remove paths.h and embed it in the source.
- Remove stale alpha support.
- Clean up compiler warnings and fix style(9) bugs.
This commit is contained in:
jkim 2008-06-03 22:34:52 +00:00
parent fff7b55e87
commit 4915a1e29c
2 changed files with 259 additions and 239 deletions

View File

@ -1,5 +0,0 @@
#define _PATH_ZONETAB "/usr/share/zoneinfo/zone.tab"
#define _PATH_ISO3166 "/usr/share/misc/iso3166"
#define _PATH_ZONEINFO "/usr/share/zoneinfo"
#define _PATH_LOCALTIME "/etc/localtime"
#define _PATH_WALL_CMOS_CLOCK "/etc/wall_cmos_clock"

View File

@ -12,7 +12,7 @@
* no representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied
* warranty.
*
*
* THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
* ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
@ -32,12 +32,9 @@
* files provided in newer tzdata releases.
*/
#ifndef lint
static const char rcsid[] =
"$FreeBSD$";
#endif /* not lint */
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <dialog.h>
#include <err.h>
#include <errno.h>
@ -51,109 +48,125 @@ static const char rcsid[] =
#include <sys/queue.h>
#include <sys/stat.h>
#include "paths.h"
#define _PATH_ZONETAB "/usr/share/zoneinfo/zone.tab"
#define _PATH_ISO3166 "/usr/share/misc/iso3166"
#define _PATH_ZONEINFO "/usr/share/zoneinfo"
#define _PATH_LOCALTIME "/etc/localtime"
#define _PATH_WALL_CMOS_CLOCK "/etc/wall_cmos_clock"
static int reallydoit = 1;
static int continent_country_menu(dialogMenuItem *);
static int set_zone_multi(dialogMenuItem *);
static int set_zone_whole_country(dialogMenuItem *);
static int set_zone_menu(dialogMenuItem *);
static void usage(void);
static int continent_country_menu(dialogMenuItem *);
static int set_zone_multi(dialogMenuItem *);
static int set_zone_whole_country(dialogMenuItem *);
static int set_zone_menu(dialogMenuItem *);
struct continent {
dialogMenuItem *menu;
int nitems;
int ch;
int sc;
int nitems;
int ch;
int sc;
};
static struct continent africa, america, antarctica, arctic, asia, atlantic;
static struct continent australia, europe, indian, pacific;
static struct continent africa, america, antarctica, arctic, asia, atlantic;
static struct continent australia, europe, indian, pacific;
static struct continent_names {
char *name;
const char *name;
struct continent *continent;
} continent_names[] = {
{ "Africa", &africa }, { "America", &america },
{ "Antarctica", &antarctica }, { "Arctic", &arctic },
{ "Asia", &asia },
{ "Atlantic", &atlantic }, { "Australia", &australia },
{ "Europe", &europe }, { "Indian", &indian }, { "Pacific", &pacific }
{ "Africa", &africa },
{ "America", &america },
{ "Antarctica", &antarctica },
{ "Arctic", &arctic },
{ "Asia", &asia },
{ "Atlantic", &atlantic },
{ "Australia", &australia },
{ "Europe", &europe },
{ "Indian", &indian },
{ "Pacific", &pacific }
};
static dialogMenuItem continents[] = {
{ "1", "Africa", 0, continent_country_menu, 0, &africa },
{ "2", "America -- North and South", 0, continent_country_menu, 0,
&america },
{ "3", "Antarctica", 0, continent_country_menu, 0, &antarctica },
{ "4", "Arctic Ocean", 0, continent_country_menu, 0, &arctic },
{ "5", "Asia", 0, continent_country_menu, 0, &asia },
{ "6", "Atlantic Ocean", 0, continent_country_menu, 0, &atlantic },
{ "7", "Australia", 0, continent_country_menu, 0, &australia },
{ "8", "Europe", 0, continent_country_menu, 0, &europe },
{ "9", "Indian Ocean", 0, continent_country_menu, 0, &indian },
{ "0", "Pacific Ocean", 0, continent_country_menu, 0, &pacific }
static struct continent_items {
char prompt[2];
char title[30];
} continent_items[] = {
{ "1", "Africa" },
{ "2", "America -- North and South" },
{ "3", "Antarctica" },
{ "4", "Arctic Ocean" },
{ "5", "Asia" },
{ "6", "Atlantic Ocean" },
{ "7", "Australia" },
{ "8", "Europe" },
{ "9", "Indian Ocean" },
{ "0", "Pacific Ocean" }
};
#define NCONTINENTS (int)((sizeof continents)/(sizeof continents[0]))
#define OCEANP(x) ((x) == 3 || (x) == 5 || (x) == 8 || (x) == 9)
#define NCONTINENTS \
(int)((sizeof(continent_items)) / (sizeof(continent_items[0])))
static dialogMenuItem continents[NCONTINENTS];
#define OCEANP(x) ((x) == 3 || (x) == 5 || (x) == 8 || (x) == 9)
static int
continent_country_menu(dialogMenuItem *continent)
{
int rv;
char title[64], prompt[64];
struct continent *contp = continent->data;
char title[256];
int isocean = OCEANP(continent - continents);
int menulen;
int isocean = OCEANP(continent - continents);
int menulen;
int rv;
/* Short cut -- if there's only one country, don't post a menu. */
if (contp->nitems == 1)
return (contp->menu[0].fire(&contp->menu[0]));
/* It's amazing how much good grammar really matters... */
if (!isocean)
snprintf(title, sizeof title, "Countries in %s",
continent->title);
else
snprintf(title, sizeof title, "Islands and groups in the %s",
continent->title);
if (!isocean) {
snprintf(title, sizeof(title), "Countries in %s",
continent->title);
snprintf(prompt, sizeof(prompt), "Select a country or region");
} else {
snprintf(title, sizeof(title), "Islands and groups in the %s",
continent->title);
snprintf(prompt, sizeof(prompt), "Select an island or group");
}
menulen = contp->nitems < 16 ? contp->nitems : 16;
rv = dialog_menu(title, (isocean ? "Select an island or group"
: "Select a country or region"), -1, -1, menulen,
-contp->nitems, contp->menu, 0, &contp->ch,
&contp->sc);
rv = dialog_menu(title, prompt, -1, -1, menulen, -contp->nitems,
contp->menu, 0, &contp->ch, &contp->sc);
if (rv == 0)
return DITEM_LEAVE_MENU;
return DITEM_RECREATE;
return (DITEM_LEAVE_MENU);
return (DITEM_RECREATE);
}
static struct continent *
find_continent(const char *name)
{
int i;
int i;
for (i = 0; i < NCONTINENTS; i++) {
for (i = 0; i < NCONTINENTS; i++)
if (strcmp(name, continent_names[i].name) == 0)
return continent_names[i].continent;
}
return 0;
return (continent_names[i].continent);
return (0);
}
struct country {
char *name;
char *tlc;
int nzones;
char *filename; /* use iff nzones < 0 */
struct continent *continent; /* use iff nzones < 0 */
TAILQ_HEAD(, zone) zones; /* use iff nzones > 0 */
dialogMenuItem *submenu; /* use iff nzones > 0 */
char *name;
char *tlc;
int nzones;
char *filename; /* use iff nzones < 0 */
struct continent *continent; /* use iff nzones < 0 */
TAILQ_HEAD(, zone) zones; /* use iff nzones > 0 */
dialogMenuItem *submenu; /* use iff nzones > 0 */
};
struct zone {
TAILQ_ENTRY(zone) link;
char *descr;
char *filename;
char *descr;
char *filename;
struct continent *continent;
};
@ -162,9 +175,10 @@ struct zone {
* of the two-letter variety, so we just size this array to suit.
* Beats worrying about dynamic allocation.
*/
#define NCOUNTRIES (26*26)
#define NCOUNTRIES (26 * 26)
static struct country countries[NCOUNTRIES];
#define CODE2INT(s) ((s[0] - 'A') * 26 + (s[1] - 'A'))
#define CODE2INT(s) ((s[0] - 'A') * 26 + (s[1] - 'A'))
/*
* Read the ISO 3166 country code database in _PATH_ISO3166
@ -173,11 +187,11 @@ static struct country countries[NCOUNTRIES];
static void
read_iso3166_table(void)
{
FILE *fp;
char *s, *t, *name;
size_t len;
int lineno;
struct country *cp;
FILE *fp;
struct country *cp;
size_t len;
char *s, *t, *name;
int lineno;
fp = fopen(_PATH_ISO3166, "r");
if (!fp)
@ -198,13 +212,13 @@ read_iso3166_table(void)
errx(1, _PATH_ISO3166 ":%d: invalid format", lineno);
if (t[0] < 'A' || t[0] > 'Z' || t[1] < 'A' || t[1] > 'Z')
errx(1, _PATH_ISO3166 ":%d: invalid code `%s'",
lineno, t);
lineno, t);
/* Now skip past the three-letter and numeric codes. */
name = strsep(&s, "\t"); /* 3-let */
name = strsep(&s, "\t"); /* 3-let */
if (name == 0 || strlen(name) != 3)
errx(1, _PATH_ISO3166 ":%d: invalid format", lineno);
name = strsep(&s, "\t"); /* numeric */
name = strsep(&s, "\t"); /* numeric */
if (name == 0 || strlen(name) != 3)
errx(1, _PATH_ISO3166 ":%d: invalid format", lineno);
@ -212,9 +226,9 @@ read_iso3166_table(void)
cp = &countries[CODE2INT(t)];
if (cp->name)
errx(1, _PATH_ISO3166
":%d: country code `%s' multiply defined: %s",
lineno, t, cp->name);
errx(1, _PATH_ISO3166
":%d: country code `%s' multiply defined: %s",
lineno, t, cp->name);
cp->name = strdup(name);
if (cp->name == NULL)
errx(1, "malloc failed");
@ -228,28 +242,28 @@ read_iso3166_table(void)
static void
add_zone_to_country(int lineno, const char *tlc, const char *descr,
const char *file, struct continent *cont)
const char *file, struct continent *cont)
{
struct zone *zp;
struct country *cp;
struct zone *zp;
struct country *cp;
if (tlc[0] < 'A' || tlc[0] > 'Z' || tlc[1] < 'A' || tlc[1] > 'Z')
errx(1, _PATH_ZONETAB ":%d: country code `%s' invalid",
lineno, tlc);
lineno, tlc);
cp = &countries[CODE2INT(tlc)];
if (cp->name == 0)
errx(1, _PATH_ZONETAB ":%d: country code `%s' unknown",
lineno, tlc);
lineno, tlc);
if (descr) {
if (cp->nzones < 0)
errx(1, _PATH_ZONETAB
":%d: conflicting zone definition", lineno);
errx(1, _PATH_ZONETAB
":%d: conflicting zone definition", lineno);
zp = malloc(sizeof *zp);
zp = malloc(sizeof(*zp));
if (zp == 0)
errx(1, "malloc(%lu)", (unsigned long)sizeof *zp);
errx(1, "malloc(%zu)", sizeof(*zp));
if (cp->nzones == 0)
TAILQ_INIT(&cp->zones);
@ -265,11 +279,11 @@ add_zone_to_country(int lineno, const char *tlc, const char *descr,
cp->nzones++;
} else {
if (cp->nzones > 0)
errx(1, _PATH_ZONETAB
":%d: zone must have description", lineno);
errx(1, _PATH_ZONETAB
":%d: zone must have description", lineno);
if (cp->nzones < 0)
errx(1, _PATH_ZONETAB
":%d: zone multiply defined", lineno);
":%d: zone multiply defined", lineno);
cp->nzones = -1;
cp->filename = strdup(file);
if (cp->filename == NULL)
@ -289,13 +303,13 @@ compare_countries(const void *xa, const void *xb)
const struct country *a = xa, *b = xb;
if (a->name == 0 && b->name == 0)
return 0;
return (0);
if (a->name == 0 && b->name != 0)
return 1;
return (1);
if (b->name == 0)
return -1;
return (-1);
return strcmp(a->name, b->name);
return (strcmp(a->name, b->name));
}
/*
@ -305,19 +319,19 @@ compare_countries(const void *xa, const void *xb)
static void
sort_countries(void)
{
qsort(countries, NCOUNTRIES, sizeof countries[0], compare_countries);
qsort(countries, NCOUNTRIES, sizeof(countries[0]), compare_countries);
}
static void
read_zones(void)
{
FILE *fp;
char *line;
size_t len;
int lineno;
char *tlc, *coord, *file, *descr, *p;
char contbuf[16];
char contbuf[16];
FILE *fp;
struct continent *cont;
size_t len;
char *line, *tlc, *coord, *file, *descr, *p;
int lineno;
fp = fopen(_PATH_ZONETAB, "r");
if (!fp)
@ -335,21 +349,21 @@ read_zones(void)
tlc = strsep(&line, "\t");
if (strlen(tlc) != 2)
errx(1, _PATH_ZONETAB ":%d: invalid country code `%s'",
lineno, tlc);
lineno, tlc);
coord = strsep(&line, "\t");
file = strsep(&line, "\t");
p = strchr(file, '/');
if (p == 0)
errx(1, _PATH_ZONETAB ":%d: invalid zone name `%s'",
lineno, file);
lineno, file);
contbuf[0] = '\0';
strncat(contbuf, file, p - file);
cont = find_continent(contbuf);
if (!cont)
errx(1, _PATH_ZONETAB ":%d: invalid region `%s'",
lineno, contbuf);
lineno, contbuf);
descr = (line && *line) ? line : 0;
descr = (line != NULL && *line != '\0') ? line : NULL;
add_zone_to_country(lineno, tlc, descr, file, cont);
}
@ -359,11 +373,11 @@ read_zones(void)
static void
make_menus(void)
{
struct country *cp;
struct zone *zp, *zp2;
struct country *cp;
struct zone *zp, *zp2;
struct continent *cont;
dialogMenuItem *dmi;
int i;
dialogMenuItem *dmi;
int i;
/*
* First, count up all the countries in each continent/ocean.
@ -380,8 +394,8 @@ make_menus(void)
TAILQ_FOREACH(zp, &cp->zones, link) {
cont = zp->continent;
for (zp2 = TAILQ_FIRST(&cp->zones);
zp2->continent != cont;
zp2 = TAILQ_NEXT(zp2, link))
zp2->continent != cont;
zp2 = TAILQ_NEXT(zp2, link))
;
if (zp2 == zp)
zp->continent->nitems++;
@ -390,17 +404,22 @@ make_menus(void)
}
/*
* Now allocate memory for the country menus. We set
* nitems back to zero so that we can use it for counting
* again when we actually build the menus.
* Now allocate memory for the country menus and initialize
* continent menus. We set nitems back to zero so that we can
* use it for counting again when we actually build the menus.
*/
memset(continents, 0, sizeof(continents));
for (i = 0; i < NCONTINENTS; i++) {
continent_names[i].continent->menu =
malloc(sizeof(dialogMenuItem) *
continent_names[i].continent->nitems);
malloc(sizeof(dialogMenuItem) *
continent_names[i].continent->nitems);
if (continent_names[i].continent->menu == 0)
errx(1, "malloc for continent menu");
continent_names[i].continent->nitems = 0;
continents[i].prompt = continent_items[i].prompt;
continents[i].title = continent_items[i].title;
continents[i].fire = continent_country_menu;
continents[i].data = continent_names[i].continent;
}
/*
@ -413,25 +432,23 @@ make_menus(void)
continue;
if (cp->nzones < 0) {
dmi = &cp->continent->menu[cp->continent->nitems];
memset(dmi, 0, sizeof *dmi);
asprintf(&dmi->prompt, "%d",
++cp->continent->nitems);
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);
cp->submenu = malloc(cp->nzones * sizeof(*dmi));
if (cp->submenu == 0)
errx(1, "malloc for submenu");
cp->nzones = 0;
TAILQ_FOREACH(zp, &cp->zones, link) {
cont = zp->continent;
dmi = &cp->submenu[cp->nzones];
memset(dmi, 0, sizeof *dmi);
asprintf(&dmi->prompt, "%d",
++cp->nzones);
memset(dmi, 0, sizeof(*dmi));
asprintf(&dmi->prompt, "%d", ++cp->nzones);
dmi->title = zp->descr;
dmi->checked = 0;
dmi->fire = set_zone_multi;
@ -439,14 +456,14 @@ make_menus(void)
dmi->data = zp;
for (zp2 = TAILQ_FIRST(&cp->zones);
zp2->continent != cont;
zp2 = TAILQ_NEXT(zp2, link))
zp2->continent != cont;
zp2 = TAILQ_NEXT(zp2, link))
;
if (zp2 != zp)
continue;
dmi = &cont->menu[cont->nitems];
memset(dmi, 0, sizeof *dmi);
memset(dmi, 0, sizeof(*dmi));
asprintf(&dmi->prompt, "%d", ++cont->nitems);
dmi->title = cp->name;
dmi->checked = 0;
@ -461,192 +478,195 @@ make_menus(void)
static int
set_zone_menu(dialogMenuItem *dmi)
{
int rv;
char buf[256];
struct country *cp = dmi->data;
int menulen;
char title[64], prompt[64];
struct country *cp = dmi->data;
int menulen;
int rv;
snprintf(buf, sizeof buf, "%s Time Zones", cp->name);
snprintf(title, sizeof(title), "%s Time Zones", cp->name);
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(buf, "Select a zone which observes the same time as "
"your locality.", -1, -1, menulen, -cp->nzones,
cp->submenu, 0, 0, 0);
rv = dialog_menu(title, prompt, -1, -1, menulen, -cp->nzones,
cp->submenu, 0, 0, 0);
if (rv != 0)
return DITEM_RECREATE;
return DITEM_LEAVE_MENU;
return (DITEM_RECREATE);
return (DITEM_LEAVE_MENU);
}
static int
install_zone_file(const char *filename)
{
struct stat sb;
int fd1, fd2;
int copymode;
char *msg;
ssize_t len;
char buf[1024];
char buf[1024];
char title[64], prompt[64];
struct stat sb;
ssize_t len;
int fd1, fd2, copymode;
if (lstat(_PATH_LOCALTIME, &sb) < 0)
if (lstat(_PATH_LOCALTIME, &sb) < 0) {
/* Nothing there yet... */
copymode = 1;
else if(S_ISLNK(sb.st_mode))
} else if (S_ISLNK(sb.st_mode))
copymode = 0;
else
copymode = 1;
#ifdef VERBOSE
if (copymode)
asprintf(&msg, "Copying %s to " _PATH_LOCALTIME, filename);
snprintf(prompt, sizeof(prompt),
"Copying %s to " _PATH_LOCALTIME, filename);
else
asprintf(&msg, "Creating symbolic link " _PATH_LOCALTIME
" to %s", filename);
dialog_notify(msg);
free(msg);
snprintf(prompt, sizeof(prompt),
"Creating symbolic link " _PATH_LOCALTIME " to %s",
filename);
dialog_notify(prompt);
#endif
if (reallydoit) {
if (copymode) {
fd1 = open(filename, O_RDONLY, 0);
if (fd1 < 0) {
asprintf(&msg, "Could not open %s: %s",
filename, strerror(errno));
dialog_mesgbox("Error", msg, 8, 72);
free(msg);
return DITEM_FAILURE | DITEM_RECREATE;
snprintf(title, sizeof(title), "Error");
snprintf(prompt, sizeof(prompt),
"Could not open %s: %s", filename,
strerror(errno));
dialog_mesgbox(title, prompt, 8, 72);
return (DITEM_FAILURE | DITEM_RECREATE);
}
unlink(_PATH_LOCALTIME);
fd2 = open(_PATH_LOCALTIME,
O_CREAT|O_EXCL|O_WRONLY,
S_IRUSR|S_IRGRP|S_IROTH);
fd2 = open(_PATH_LOCALTIME, O_CREAT | O_EXCL | O_WRONLY,
S_IRUSR | S_IRGRP | S_IROTH);
if (fd2 < 0) {
asprintf(&msg, "Could not open "
_PATH_LOCALTIME ": %s",
strerror(errno));
dialog_mesgbox("Error", msg, 8, 72);
free(msg);
return DITEM_FAILURE | DITEM_RECREATE;
snprintf(title, sizeof(title), "Error");
snprintf(prompt, sizeof(prompt),
"Could not open " _PATH_LOCALTIME ": %s",
strerror(errno));
dialog_mesgbox(title, prompt, 8, 72);
return (DITEM_FAILURE | DITEM_RECREATE);
}
while ((len = read(fd1, buf, sizeof buf)) > 0)
while ((len = read(fd1, buf, sizeof(buf))) > 0)
len = write(fd2, buf, len);
if (len == -1) {
asprintf(&msg, "Error copying %s to "
_PATH_LOCALTIME ": %s",
filename, strerror(errno));
dialog_mesgbox("Error", msg, 8, 72);
free(msg);
snprintf(title, sizeof(title), "Error");
snprintf(prompt, sizeof(prompt),
"Error copying %s to " _PATH_LOCALTIME
": %s", filename, strerror(errno));
dialog_mesgbox(title, prompt, 8, 72);
/* Better to leave none than a corrupt one. */
unlink(_PATH_LOCALTIME);
return DITEM_FAILURE | DITEM_RECREATE;
return (DITEM_FAILURE | DITEM_RECREATE);
}
close(fd1);
close(fd2);
} else {
if (access(filename, R_OK) != 0) {
asprintf(&msg, "Cannot access %s: %s",
filename, strerror(errno));
dialog_mesgbox("Error", msg, 8, 72);
free(msg);
return DITEM_FAILURE | DITEM_RECREATE;
snprintf(title, sizeof(title), "Error");
snprintf(prompt, sizeof(prompt),
"Cannot access %s: %s", filename,
strerror(errno));
dialog_mesgbox(title, prompt, 8, 72);
return (DITEM_FAILURE | DITEM_RECREATE);
}
unlink(_PATH_LOCALTIME);
if (symlink(filename, _PATH_LOCALTIME) < 0) {
asprintf(&msg, "Cannot create symbolic link "
_PATH_LOCALTIME " to %s: %s",
filename, strerror(errno));
dialog_mesgbox("Error", msg, 8, 72);
free(msg);
return DITEM_FAILURE | DITEM_RECREATE;
snprintf(title, sizeof(title), "Error");
snprintf(prompt, sizeof(prompt),
"Cannot create symbolic link "
_PATH_LOCALTIME " to %s: %s", filename,
strerror(errno));
dialog_mesgbox(title, prompt, 8, 72);
return (DITEM_FAILURE | DITEM_RECREATE);
}
}
}
#ifdef VERBOSE
snprintf(title, sizeof(title), "Done");
if (copymode)
asprintf(&msg, "Copied timezone file from %s to "
_PATH_LOCALTIME, filename);
snprintf(prompt, sizeof(prompt),
"Copied timezone file from %s to " _PATH_LOCALTIME,
filename);
else
asprintf(&msg, "Created symbolic link from " _PATH_LOCALTIME
" to %s", filename);
dialog_mesgbox("Done", msg, 8, 72);
free(msg);
snprintf(prompt, sizeof(prompt), "Created symbolic link from "
_PATH_LOCALTIME " to %s", filename);
dialog_mesgbox(title, prompt, 8, 72);
#endif
return DITEM_LEAVE_MENU;
return (DITEM_LEAVE_MENU);
}
static int
confirm_zone(const char *filename)
{
char *msg;
struct tm *tm;
time_t t = time(0);
int rv;
char title[64], prompt[64];
time_t t = time(0);
struct tm *tm;
int rv;
setenv("TZ", filename, 1);
tzset();
tm = localtime(&t);
asprintf(&msg, "Does the abbreviation `%s' look reasonable?",
tm->tm_zone);
rv = !dialog_yesno("Confirmation", msg, 5, 72);
free(msg);
return rv;
snprintf(title, sizeof(title), "Confirmation");
snprintf(prompt, sizeof(prompt),
"Does the abbreviation `%s' look reasonable?", tm->tm_zone);
rv = !dialog_yesno(title, prompt, 5, 72);
return (rv);
}
static int
set_zone_multi(dialogMenuItem *dmi)
{
char *fn;
struct zone *zp = dmi->data;
int rv;
struct zone *zp = dmi->data;
char *fn;
int rv;
if (!confirm_zone(zp->filename))
return DITEM_FAILURE | DITEM_RECREATE;
return (DITEM_FAILURE | DITEM_RECREATE);
asprintf(&fn, "%s/%s", _PATH_ZONEINFO, zp->filename);
rv = install_zone_file(fn);
free(fn);
return rv;
return (rv);
}
static int
set_zone_whole_country(dialogMenuItem *dmi)
{
char *fn;
struct country *cp = dmi->data;
int rv;
struct country *cp = dmi->data;
char *fn;
int rv;
if (!confirm_zone(cp->filename))
return DITEM_FAILURE | DITEM_RECREATE;
return (DITEM_FAILURE | DITEM_RECREATE);
asprintf(&fn, "%s/%s", _PATH_ZONEINFO, cp->filename);
rv = install_zone_file(fn);
free(fn);
return rv;
return (rv);
}
static void
usage()
usage(void)
{
fprintf(stderr, "usage: tzsetup [-n]\n");
exit(1);
}
#if defined(__sparc64__)
#define DIALOG_UTC dialog_yesno
#else
#define DIALOG_UTC dialog_noyes
#endif
int
main(int argc, char **argv)
{
int c, fd;
int (*dialog_utc)(unsigned char *, unsigned char *, int, int);
#if defined(__alpha__) || defined(__sparc64__)
dialog_utc = dialog_yesno;
#else
dialog_utc = dialog_noyes;
#endif
char title[64], prompt[128];
int c, fd;
while ((c = getopt(argc, argv, "n")) != -1) {
switch(c) {
@ -663,24 +683,28 @@ main(int argc, char **argv)
usage();
/* Override the user-supplied umask. */
(void)umask(S_IWGRP|S_IWOTH);
(void)umask(S_IWGRP | S_IWOTH);
read_iso3166_table();
read_zones();
sort_countries();
make_menus();
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!");
init_dialog();
if (!dialog_utc("Select local or UTC (Greenwich Mean Time) clock",
"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!", 7, 72)) {
if (!DIALOG_UTC(title, prompt, 7, 72)) {
if (reallydoit)
unlink(_PATH_WALL_CMOS_CLOCK);
} else {
if (reallydoit) {
fd = open(_PATH_WALL_CMOS_CLOCK,
O_WRONLY|O_CREAT|O_TRUNC,
S_IRUSR|S_IRGRP|S_IROTH);
O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IRGRP | S_IROTH);
if (fd < 0)
err(1, "create %s", _PATH_WALL_CMOS_CLOCK);
close(fd);
@ -688,22 +712,23 @@ main(int argc, char **argv)
}
dialog_clear_norefresh();
if (optind == argc - 1) {
char *msg;
asprintf(&msg, "\nUse the default `%s' zone?", argv[optind]);
if (!dialog_yesno("Default timezone provided", msg, 7, 72)) {
snprintf(title, sizeof(title), "Default timezone provided");
snprintf(prompt, sizeof(prompt),
"\nUse the default `%s' zone?", argv[optind]);
if (!dialog_yesno(title, prompt, 7, 72)) {
install_zone_file(argv[optind]);
dialog_clear();
end_dialog();
return 0;
return (0);
}
free(msg);
dialog_clear_norefresh();
}
dialog_menu("Time Zone Selector", "Select a region", -1, -1,
NCONTINENTS, -NCONTINENTS, continents, 0, NULL, NULL);
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);
dialog_clear();
end_dialog();
return 0;
return (0);
}