diff options
Diffstat (limited to 'usr.sbin/tzsetup/main.c')
-rw-r--r-- | usr.sbin/tzsetup/main.c | 264 |
1 files changed, 0 insertions, 264 deletions
diff --git a/usr.sbin/tzsetup/main.c b/usr.sbin/tzsetup/main.c deleted file mode 100644 index 6a46538..0000000 --- a/usr.sbin/tzsetup/main.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright 1995 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby - * granted, provided that both the above copyright notice and this - * permission notice appear in all copies, that both the above - * copyright notice and this permission notice appear in all - * supporting documentation, and that the name of M.I.T. not be used - * in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. M.I.T. makes - * no representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS - * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT - * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -static const char rcsid[] = - "$Id: main.c,v 1.8 1996/07/03 01:17:34 jkh Exp $"; - -#include <sys/types.h> -#include <sys/stat.h> -#include <stdio.h> -#include <ncurses.h> -#include <dialog.h> -#include <limits.h> -#include <time.h> -#include <stdlib.h> -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> - -#include "tzsetup.h" -#include "pathnames.h" - -static int set_time(); - -enum cmos { CMOS_UTC, CMOS_LOCAL, CMOS_LEAVE } cmos_state = CMOS_LEAVE; -static int time_adjust = 0; -static enum cmos cmos(enum cmos); -static void fiddle_cmos(void); - -int -main(void) -{ - const char *tz; - - init_dialog(); - if (set_time() != 0) { - end_dialog(); - exit(1); - } - - tz = tzmenu(); - - fiddle_cmos(); - - dialog_notify("Daemons will only notice\n" - "a timezone change.\n" - "after rebooting.\n"); - end_dialog(); - - return tz ? 0 : 1; -} - -static int -set_time(void) -{ - unsigned char result[_POSIX2_LINE_MAX]; - unsigned char buf2[_POSIX2_LINE_MAX]; - static struct tm usertm, systm; - time_t usertime, systime; - long diff; - int rv; - - /* - * If /etc/wall_cmos_clock exists, or if there is already a timezone - * file installed, then just leave it alone and don't ask the user - * what time it is (because the system clock is already in POSIX - * time so we don't need to adjust anything later on). - */ - time(&systime); - systm = *localtime(&systime); - if (systm.tm_zone[0] - || access(PATH_WALL_CMOS_CLOCK, 0) == 0) { - cmos_state = CMOS_LEAVE; - return 0; - } - - usertm = systm; - usertm.tm_isdst = -1; - - result[0] = '\0'; - - while(1) { - rv = dialog_inputbox("Checking current time", - "Please enter the current local time" - " using 24-hour style,\n" - "in the form HH:MM", - 8, 78, result); - if (rv != 0) - return 1; - - if (result[0]) { - if (sscanf(result, "%d:%d:%d", &usertm.tm_hour, - &usertm.tm_min, - &usertm.tm_sec) < 2) { - snprintf(buf2, sizeof buf2, - "Invalid time format: %s", result); - dialog_notify(buf2); - continue; - } - usertime = mktime(&usertm); - if (usertime == (time_t)-1) { - snprintf(buf2, sizeof buf2, - "Unreasonable time: %s", result); - dialog_notify(buf2); - continue; - } - - diff = usertime - systime; - if (labs(diff) > 15*60) { - cmos_state = cmos(CMOS_LOCAL); - if (diff > 0) { - time_adjust = ((diff + 15*60)/(30*60) - * 30*60); - } else { - time_adjust = ((diff - 15*60)/(30*60) - * 30*60); - } - } else { - cmos_state = cmos(CMOS_UTC); - time_adjust = 0; - } - break; - } - } - return 0; -} - -static unsigned char *cmos_list[] = { - "1", "CMOS clock is set to Universal time (UTC)", - "2", "CMOS clock is set to local time", - "3", "I'm not sure, leave it alone" -}; - -static enum cmos -cmos(enum cmos state) -{ - int rv, sel = 0; - unsigned char buf[_POSIX2_LINE_MAX]; - unsigned char result[_POSIX2_LINE_MAX]; - - snprintf(buf, sizeof buf, "%s seems most likely", - state == CMOS_UTC ? "UTC" : "local time"); - - rv = dialog_menu("CMOS clock in local time or UTC", - buf, 12, 78, 3, 3, cmos_list, result, &sel, 0); - if (rv == 0) { - return sel; - } else { - return state; - } -} - -static void -fiddle_cmos(void) -{ - int fd; - - switch(cmos_state) { - case CMOS_LEAVE: - break; - case CMOS_UTC: - if (unlink(PATH_WALL_CMOS_CLOCK) == -1 && - errno != ENOENT) - dialog_notify("Error removing " PATH_WALL_CMOS_CLOCK); - break; - case CMOS_LOCAL: - if ((fd = open(PATH_WALL_CMOS_CLOCK, O_RDONLY|O_CREAT, 0644)) - == -1) - dialog_notify("Error creating " PATH_WALL_CMOS_CLOCK); - else - close(fd); - break; - } -} - - -int -setzone(const char *zone) -{ - time_t systime; - struct tm *tm; - char msg[_POSIX2_LINE_MAX]; - int rv; - struct stat sb; - - /* - * Make sure the definition file does exist before clobbering - * an existing PATH_LOCALTIME. We do this before evaluating - * locatlime below, since a missing zoneinfo file would result - * in nothing but garbage in the displayed time information. - */ - snprintf(msg, sizeof msg, PATH_ZONEINFO "/%s", zone); - if (stat(msg, &sb) == -1) { - snprintf(msg, sizeof msg, - "Could not find definition file\n" - PATH_ZONEINFO "/%s", zone); - dialog_notify(msg); - return 1; - } - - snprintf(msg, sizeof msg, "TZ=%s", zone); - putenv(msg); - tzset(); - time(&systime); - systime += time_adjust; - tm = localtime(&systime); - - snprintf(msg, sizeof msg, "Does %s look reasonable?", tm->tm_zone); - - rv = dialog_yesno("Verifying timezone selection", - msg, -1, -1); - if (rv) - return 1; - - if (lstat(PATH_LOCALTIME, &sb) == 0 && S_ISLNK(sb.st_mode)) { - /* The destination is already a symlink, symlink it. */ - (void)unlink(PATH_LOCALTIME); - snprintf(msg, sizeof msg, PATH_ZONEINFO "/%s", zone); - if (symlink(msg, PATH_LOCALTIME) == -1) { - dialog_notify("Could not create a symbolic link for " - PATH_LOCALTIME); - return 1; - } - } else { - /* Copy it. */ - snprintf(msg, sizeof msg, - "install -C -o bin -g bin -m 0444 " - PATH_ZONEINFO "/%s " PATH_LOCALTIME, zone); - if (system(msg) != 0) { - dialog_notify("Could not copy zone information into " - PATH_LOCALTIME); - return 1; - } - } - - snprintf(msg, sizeof msg, "Installed timezone file %s", zone); - dialog_notify(msg); - return 0; -} |