adjkerntz.c (4107) | adjkerntz.c (5076) |
---|---|
1/* 2 * Copyright (C) 1993 by Andrew A. Chernov, Moscow, Russia. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 145 unchanged lines hidden (view full) --- 154 mib[0] = CTL_MACHDEP; 155 mib[1] = CPU_ADJKERNTZ; 156 len = sizeof(kern_offset); 157 if (sysctl(mib, 2, &kern_offset, &len, NULL, 0) == -1) { 158 syslog(LOG_ERR, "sysctl(get_offset): %m"); 159 return 1; 160 } 161 | 1/* 2 * Copyright (C) 1993 by Andrew A. Chernov, Moscow, Russia. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 145 unchanged lines hidden (view full) --- 154 mib[0] = CTL_MACHDEP; 155 mib[1] = CPU_ADJKERNTZ; 156 len = sizeof(kern_offset); 157 if (sysctl(mib, 2, &kern_offset, &len, NULL, 0) == -1) { 158 syslog(LOG_ERR, "sysctl(get_offset): %m"); 159 return 1; 160 } 161 |
162 stv = NULL; 163 stz = NULL; 164 |
|
162 /* correct the kerneltime for this diffs */ 163 /* subtract kernel offset, if present, old offset too */ 164 165 diff = offset - tz.tz_minuteswest * 60 - kern_offset; 166 167 if (diff != 0) { 168 169 /* Yet one step for final time */ --- 27 unchanged lines hidden (view full) --- 197 198 diff = offset - tz.tz_minuteswest * 60 - kern_offset; 199 200 if (diff != 0) { 201 tv.tv_sec += diff; 202 tv.tv_usec = 0; /* we are restarting here... */ 203 stv = &tv; 204 } | 165 /* correct the kerneltime for this diffs */ 166 /* subtract kernel offset, if present, old offset too */ 167 168 diff = offset - tz.tz_minuteswest * 60 - kern_offset; 169 170 if (diff != 0) { 171 172 /* Yet one step for final time */ --- 27 unchanged lines hidden (view full) --- 200 201 diff = offset - tz.tz_minuteswest * 60 - kern_offset; 202 203 if (diff != 0) { 204 tv.tv_sec += diff; 205 tv.tv_usec = 0; /* we are restarting here... */ 206 stv = &tv; 207 } |
205 else 206 stv = NULL; | |
207 } | 208 } |
208 else 209 stv = NULL; | |
210 211 if (tz.tz_dsttime != 0 || tz.tz_minuteswest != 0) { 212 tz.tz_dsttime = tz.tz_minuteswest = 0; /* zone info is garbage */ 213 stz = &tz; 214 } | 209 210 if (tz.tz_dsttime != 0 || tz.tz_minuteswest != 0) { 211 tz.tz_dsttime = tz.tz_minuteswest = 0; /* zone info is garbage */ 212 stz = &tz; 213 } |
215 else 216 stz = NULL; | |
217 | 214 |
218 if (stz != NULL || stv != NULL) { 219 if (init && stv != NULL) { 220 mib[0] = CTL_MACHDEP; 221 mib[1] = CPU_DISRTCSET; 222 len = sizeof(disrtcset); 223 if (sysctl(mib, 2, &disrtcset, &len, NULL, 0) == -1) { 224 syslog(LOG_ERR, "sysctl(get_disrtcset): %m"); | 215 /* if init, don't touch RTC at all */ 216 if (init) { 217 mib[0] = CTL_MACHDEP; 218 mib[1] = CPU_DISRTCSET; 219 len = sizeof(disrtcset); 220 if (sysctl(mib, 2, &disrtcset, &len, NULL, 0) == -1) { 221 syslog(LOG_ERR, "sysctl(get_disrtcset): %m"); 222 return 1; 223 } 224 if (disrtcset == 0) { 225 disrtcset = 1; 226 need_restore = 1; 227 if (sysctl(mib, 2, NULL, NULL, &disrtcset, len) == -1) { 228 syslog(LOG_ERR, "sysctl(set_disrtcset): %m"); |
225 return 1; 226 } | 229 return 1; 230 } |
227 if (disrtcset == 0) { 228 disrtcset = 1; 229 need_restore = 1; 230 if (sysctl(mib, 2, NULL, NULL, &disrtcset, len) == -1) { 231 syslog(LOG_ERR, "sysctl(set_disrtcset): %m"); 232 return 1; 233 } 234 } | |
235 } | 231 } |
236 /* stz means that kernel zone shifted */ 237 /* clock needs adjustment even if !init */ 238 if ((init || stz != NULL) && settimeofday(stv, stz)) { 239 syslog(LOG_ERR, "settimeofday: %m"); 240 return 1; 241 } | |
242 } 243 | 232 } 233 |
234 if (( (init && (stv != NULL || stz != NULL)) 235 || (stz != NULL && stv == NULL) 236 ) 237 && settimeofday(stv, stz) 238 ) { 239 syslog(LOG_ERR, "settimeofday: %m"); 240 return 1; 241 } 242 243 /* init: don't write RTC, !init: write RTC */ |
|
244 if (kern_offset != offset) { 245 kern_offset = offset; 246 mib[0] = CTL_MACHDEP; 247 mib[1] = CPU_ADJKERNTZ; 248 len = sizeof(kern_offset); 249 if (sysctl(mib, 2, NULL, NULL, &kern_offset, len) == -1) { 250 syslog(LOG_ERR, "sysctl(update_offset): %m"); 251 return 1; 252 } 253 } 254 255 if (need_restore) { 256 need_restore = 0; 257 disrtcset = 0; | 244 if (kern_offset != offset) { 245 kern_offset = offset; 246 mib[0] = CTL_MACHDEP; 247 mib[1] = CPU_ADJKERNTZ; 248 len = sizeof(kern_offset); 249 if (sysctl(mib, 2, NULL, NULL, &kern_offset, len) == -1) { 250 syslog(LOG_ERR, "sysctl(update_offset): %m"); 251 return 1; 252 } 253 } 254 255 if (need_restore) { 256 need_restore = 0; 257 disrtcset = 0; |
258 len = sizeof(disrtcset); |
|
258 if (sysctl(mib, 2, NULL, NULL, &disrtcset, len) == -1) { 259 syslog(LOG_ERR, "sysctl(restore_disrtcset): %m"); 260 return 1; 261 } 262 } 263 264/****** End of critical section ******/ 265 266 if (init) { 267 init = 0; 268 /* wait for signals and acts like -a */ 269 (void) sigsuspend(&emask); 270 goto again; 271 } 272 273 return 0; 274} | 259 if (sysctl(mib, 2, NULL, NULL, &disrtcset, len) == -1) { 260 syslog(LOG_ERR, "sysctl(restore_disrtcset): %m"); 261 return 1; 262 } 263 } 264 265/****** End of critical section ******/ 266 267 if (init) { 268 init = 0; 269 /* wait for signals and acts like -a */ 270 (void) sigsuspend(&emask); 271 goto again; 272 } 273 274 return 0; 275} |