Kunihiko IMAI wrote: > Package: manpages-dev > Version: 2.67-1 > Severity: minor > File: /usr/share/man/man2/settimeofday.2.gz > > > > -- System Information: > Debian Release: lenny/sid > APT prefers oldstable > APT policy: (500, 'oldstable'), (500, 'testing') > Architecture: i386 (i686) > > Kernel: Linux 2.6.18-4-486 > Locale: LANG=ja_JP.EUC-JP, LC_CTYPE=ja_JP.EUC-JP (charmap=EUC-JP) > Shell: /bin/sh linked to /bin/bash > > Versions of packages manpages-dev depends on: > ii manpages 2.67-1 Manual pages about using a > GNU/Lin > > manpages-dev recommends no packages. > > -- no debconf information > > > > `man settimeofday' says: > > The use of the timezone structure is obsolete; the tz argument > should normally be specified as NULL. > > But, on linux kernel, the FAT filesystem driver uses tz->tz_minuteswest > parameter for timestamp conversion. `tz' argument is still alive, not > retired.
Hello Kunihiko, Elsewhere in the man page it says: Under Linux there are some peculiar "warp clock" seman- tics associated with the settimeofday() system call if on the very first call (after booting) that has a non-NULL tz argument, the tv argument is NULL and the tz_min- uteswest field is nonzero. In such a case it is assumed that the CMOS clock is on local time, and that it has to be incremented by this amount to get UTC system time. No doubt it is a bad idea to use this feature. This seems to cover the point you are describing. Do you still think some change is required? Cheers, Michael > Here is the detail in kernel: > linux-2.6.17.1/kernel/time.c handles settimeofday(2) syscall and stores > tz parameter into sys_tz global variable. > ////////// > struct timezone sys_tz; > > EXPORT_SYMBOL(sys_tz); > > ...(snip)... > > int do_sys_settimeofday(struct timespec *tv, struct timezone *tz) > { > static int firsttime = 1; > int error = 0; > > if (tv && !timespec_valid(tv)) > return -EINVAL; > > error = security_settime(tv, tz); > if (error) > return error; > > if (tz) { > /* SMP safe, global irq locking makes it work. */ > sys_tz = *tz; > if (firsttime) { > firsttime = 0; > if (!tv) > warp_clock(); > } > } > if (tv) > { > /* SMP safe, again the code in arch/foo/time.c should > * globally block out interrupts when it runs. > */ > return do_settimeofday(tv); > } > return 0; > } > ////////// > > > > linux-2.6.17.1/fs/fat/misc.c uses the `sys_tz' variable for timestamp > conversion. FAT filesystem has only yy-mm-dd-hh-mm-ss format > timestamp, no timezone infomation. So linux kernel handles the > timestamp as localtime with using tz->tz_minuteswest parameter. > ////////// > extern struct timezone sys_tz; > > ...(snip)... > > /* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */ > int date_dos2unix(unsigned short time, unsigned short date) > { > int month, year, secs; > > /* > * first subtract and mask after that... Otherwise, if > * date == 0, bad things happen > */ > month = ((date >> 5) - 1) & 15; > year = date >> 9; > secs = (time & 31)*2+60*((time >> 5) & 63)+(time >> 11)*3600+86400* > ((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == > 0 && > month < 2 ? 1 : 0)+3653); > /* days since 1.1.70 plus 80's leap day */ > secs += sys_tz.tz_minuteswest*60; > return secs; > } > ////////// > > > Thanks. > ---- > Kunihiko IMAI > > > > -- Michael Kerrisk Maintainer of the Linux man-pages project http://www.kernel.org/doc/man-pages/ Want to report a man-pages bug? Look here: http://www.kernel.org/doc/man-pages/reporting_bugs.html -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]