Another round of fixes:

. Replace my NIH-suffering code to detect the number of lines on
  the terminal by the curses variable LINES.

. Fix the selection code for countries with more than one screenful
  of locations.  The very few people living in America/US/Pacific
  now won't be charged for Indiana any longer... :)

. Removed the gross code that copied over the timezone file to
  /etc/localtime, and create a symlink now instead.
This commit is contained in:
joerg 1996-03-31 09:55:02 +00:00
parent 14c8c2c164
commit 3924abebea
2 changed files with 35 additions and 60 deletions

View File

@ -28,8 +28,10 @@
*/
static const char rcsid[] =
"$Id: main.c,v 1.4 1995/10/06 02:46:23 jkh Exp $";
"$Id: main.c,v 1.5 1996/03/22 22:22:38 joerg Exp $";
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <ncurses.h>
#include <dialog.h>
@ -206,7 +208,22 @@ setzone(const char *zone)
struct tm *tm;
char msg[_POSIX2_LINE_MAX];
int rv;
FILE *ifp, *ofp;
struct stat sb;
/*
* Make sure the definition file does exist before clobbering
* an existing PATH_LOCALTIME. We do this before evaluating
* locatlime below, since a missing zoneinfo file would result
* in nothing but garbage in the displayed time information.
*/
snprintf(msg, sizeof msg, PATH_ZONEINFO "/%s", zone);
if (stat(msg, &sb) == -1) {
snprintf(msg, sizeof msg,
"Could not find definition file\n"
PATH_ZONEINFO "/%s", zone);
dialog_notify(msg);
return 1;
}
snprintf(msg, sizeof msg, "TZ=%s", zone);
putenv(msg);
@ -226,46 +243,13 @@ setzone(const char *zone)
return 1;
snprintf(msg, sizeof msg, PATH_ZONEINFO "/%s", zone);
ifp = fopen(msg, "r");
if (!ifp) {
snprintf(msg, sizeof msg,
"Could not open " PATH_ZONEINFO "/%s: %s",
zone, strerror(errno));
dialog_notify(msg);
(void)unlink(PATH_LOCALTIME);
if (symlink(msg, PATH_LOCALTIME) == -1) {
dialog_notify("Could not create a symbolic link for "
PATH_LOCALTIME);
return 1;
}
ofp = fopen(PATH_LOCALTIME, "w");
if (!ofp) {
snprintf(msg, sizeof msg, "Could not open " PATH_LOCALTIME
": %s", strerror(errno));
dialog_notify(msg);
fclose(ifp);
return 1;
}
while((rv = fread(msg, 1, sizeof msg, ifp)) > 0) {
int rv2;
if((rv2 = fwrite(msg, 1, rv, ofp)) != rv) {
snprintf(msg, sizeof msg,
"Could not write " PATH_LOCALTIME ": %s",
strerror(errno));
out:
dialog_notify(msg);
fclose(ifp);
fclose(ofp);
unlink(PATH_LOCALTIME);
return 1;
}
}
if (rv < 0) {
snprintf(msg, sizeof msg, "Could not read timezone file: %s",
strerror(errno));
goto out;
}
fclose(ifp);
fclose(ofp);
snprintf(msg, sizeof msg, "Installed timezone file %s", zone);
dialog_notify(msg);
return 0;

View File

@ -28,7 +28,7 @@
*/
static const char rcsid[] =
"$Id: tzmenu.c,v 1.2 1995/05/30 03:52:50 rgrimes Exp $";
"$Id: tzmenu.c,v 1.3 1996/03/22 22:22:40 joerg Exp $";
#include <stdio.h>
#include <ncurses.h>
@ -62,8 +62,6 @@ static struct region *regions[] = {
&Pacific
};
static unsigned short nrows;
#define NREGIONS 8
#define DEFAULT_NROWS 24 /* default height of tty */
@ -80,14 +78,6 @@ tzmenu(void)
struct winsize win;
char *cp;
if (isatty(fileno(stdin)) &&
ioctl(fileno(stdin), TIOCGWINSZ, &win) != -1)
nrows = win.ws_row;
else if ((cp = getenv("LINES")))
nrows = atoi(cp);
if (nrows == 0)
nrows = DEFAULT_NROWS;
while(1) {
dialog_clear();
rv = dialog_menu("Timezone Selector",
@ -131,11 +121,11 @@ country_menu(const struct region *reg, const char *name)
while(1) {
dialog_clear();
rv = dialog_menu(title, "Select a country",
reg->r_count > nrows - 6 ?
nrows : reg->r_count + 6,
reg->r_count > LINES - 6 ?
LINES : reg->r_count + 6,
78,
reg->r_count > nrows - 6 ?
nrows - 6 : reg->r_count,
reg->r_count > LINES - 6 ?
LINES - 6 : reg->r_count,
reg->r_count,
(unsigned char **)reg->r_menu,
rbuf,
@ -172,11 +162,11 @@ location_menu(const struct country *ctry, const char *name)
while(1) {
dialog_clear();
rv = dialog_menu(title, "Select a location",
ctry->c_count > nrows - 6?
nrows : ctry->c_count + 6,
ctry->c_count > LINES - 6?
LINES : ctry->c_count + 6,
78,
ctry->c_count > nrows - 6?
nrows - 6 : ctry->c_count,
ctry->c_count > LINES - 6?
LINES - 6 : ctry->c_count,
ctry->c_count,
(unsigned char **)ctry->c_menu,
rbuf,
@ -188,11 +178,12 @@ location_menu(const struct country *ctry, const char *name)
return 0;
}
sscanf(rbuf, "%d", &rv);
rv = setzone(ctry->c_filelist[item]);
rv = setzone(ctry->c_filelist[rv - 1]);
if (rv == 0)
return ctry->c_filelist[item];
return ctry->c_filelist[rv - 1];
}
}