-/* SmoothWall setup program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence. See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Stuff for setting the timezone.\r
- * \r
- * $Id: timezone.c,v 1.4.2.1 2004/04/14 22:05:41 gespinasse Exp $\r
- * \r
- */\r
-\r
-#include "setup.h"\r
- \r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-extern int automode;\r
-\r
-#define MAX_FILENAMES 5000\r
-#define ZONEFILES "/usr/share/zoneinfo/posix"\r
-\r
-static int filenamecount;\r
-static char *filenames[MAX_FILENAMES];\r
-static char *displaynames[MAX_FILENAMES];\r
-\r
-static int process(char *prefix, char *path);\r
-static int cmp(const void *s1, const void *s2);\r
-\r
-int handletimezone(void)\r
-{\r
- int c;\r
- int choice;\r
- char *temp;\r
- struct keyvalue *kv = initkeyvalues(); \r
- int rc;\r
- int result;\r
- char timezone[STRING_SIZE];\r
-\r
- filenamecount = 0; \r
-\r
- process(ZONEFILES, "");\r
- filenames[filenamecount] = NULL;\r
- qsort(filenames, filenamecount, sizeof(char *), cmp);\r
- \r
- for (c = 0; filenames[c]; c++)\r
- {\r
- displaynames[c] = malloc(STRING_SIZE);\r
- if ((temp = strstr(filenames[c], ZONEFILES)))\r
- strcpy(displaynames[c], temp + strlen(ZONEFILES) + 1);\r
- else\r
- strcpy(displaynames[c], filenames[c]);\r
- }\r
- displaynames[c] = NULL;\r
- \r
- if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))\r
- {\r
- freekeyvalues(kv);\r
- errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
- return 0;\r
- } \r
- \r
- strcpy(timezone, ZONEFILES "/Europe/Berlin");\r
- findkey(kv, "TIMEZONE", timezone);\r
- \r
- choice = 0;\r
- for (c = 0; filenames[c]; c++)\r
- {\r
- if (strcmp(timezone, filenames[c]) == 0)\r
- choice = c;\r
- }\r
- \r
- rc = newtWinMenu(ctr[TR_TIMEZONE], ctr[TR_TIMEZONE_LONG], 50, 5, 5, 6, displaynames, &choice,\r
- ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
-\r
- strcpy(timezone, filenames[choice]);\r
- \r
- if (rc != 2)\r
- {\r
- replacekeyvalue(kv, "TIMEZONE", timezone);\r
- writekeyvalues(kv, CONFIG_ROOT "/main/settings");\r
- unlink("/etc/localtime");\r
- link(timezone, "/etc/localtime");\r
- result = 1;\r
- }\r
- else\r
- result = 0; \r
- \r
- for (c = 0; filenames[c]; c++)\r
- {\r
- free(filenames[c]);\r
- free(displaynames[c]);\r
- }\r
- freekeyvalues(kv); \r
- \r
- return result;\r
-}\r
-\r
-static int process(char *prefix, char *path)\r
-{\r
- DIR *dir;\r
- struct dirent *de;\r
- char newpath[PATH_MAX];\r
- \r
- snprintf(newpath, PATH_MAX, "%s%s", prefix, path);\r
- \r
- if (!(dir = opendir(newpath)))\r
- {\r
- if (filenamecount > MAX_FILENAMES)\r
- return 1;\r
- \r
- filenames[filenamecount] = (char *) strdup(newpath);\r
- filenamecount++;\r
- return 0;\r
- }\r
- \r
- while ((de = readdir(dir)))\r
- {\r
- if (de->d_name[0] == '.') continue;\r
- snprintf(newpath, PATH_MAX, "%s/%s", path, de->d_name);\r
- process(prefix, newpath);\r
- }\r
- closedir(dir);\r
- \r
- return 1;\r
-}\r
-\r
-/* Small wrapper for use with qsort(). */ \r
-static int cmp(const void *s1, const void *s2)\r
-{\r
- return (strcmp(* (char **) s1, * (char **) s2));\r
-}\r
+/* SmoothWall setup program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence. See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Stuff for setting the timezone.
+ *
+ * $Id: timezone.c,v 1.4.2.1 2004/04/14 22:05:41 gespinasse Exp $
+ *
+ */
+
+#include "setup.h"
+
+extern FILE *flog;
+extern char *mylog;
+
+extern char **ctr;
+
+extern int automode;
+
+#define MAX_FILENAMES 5000
+#define ZONEFILES "/usr/share/zoneinfo/posix"
+
+static int filenamecount;
+static char *filenames[MAX_FILENAMES];
+static char *displaynames[MAX_FILENAMES];
+
+static int process(char *prefix, char *path);
+static int cmp(const void *s1, const void *s2);
+
+int handletimezone(void)
+{
+ int c;
+ int choice;
+ char *temp;
+ struct keyvalue *kv = initkeyvalues();
+ int rc;
+ int result;
+ char timezone[STRING_SIZE];
+
+ filenamecount = 0;
+
+ process(ZONEFILES, "");
+ filenames[filenamecount] = NULL;
+ qsort(filenames, filenamecount, sizeof(char *), cmp);
+
+ for (c = 0; filenames[c]; c++)
+ {
+ displaynames[c] = malloc(STRING_SIZE);
+ if ((temp = strstr(filenames[c], ZONEFILES)))
+ strcpy(displaynames[c], temp + strlen(ZONEFILES) + 1);
+ else
+ strcpy(displaynames[c], filenames[c]);
+ }
+ displaynames[c] = NULL;
+
+ if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings")))
+ {
+ freekeyvalues(kv);
+ errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+ return 0;
+ }
+
+ strcpy(timezone, ZONEFILES "/Europe/Berlin");
+ findkey(kv, "TIMEZONE", timezone);
+
+ choice = 0;
+ for (c = 0; filenames[c]; c++)
+ {
+ if (strcmp(timezone, filenames[c]) == 0)
+ choice = c;
+ }
+
+ rc = newtWinMenu(ctr[TR_TIMEZONE], ctr[TR_TIMEZONE_LONG], 50, 5, 5, 6, displaynames, &choice,
+ ctr[TR_OK], ctr[TR_CANCEL], NULL);
+
+ strcpy(timezone, filenames[choice]);
+
+ if (rc != 2)
+ {
+ replacekeyvalue(kv, "TIMEZONE", timezone);
+ writekeyvalues(kv, CONFIG_ROOT "/main/settings");
+ unlink("/etc/localtime");
+ link(timezone, "/etc/localtime");
+ result = 1;
+ }
+ else
+ result = 0;
+
+ for (c = 0; filenames[c]; c++)
+ {
+ free(filenames[c]);
+ free(displaynames[c]);
+ }
+ freekeyvalues(kv);
+
+ return result;
+}
+
+static int process(char *prefix, char *path)
+{
+ DIR *dir;
+ struct dirent *de;
+ char newpath[PATH_MAX];
+
+ snprintf(newpath, PATH_MAX, "%s%s", prefix, path);
+
+ if (!(dir = opendir(newpath)))
+ {
+ if (filenamecount > MAX_FILENAMES)
+ return 1;
+
+ filenames[filenamecount] = (char *) strdup(newpath);
+ filenamecount++;
+ return 0;
+ }
+
+ while ((de = readdir(dir)))
+ {
+ if (de->d_name[0] == '.') continue;
+ snprintf(newpath, PATH_MAX, "%s/%s", path, de->d_name);
+ process(prefix, newpath);
+ }
+ closedir(dir);
+
+ return 1;
+}
+
+/* Small wrapper for use with qsort(). */
+static int cmp(const void *s1, const void *s2)
+{
+ return (strcmp(* (char **) s1, * (char **) s2));
+}