Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
isofs
util.c
Go to the documentation of this file.
1
/*
2
* linux/fs/isofs/util.c
3
*/
4
5
#include "
isofs.h
"
6
7
/*
8
* We have to convert from a MM/DD/YY format to the Unix ctime format.
9
* We have to take into account leap years and all of that good stuff.
10
* Unfortunately, the kernel does not have the information on hand to
11
* take into account daylight savings time, but it shouldn't matter.
12
* The time stored should be localtime (with or without DST in effect),
13
* and the timezone offset should hold the offset required to get back
14
* to GMT. Thus we should always be correct.
15
*/
16
17
int
iso_date
(
char
*
p
,
int
flag
)
18
{
19
int
year
,
month
,
day
,
hour
,
minute
,
second
,
tz
;
20
int
crtime, days,
i
;
21
22
year = p[0] - 70;
23
month = p[1];
24
day = p[2];
25
hour = p[3];
26
minute = p[4];
27
second = p[5];
28
if
(flag == 0) tz = p[6];
/* High sierra has no time zone */
29
else
tz = 0;
30
31
if
(year < 0) {
32
crtime = 0;
33
}
else
{
34
int
monlen[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
35
36
days = year * 365;
37
if
(year > 2)
38
days += (year+1) / 4;
39
for
(i = 1; i <
month
; i++)
40
days += monlen[i-1];
41
if
(((year+2) % 4) == 0 && month > 2)
42
days++;
43
days += day - 1;
44
crtime = ((((days * 24) + hour) * 60 +
minute
) * 60)
45
+
second
;
46
47
/* sign extend */
48
if
(tz & 0x80)
49
tz |= (-1 << 8);
50
51
/*
52
* The timezone offset is unreliable on some disks,
53
* so we make a sanity check. In no case is it ever
54
* more than 13 hours from GMT, which is 52*15min.
55
* The time is always stored in localtime with the
56
* timezone offset being what get added to GMT to
57
* get to localtime. Thus we need to subtract the offset
58
* to get to true GMT, which is what we store the time
59
* as internally. On the local system, the user may set
60
* their timezone any way they wish, of course, so GMT
61
* gets converted back to localtime on the receiving
62
* system.
63
*
64
* NOTE: mkisofs in versions prior to mkisofs-1.10 had
65
* the sign wrong on the timezone offset. This has now
66
* been corrected there too, but if you are getting screwy
67
* results this may be the explanation. If enough people
68
* complain, a user configuration option could be added
69
* to add the timezone offset in with the wrong sign
70
* for 'compatibility' with older discs, but I cannot see how
71
* it will matter that much.
72
*
73
* Thanks to
[email protected]
(Volker Kuhlmann)
74
* for pointing out the sign error.
75
*/
76
if
(-52 <= tz && tz <= 52)
77
crtime -= tz * 15 * 60;
78
}
79
return
crtime;
80
}
Generated on Thu Jan 10 2013 13:19:37 for Linux Kernel by
1.8.2