2005-04-17 02:20:36 +04:00
/*
* linux / fs / isofs / util . c
*/
2015-01-07 03:54:19 +03:00
# include <linux/time.h>
2005-04-26 05:32:12 +04:00
# include "isofs.h"
2005-04-17 02:20:36 +04:00
/*
* We have to convert from a MM / DD / YY format to the Unix ctime format .
* We have to take into account leap years and all of that good stuff .
* Unfortunately , the kernel does not have the information on hand to
* take into account daylight savings time , but it shouldn ' t matter .
* The time stored should be localtime ( with or without DST in effect ) ,
* and the timezone offset should hold the offset required to get back
* to GMT . Thus we should always be correct .
*/
int iso_date ( char * p , int flag )
{
int year , month , day , hour , minute , second , tz ;
2015-01-07 03:54:19 +03:00
int crtime ;
2005-04-17 02:20:36 +04:00
2015-01-07 03:54:19 +03:00
year = p [ 0 ] ;
2005-04-17 02:20:36 +04:00
month = p [ 1 ] ;
day = p [ 2 ] ;
hour = p [ 3 ] ;
minute = p [ 4 ] ;
second = p [ 5 ] ;
if ( flag = = 0 ) tz = p [ 6 ] ; /* High sierra has no time zone */
else tz = 0 ;
if ( year < 0 ) {
crtime = 0 ;
} else {
2015-01-07 03:54:19 +03:00
crtime = mktime64 ( year + 1900 , month , day , hour , minute , second ) ;
2005-04-17 02:20:36 +04:00
/* sign extend */
if ( tz & 0x80 )
tz | = ( - 1 < < 8 ) ;
/*
* The timezone offset is unreliable on some disks ,
* so we make a sanity check . In no case is it ever
* more than 13 hours from GMT , which is 52 * 15 min .
* The time is always stored in localtime with the
* timezone offset being what get added to GMT to
* get to localtime . Thus we need to subtract the offset
* to get to true GMT , which is what we store the time
* as internally . On the local system , the user may set
* their timezone any way they wish , of course , so GMT
* gets converted back to localtime on the receiving
* system .
*
* NOTE : mkisofs in versions prior to mkisofs - 1.10 had
* the sign wrong on the timezone offset . This has now
* been corrected there too , but if you are getting screwy
* results this may be the explanation . If enough people
* complain , a user configuration option could be added
* to add the timezone offset in with the wrong sign
* for ' compatibility ' with older discs , but I cannot see how
* it will matter that much .
*
* Thanks to kuhlmav @ elec . canterbury . ac . nz ( Volker Kuhlmann )
* for pointing out the sign error .
*/
if ( - 52 < = tz & & tz < = 52 )
crtime - = tz * 15 * 60 ;
}
return crtime ;
}