Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/util-linux/hwclock.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/util-linux/hwclock.c
r821 r1770 8 8 */ 9 9 10 11 #include <sys/ioctl.h>12 10 #include <sys/utsname.h> 13 #include <ctype.h>14 #include <fcntl.h>15 11 #include <getopt.h> 16 #include <stdlib.h> 17 #include <string.h> 18 #include <syslog.h> 19 #include <time.h> 20 #include <unistd.h> 21 #include "busybox.h" 12 #include "libbb.h" 22 13 23 14 /* Copied from linux/rtc.h to eliminate the kernel dependency */ … … 43 34 #endif 44 35 36 static const char *rtcname; 37 38 static int xopen_rtc(int flags) 39 { 40 int rtc; 41 42 if (!rtcname) { 43 rtc = open("/dev/rtc", flags); 44 if (rtc >= 0) 45 return rtc; 46 rtc = open("/dev/rtc0", flags); 47 if (rtc >= 0) 48 return rtc; 49 rtcname = "/dev/misc/rtc"; 50 } 51 return xopen(rtcname, flags); 52 } 53 45 54 static time_t read_rtc(int utc) 46 55 { 47 int rtc;48 56 struct tm tm; 49 57 char *oldtz = 0; 50 58 time_t t = 0; 51 52 if (( rtc = open ( "/dev/rtc", O_RDONLY )) < 0 ) { 53 if (( rtc = open ( "/dev/misc/rtc", O_RDONLY )) < 0 ) 54 bb_perror_msg_and_die ( "Could not access RTC" ); 55 } 56 memset ( &tm, 0, sizeof( struct tm )); 57 if ( ioctl ( rtc, RTC_RD_TIME, &tm ) < 0 ) 58 bb_perror_msg_and_die ( "Could not read time from RTC" ); 59 int rtc = xopen_rtc(O_RDONLY); 60 61 memset(&tm, 0, sizeof(struct tm)); 62 xioctl(rtc, RTC_RD_TIME, &tm); 59 63 tm.tm_isdst = -1; /* not known */ 60 64 61 close ( rtc ); 62 63 if ( utc ) { 64 oldtz = getenv ( "TZ" ); 65 setenv ( "TZ", "UTC 0", 1 ); 66 tzset ( ); 67 } 68 69 t = mktime ( &tm ); 70 71 if ( utc ) { 72 if ( oldtz ) 73 setenv ( "TZ", oldtz, 1 ); 74 else 75 unsetenv ( "TZ" ); 76 tzset ( ); 65 close(rtc); 66 67 if (utc) { 68 oldtz = getenv("TZ"); 69 putenv((char*)"TZ=UTC0"); 70 tzset(); 71 } 72 73 t = mktime(&tm); 74 75 if (utc) { 76 unsetenv("TZ"); 77 if (oldtz) 78 putenv(oldtz - 3); 79 tzset(); 77 80 } 78 81 return t; … … 81 84 static void write_rtc(time_t t, int utc) 82 85 { 83 int rtc;84 86 struct tm tm; 85 86 if (( rtc = open ( "/dev/rtc", O_WRONLY )) < 0 ) { 87 if (( rtc = open ( "/dev/misc/rtc", O_WRONLY )) < 0 ) 88 bb_perror_msg_and_die ( "Could not access RTC" ); 89 } 90 91 tm = *( utc ? gmtime ( &t ) : localtime ( &t )); 87 int rtc = xopen_rtc(O_WRONLY); 88 89 tm = *(utc ? gmtime(&t) : localtime(&t)); 92 90 tm.tm_isdst = 0; 93 91 94 if ( ioctl ( rtc, RTC_SET_TIME, &tm ) < 0 ) 95 bb_perror_msg_and_die ( "Could not set the RTC time" ); 96 97 close ( rtc ); 98 } 99 100 static int show_clock(int utc) 101 { 102 struct tm *ptm; 92 xioctl(rtc, RTC_SET_TIME, &tm); 93 94 close(rtc); 95 } 96 97 static void show_clock(int utc) 98 { 99 //struct tm *ptm; 103 100 time_t t; 104 RESERVE_CONFIG_BUFFER(buffer, 64); 105 106 t = read_rtc ( utc ); 107 ptm = localtime ( &t ); /* Sets 'tzname[]' */ 108 109 safe_strncpy ( buffer, ctime ( &t ), 64); 110 if ( buffer [0] ) 111 buffer [strlen ( buffer ) - 1] = 0; 112 113 //printf ( "%s %.6f seconds %s\n", buffer, 0.0, utc ? "" : ( ptm-> tm_isdst ? tzname [1] : tzname [0] )); 114 printf ( "%s %.6f seconds\n", buffer, 0.0 ); 115 RELEASE_CONFIG_BUFFER(buffer); 116 117 return 0; 118 } 119 120 static int to_sys_clock(int utc) 121 { 122 struct timeval tv = { 0, 0 }; 101 char *cp; 102 103 t = read_rtc(utc); 104 //ptm = localtime(&t); /* Sets 'tzname[]' */ 105 106 cp = ctime(&t); 107 if (cp[0]) 108 cp[strlen(cp) - 1] = '\0'; 109 110 //printf("%s %.6f seconds %s\n", cp, 0.0, utc ? "" : (ptm->tm_isdst ? tzname[1] : tzname[0])); 111 printf("%s 0.000000 seconds\n", cp); 112 } 113 114 static void to_sys_clock(int utc) 115 { 116 struct timeval tv; 123 117 const struct timezone tz = { timezone/60 - 60*daylight, 0 }; 124 118 125 tv.tv_sec = read_rtc ( utc ); 126 127 if ( settimeofday ( &tv, &tz )) 128 bb_perror_msg_and_die ( "settimeofday() failed" ); 129 130 return 0; 131 } 132 133 static int from_sys_clock(int utc) 134 { 135 struct timeval tv = { 0, 0 }; 136 struct timezone tz = { 0, 0 }; 137 138 if ( gettimeofday ( &tv, &tz )) 139 bb_perror_msg_and_die ( "gettimeofday() failed" ); 140 141 write_rtc ( tv.tv_sec, utc ); 142 return 0; 143 } 144 145 #ifdef CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS 119 tv.tv_sec = read_rtc(utc); 120 tv.tv_usec = 0; 121 if (settimeofday(&tv, &tz)) 122 bb_perror_msg_and_die("settimeofday() failed"); 123 } 124 125 static void from_sys_clock(int utc) 126 { 127 struct timeval tv; 128 129 gettimeofday(&tv, NULL); 130 //if (gettimeofday(&tv, NULL)) 131 // bb_perror_msg_and_die("gettimeofday() failed"); 132 write_rtc(tv.tv_sec, utc); 133 } 134 135 #if ENABLE_FEATURE_HWCLOCK_ADJTIME_FHS 146 136 # define ADJTIME_PATH "/var/lib/hwclock/adjtime" 147 137 #else … … 151 141 { 152 142 int utc = 0; 153 FILE *f = fopen ( ADJTIME_PATH, "r");154 155 if ( f) {143 FILE *f = fopen(ADJTIME_PATH, "r"); 144 145 if (f) { 156 146 RESERVE_CONFIG_BUFFER(buffer, 128); 157 147 158 while ( fgets ( buffer, sizeof( buffer ), f)) {159 int len = strlen ( buffer);160 161 while ( len && isspace ( buffer [len - 1]))148 while (fgets(buffer, sizeof(buffer), f)) { 149 int len = strlen(buffer); 150 151 while (len && isspace(buffer[len - 1])) 162 152 len--; 163 153 164 buffer 165 166 if ( strncmp ( buffer, "UTC", 3 ) == 0) {154 buffer[len] = 0; 155 156 if (strncmp(buffer, "UTC", 3) == 0) { 167 157 utc = 1; 168 158 break; 169 159 } 170 160 } 171 fclose ( f);161 fclose(f); 172 162 RELEASE_CONFIG_BUFFER(buffer); 173 163 } … … 175 165 } 176 166 177 #define HWCLOCK_OPT_LOCALTIME 0x01 178 #define HWCLOCK_OPT_UTC 0x02 179 #define HWCLOCK_OPT_SHOW 0x04 180 #define HWCLOCK_OPT_HCTOSYS 0x08 181 #define HWCLOCK_OPT_SYSTOHC 0x10 182 183 int hwclock_main ( int argc, char **argv ) 184 { 185 unsigned long opt; 167 #define HWCLOCK_OPT_LOCALTIME 0x01 168 #define HWCLOCK_OPT_UTC 0x02 169 #define HWCLOCK_OPT_SHOW 0x04 170 #define HWCLOCK_OPT_HCTOSYS 0x08 171 #define HWCLOCK_OPT_SYSTOHC 0x10 172 #define HWCLOCK_OPT_RTCFILE 0x20 173 174 int hwclock_main(int argc, char **argv); 175 int hwclock_main(int argc, char **argv) 176 { 177 unsigned opt; 186 178 int utc; 187 179 188 180 #if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS 189 static const struct option hwclock_long_options[] = { 190 { "localtime", 0, 0, 'l' },191 { "utc", 0, 0, 'u' },192 { "show", 0, 0, 'r' },193 { "hctosys", 0, 0, 's' },194 { "systohc", 0, 0, 'w' },195 { 0, 0, 0, 0 }196 };197 bb_applet_long_options = hwclock_long_options;181 static const char hwclock_longopts[] ALIGN1 = 182 "localtime\0" No_argument "l" 183 "utc\0" No_argument "u" 184 "show\0" No_argument "r" 185 "hctosys\0" No_argument "s" 186 "systohc\0" No_argument "w" 187 "file\0" Required_argument "f" 188 ; 189 applet_long_options = hwclock_longopts; 198 190 #endif 199 200 bb_opt_complementally = "?:r--ws:w--rs:s--wr:l--u:u--l"; 201 opt = bb_getopt_ulflags(argc, argv, "lursw"); 191 opt_complementary = "r--ws:w--rs:s--wr:l--u:u--l"; 192 opt = getopt32(argv, "lurswf:", &rtcname); 202 193 203 194 /* If -u or -l wasn't given check if we are using utc */ … … 208 199 209 200 if (opt & HWCLOCK_OPT_HCTOSYS) { 210 return to_sys_clock ( utc ); 211 } 212 else if (opt & HWCLOCK_OPT_SYSTOHC) { 213 return from_sys_clock ( utc ); 214 } else { 215 /* default HWCLOCK_OPT_SHOW */ 216 return show_clock ( utc ); 217 } 218 } 201 to_sys_clock(utc); 202 return 0; 203 } 204 if (opt & HWCLOCK_OPT_SYSTOHC) { 205 from_sys_clock(utc); 206 return 0; 207 } 208 /* default HWCLOCK_OPT_SHOW */ 209 show_clock(utc); 210 return 0; 211 }
Note:
See TracChangeset
for help on using the changeset viewer.