]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blame - src/install+setup/setup/timezone.c
Setup weiter ausgebaut.
[people/teissler/ipfire-2.x.git] / src / install+setup / setup / timezone.c
CommitLineData
cd1a2927
MT
1/* SmoothWall setup program.\r
2 *\r
3 * This program is distributed under the terms of the GNU General Public\r
4 * Licence. See the file COPYING for details.\r
5 *\r
6 * (c) Lawrence Manning, 2001\r
7 * Stuff for setting the timezone.\r
8 * \r
9 * $Id: timezone.c,v 1.4.2.1 2004/04/14 22:05:41 gespinasse Exp $\r
10 * \r
11 */\r
12\r
13#include "setup.h"\r
14 \r
15extern FILE *flog;\r
16extern char *mylog;\r
17\r
18extern char **ctr;\r
19\r
20extern int automode;\r
21\r
22#define MAX_FILENAMES 5000\r
23#define ZONEFILES "/usr/share/zoneinfo/posix"\r
24\r
25static int filenamecount;\r
26static char *filenames[MAX_FILENAMES];\r
27static char *displaynames[MAX_FILENAMES];\r
28\r
29static int process(char *prefix, char *path);\r
30static int cmp(const void *s1, const void *s2);\r
31\r
32int handletimezone(void)\r
33{\r
34 int c;\r
35 int choice;\r
36 char *temp;\r
37 struct keyvalue *kv = initkeyvalues(); \r
38 int rc;\r
39 int result;\r
40 char timezone[STRING_SIZE];\r
41\r
42 filenamecount = 0; \r
43\r
44 process(ZONEFILES, "");\r
45 filenames[filenamecount] = NULL;\r
46 qsort(filenames, filenamecount, sizeof(char *), cmp);\r
47 \r
48 for (c = 0; filenames[c]; c++)\r
49 {\r
50 displaynames[c] = malloc(STRING_SIZE);\r
51 if ((temp = strstr(filenames[c], ZONEFILES)))\r
52 strcpy(displaynames[c], temp + strlen(ZONEFILES) + 1);\r
53 else\r
54 strcpy(displaynames[c], filenames[c]);\r
55 }\r
56 displaynames[c] = NULL;\r
57 \r
58 if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))\r
59 {\r
60 freekeyvalues(kv);\r
61 errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
62 return 0;\r
63 } \r
64 \r
1217aa01 65 strcpy(timezone, ZONEFILES "/Europe/Berlin");\r
cd1a2927
MT
66 findkey(kv, "TIMEZONE", timezone);\r
67 \r
68 choice = 0;\r
69 for (c = 0; filenames[c]; c++)\r
70 {\r
71 if (strcmp(timezone, filenames[c]) == 0)\r
72 choice = c;\r
73 }\r
74 \r
75 rc = newtWinMenu(ctr[TR_TIMEZONE], ctr[TR_TIMEZONE_LONG], 50, 5, 5, 6, displaynames, &choice,\r
76 ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
77\r
78 strcpy(timezone, filenames[choice]);\r
79 \r
80 if (rc != 2)\r
81 {\r
82 replacekeyvalue(kv, "TIMEZONE", timezone);\r
83 writekeyvalues(kv, CONFIG_ROOT "/main/settings");\r
84 unlink("/etc/localtime");\r
85 link(timezone, "/etc/localtime");\r
86 result = 1;\r
87 }\r
88 else\r
89 result = 0; \r
90 \r
91 for (c = 0; filenames[c]; c++)\r
92 {\r
93 free(filenames[c]);\r
94 free(displaynames[c]);\r
95 }\r
96 freekeyvalues(kv); \r
97 \r
98 return result;\r
99}\r
100\r
101static int process(char *prefix, char *path)\r
102{\r
103 DIR *dir;\r
104 struct dirent *de;\r
105 char newpath[PATH_MAX];\r
106 \r
107 snprintf(newpath, PATH_MAX, "%s%s", prefix, path);\r
108 \r
109 if (!(dir = opendir(newpath)))\r
110 {\r
111 if (filenamecount > MAX_FILENAMES)\r
112 return 1;\r
113 \r
114 filenames[filenamecount] = (char *) strdup(newpath);\r
115 filenamecount++;\r
116 return 0;\r
117 }\r
118 \r
119 while ((de = readdir(dir)))\r
120 {\r
121 if (de->d_name[0] == '.') continue;\r
122 snprintf(newpath, PATH_MAX, "%s/%s", path, de->d_name);\r
123 process(prefix, newpath);\r
124 }\r
125 closedir(dir);\r
126 \r
127 return 1;\r
128}\r
129\r
130/* Small wrapper for use with qsort(). */ \r
131static int cmp(const void *s1, const void *s2)\r
132{\r
133 return (strcmp(* (char **) s1, * (char **) s2));\r
134}\r