]>
git.ipfire.org Git - ipfire-2.x.git/blob - src/setup/timezone.c
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 $
15 #define _(x) dgettext("setup", x)
24 #define MAX_FILENAMES 5000
25 #define ZONEFILES "/usr/share/zoneinfo/posix"
27 static int filenamecount
;
28 static char *filenames
[MAX_FILENAMES
];
29 static char *displaynames
[MAX_FILENAMES
];
31 static int process(char *prefix
, char *path
);
32 static int cmp(const void *s1
, const void *s2
);
34 int handletimezone(void)
39 struct keyvalue
*kv
= initkeyvalues();
42 char timezone
[STRING_SIZE
];
46 process(ZONEFILES
, "");
47 filenames
[filenamecount
] = NULL
;
48 qsort(filenames
, filenamecount
, sizeof(char *), cmp
);
50 for (c
= 0; filenames
[c
]; c
++)
52 displaynames
[c
] = malloc(STRING_SIZE
);
53 if ((temp
= strstr(filenames
[c
], ZONEFILES
)))
54 strcpy(displaynames
[c
], temp
+ strlen(ZONEFILES
) + 1);
56 strcpy(displaynames
[c
], filenames
[c
]);
58 displaynames
[c
] = NULL
;
60 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/main/settings")))
63 errorbox(_("Unable to open settings file"));
67 strcpy(timezone
, ZONEFILES
"/Europe/Berlin");
68 findkey(kv
, "TIMEZONE", timezone
);
71 for (c
= 0; filenames
[c
]; c
++)
73 if (strcmp(timezone
, filenames
[c
]) == 0)
77 rc
= newtWinMenu(_("Timezone"), _("Choose the timezone you are in from the list below."),
78 50, 5, 5, 6, displaynames
, &choice
, _("OK"), _("Cancel"), NULL
);
80 strcpy(timezone
, filenames
[choice
]);
84 replacekeyvalue(kv
, "TIMEZONE", timezone
);
85 writekeyvalues(kv
, CONFIG_ROOT
"/main/settings");
86 unlink("/etc/localtime");
87 link(timezone
, "/etc/localtime");
93 for (c
= 0; filenames
[c
]; c
++)
96 free(displaynames
[c
]);
103 static int process(char *prefix
, char *path
)
107 char newpath
[PATH_MAX
];
109 snprintf(newpath
, PATH_MAX
, "%s%s", prefix
, path
);
111 if (!(dir
= opendir(newpath
)))
113 if (filenamecount
> MAX_FILENAMES
)
116 filenames
[filenamecount
] = (char *) strdup(newpath
);
121 while ((de
= readdir(dir
)))
123 if (de
->d_name
[0] == '.') continue;
124 snprintf(newpath
, PATH_MAX
, "%s/%s", path
, de
->d_name
);
125 process(prefix
, newpath
);
132 /* Small wrapper for use with qsort(). */
133 static int cmp(const void *s1
, const void *s2
)
135 return (strcmp(* (char **) s1
, * (char **) s2
));