|
|
1.1 root 1: /*
2: * setdate: used in post processing of install to setup /etc/timezone
3: */
4:
5: /*
6: * includes
7: */
8:
9: #include <stdio.h>
10: #include <time.h>
11: #include "build0.h"
12:
13:
14: /*
15: * declarations
16: */
17:
18: char tzone[NBUF]; /* timezone */
19: char tzone5[NBUF]; /* timezone for Sys V */
20:
21: /*
22: * Set up a nonstandard timezone.
23: */
24: void
25: get_timezone(dstflag)
26: int dstflag;
27: {
28: register char *s;
29: int diff;
30: char std_abbr[20], dst_abbr[20];
31: int east_of_gr;
32:
33: /* tzone5 is like tzone except no colons and number is in hours */
34:
35: printf(
36: "You need to specify an abbreviation for your timezone,\n"
37: "whether you are east or west of Greenwich, England,\n"
38: "and the difference in minutes between your timezone\n"
39: "and Greenwich Time (called UT or GMT). For example,\n"
40: "Germany is 60 minutes of time east of Greenwich.\n"
41: );
42: s = get_line("Abbreviation for your timezone:");
43: strcpy(std_abbr, s);
44: east_of_gr = yes_no("Is your timezone east of Greenwich");
45: s = get_line("Difference in minutes from GMT:");
46: diff = atoi(s);
47: if (east_of_gr)
48: diff = -diff;
49: if (dstflag) {
50: s = get_line("Abbreviation for your daylight savings timezone:");
51: strcpy(dst_abbr, s);
52: sprintf(tzone, "%s:%d:%s:1.1.4", std_abbr, diff, dst_abbr);
53: sprintf(tzone5, "%s%d%s", std_abbr, diff/60, dst_abbr);
54: } else {
55: sprintf(tzone, "%s:%d:", std_abbr, diff);
56: sprintf(tzone5, "%s%d", std_abbr, diff/60);
57: }
58: }
59:
60:
61: /*
62: * Date and time.
63: */
64:
65: main()
66: {
67: register char *s;
68: int dst_conv; /* 1 if DST conversion will be used */
69: int dst_now; /* 1 if DST in effect today */
70: int n;
71: char *tz;
72: time_t now;
73: struct tm *tmp;
74: char *timestr;
75:
76: again:
77: /* new set_date */
78:
79: /*
80: * yyy:
81: *
82: * dst_conv = FALSE
83: * dst_now = FALSE
84: *
85: * if using DST conversion
86: * dst_conv = TRUE
87: * if DST in effect today
88: * dst_now = TRUE
89: * get date from system clock
90: * if dst_conv and dst_now
91: * add 1 hour to date fetched
92: * display date
93: * while date not correct
94: * if proceed without setting clock
95: * goto xxx
96: * read date from kb
97: * write date to CMOS clock and RAM clock
98: * if dst_conv and dst_now
99: * subtract 1 hour from date entered
100: * write adjusted date to CMOS clock
101: * xxx:
102: * set TIMEZONE and TZ variables
103: * if date, TIMEZONE, and TZ not all correct
104: * goto yyy
105: */
106: cls(0);
107: dst_conv = 0;
108: dst_now = 0;
109: printf(
110: "You can run COHERENT with or without conversion for daylight savings time\n"
111: "(summer time). You should normally run with daylight savings time\n"
112: "conversion. However, if you are going to use both COHERENT and MS-DOS\n"
113: "and you choose to run with daylight savings time conversion,\n"
114: "your time will be wrong (by one hour) during daylight savings time\n"
115: "while you are running under MS-DOS.\n"
116: "\n"
117: );
118: if (yes_no(
119: "Do you want COHERENT to use daylight savings time conversion")) {
120: dst_conv = 1;
121: printf(
122: "\n"
123: "By default, COHERENT assumes daylight savings time begins on the\n"
124: "first Sunday in April and ends on the last Sunday in October.\n"
125: "If you want to change the defaults, edit the file \"/etc/timezone\"\n"
126: "after you finish installing COHERENT.\n"
127: "\n"
128: );
129: if (yes_no("Is daylight savings time currently in effect"))
130: dst_now = 1;
131: }
132: system("/bin/date `/etc/ATclock` > /dev/null");
133: now = time(0);
134: if (dst_conv && dst_now)
135: now += 3600;
136: timestr = ctime(&now);
137: printf(
138: "\nAccording to your system clock, your local date and time are:\n"
139: );
140: printf("%s\n", timestr);
141: if (!yes_no("Is this correct")) {
142: n = 0;
143: do {
144: if (++n > 3) {
145: printf(
146: "The command which sets the internal real-time clock of your system is\n"
147: "failing repeatedly. Either you are entering the date and time incorrectly\n"
148: "or your clock hardware is not completely AT-compatible. If your clock\n"
149: "hardware is incompatible, you can continue with the installation without\n"
150: "setting the clock correctly. However, if you do so, subsequent clock\n"
151: "references (including file access and modification time information) will be\n"
152: "incorrect and some commands (such as \"date\") will not function correctly.\n"
153: );
154: if (yes_no("Do you want to proceed without setting the clock correctly"))
155: break;
156: n = 0;
157: }
158: s = get_line(
159: "\nEnter the correct date and time in the form YYMMDDHHMM.SS:"
160: );
161: sprintf(cmd, "/etc/ATclock %s >/dev/null", s);
162: } while (sys(cmd, S_NONFATAL) != 0);
163: sys("/bin/date `/etc/ATclock` >/dev/null", S_NONFATAL);
164:
165: if (dst_conv && dst_now) {
166: /* Adjust for DST: set hardware clock back one hour. */
167: now = time(0) - 3600;
168: tmp = localtime(&now);
169: sprintf(cmd,
170: "/etc/ATclock %02d%02d%02d%02d%02d.%02d >/dev/null",
171: tmp->tm_year, tmp->tm_mon + 1, tmp->tm_mday,
172: tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
173: sys(cmd, S_NONFATAL);
174: }
175:
176: }
177:
178: /* Timezone. */
179: cls(0);
180: printf(
181: "Please choose one of the following timezones:\n"
182: "\t0\tCentral European\n"
183: "\t1\tGreenwich\n"
184: "\t2\tNewfoundland\n"
185: "\t3\tAtlantic\n"
186: "\t4\tEastern\n"
187: "\t5\tCentral\n"
188: "\t6\tMountain\n"
189: "\t7\tPacific\n"
190: "\t8\tYukon\n"
191: "\t9\tAlaska\n"
192: "\t10\tBering\n"
193: "\t11\tHawaii\n"
194: "\t12\tOther\n"
195: );
196: do {
197: s = get_line("Timezone code:");
198: } while ((n = atoi(s)) < 0 || n > 12);
199: switch (n) {
200: /* N.B. entries truncated at tz[8] below if !dst_conv. */
201: case 0: tz = "EST:-60:EDT:1.1.4"; break;
202: case 1: tz = "GMT:000:GDT:1.1.4"; break;
203: case 2: tz = "NST:210:NDT:1.1.4"; break;
204: case 3: tz = "AST:240:ADT:1.1.4"; break;
205: case 4: tz = "EST:300:EDT:1.1.4"; break;
206: case 5: tz = "CST:360:CDT:1.1.4"; break;
207: case 6: tz = "MST:420:MDT:1.1.4"; break;
208: case 7: tz = "PST:480:PDT:1.1.4"; break;
209: case 8: tz = "YST:540:YDT:1.1.4"; break;
210: case 9: tz = "AST:600:ADT:1.1.4"; break;
211: case 10: tz = "BST:660:BDT:1.1.4"; break;
212: case 11: tz = "HST:600:HDT:1.1.4"; break;
213: case 12: tz = NULL; break;
214: }
215:
216: if (tz == NULL)
217: get_timezone(dst_conv);
218: else {
219: strcpy(tzone, tz);
220: if (dst_conv) {
221: /* for TZ, AST:240:ADT becomes AST4ADT */
222: sprintf(tzone5, "%.3s%d%cDT",
223: tz, atoi(tzone + 4)/60, tz[0]);
224: } else {
225: /* for TZ, AST:240 becomes AST4 */
226: sprintf(tzone5, "%.3s%d", tz, atoi(tzone + 4)/60);
227: tzone[8] = '\0';
228: }
229: }
230: /* Done, print current time and retry if user botched it. */
231: printf("\nYour current local date and time are now:\n");
232: sprintf(cmd, "TIMEZONE='%s' /bin/date -s `/etc/ATclock`", tzone);
233: sys(cmd, S_NONFATAL);
234:
235: /* Write the timezone to /tmp/timezone for debug */
236: sprintf(cmd, "/bin/echo export TIMEZONE=\\\"%s\\\" >/tmp/timezone", tzone);
237: sys(cmd, S_NONFATAL);
238: sprintf(cmd, "/bin/echo export TZ=\\\"%s\\\" >>/tmp/timezone", tzone5);
239: sys(cmd, S_NONFATAL);
240: if (!yes_no("Is this correct"))
241: goto again;
242: system("/bin/cp /tmp/timezone /etc/timezone");
243: system("/bin/chmog 644 bin bin /etc/timezone");
244: exit(0);
245: }
246:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.