1
/* SmoothWall setup program.
3
* This program is distributed under the terms of the GNU General Public
4
* Licence. See the file COPYING for details.
6
* (c) Lawrence Manning, 2001
7
* Stuff for setting the timezone.
9
* $Id: timezone.c,v 1.4.2.1 2004/04/14 22:05:41 gespinasse Exp $
22
#define MAX_FILENAMES 5000
23
#define ZONEFILES "/usr/share/zoneinfo/posix"
25
static int filenamecount;
26
static char *filenames[MAX_FILENAMES];
27
static char *displaynames[MAX_FILENAMES];
29
static int process(char *prefix, char *path);
30
static int cmp(const void *s1, const void *s2);
32
int handletimezone(void)
37
struct keyvalue *kv = initkeyvalues();
40
char timezone[STRING_SIZE];
44
process(ZONEFILES, "");
45
filenames[filenamecount] = NULL;
46
qsort(filenames, filenamecount, sizeof(char *), cmp);
48
for (c = 0; filenames[c]; c++)
50
displaynames[c] = malloc(STRING_SIZE);
51
if ((temp = strstr(filenames[c], ZONEFILES)))
52
strcpy(displaynames[c], temp + strlen(ZONEFILES) + 1);
54
strcpy(displaynames[c], filenames[c]);
56
displaynames[c] = NULL;
58
if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
61
errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
65
strcpy(timezone, ZONEFILES "/Europe/Berlin");
66
findkey(kv, "TIMEZONE", timezone);
69
for (c = 0; filenames[c]; c++)
71
if (strcmp(timezone, filenames[c]) == 0)
75
rc = newtWinMenu(ctr[TR_TIMEZONE], ctr[TR_TIMEZONE_LONG], 50, 5, 5, 6, displaynames, &choice,
76
ctr[TR_OK], ctr[TR_CANCEL], NULL);
78
strcpy(timezone, filenames[choice]);
82
replacekeyvalue(kv, "TIMEZONE", timezone);
83
writekeyvalues(kv, CONFIG_ROOT "/main/settings");
84
unlink("/etc/localtime");
85
link(timezone, "/etc/localtime");
91
for (c = 0; filenames[c]; c++)
94
free(displaynames[c]);
101
static int process(char *prefix, char *path)
105
char newpath[PATH_MAX];
107
snprintf(newpath, PATH_MAX, "%s%s", prefix, path);
109
if (!(dir = opendir(newpath)))
111
if (filenamecount > MAX_FILENAMES)
114
filenames[filenamecount] = (char *) strdup(newpath);
119
while ((de = readdir(dir)))
121
if (de->d_name[0] == '.') continue;
122
snprintf(newpath, PATH_MAX, "%s/%s", path, de->d_name);
123
process(prefix, newpath);
130
/* Small wrapper for use with qsort(). */
131
static int cmp(const void *s1, const void *s2)
133
return (strcmp(* (char **) s1, * (char **) s2));