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
"/CET");
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
));