]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. | |
3 | Contributed by Paul Eggert ([email protected]). | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Library General Public License as | |
7 | published by the Free Software Foundation; either version 2 of the | |
8 | License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Library General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Library General Public | |
16 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
17 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 | Boston, MA 02111-1307, USA. */ | |
19 | ||
20 | /* | |
4b11111a MS |
21 | * dgb 10/02/98: ripped this from glibc source to help convert timestamps |
22 | * to unix time | |
23 | * 10/04/98: added new table-based lookup after seeing how ugly | |
24 | * the gnu code is | |
1da177e4 | 25 | * blf 09/27/99: ripped out all the old code and inserted new table from |
28de7948 CG |
26 | * John Brockmeyer (without leap second corrections) |
27 | * rewrote udf_stamp_to_time and fixed timezone accounting in | |
28 | * udf_time_to_stamp. | |
1da177e4 LT |
29 | */ |
30 | ||
31 | /* | |
32 | * We don't take into account leap seconds. This may be correct or incorrect. | |
33 | * For more NIST information (especially dealing with leap seconds), see: | |
28de7948 | 34 | * http://www.boulder.nist.gov/timefreq/pubs/bulletin/leapsecond.htm |
1da177e4 LT |
35 | */ |
36 | ||
78ace70c JP |
37 | #include "udfdecl.h" |
38 | ||
1da177e4 LT |
39 | #include <linux/types.h> |
40 | #include <linux/kernel.h> | |
3c399fa4 | 41 | #include <linux/time.h> |
1da177e4 | 42 | |
5ca4e4be PE |
43 | struct timespec * |
44 | udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src) | |
1da177e4 | 45 | { |
56774805 MS |
46 | u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone); |
47 | u16 year = le16_to_cpu(src.year); | |
48 | uint8_t type = typeAndTimezone >> 12; | |
1da177e4 LT |
49 | int16_t offset; |
50 | ||
cb00ea35 | 51 | if (type == 1) { |
56774805 | 52 | offset = typeAndTimezone << 4; |
1da177e4 LT |
53 | /* sign extent offset */ |
54 | offset = (offset >> 4); | |
28de7948 | 55 | if (offset == -2047) /* unspecified offset */ |
1da177e4 | 56 | offset = 0; |
cbf5676a | 57 | } else |
1da177e4 LT |
58 | offset = 0; |
59 | ||
fd3cfad3 JK |
60 | dest->tv_sec = mktime64(year, src.month, src.day, src.hour, src.minute, |
61 | src.second); | |
cbf5676a | 62 | dest->tv_sec -= offset * 60; |
cbf5676a | 63 | dest->tv_nsec = 1000 * (src.centiseconds * 10000 + |
64 | src.hundredsOfMicroseconds * 100 + src.microseconds); | |
1da177e4 LT |
65 | return dest; |
66 | } | |
67 | ||
5ca4e4be PE |
68 | struct timestamp * |
69 | udf_time_to_disk_stamp(struct timestamp *dest, struct timespec ts) | |
1da177e4 | 70 | { |
3c399fa4 | 71 | long seconds; |
1da177e4 | 72 | int16_t offset; |
3c399fa4 | 73 | struct tm tm; |
1da177e4 LT |
74 | |
75 | offset = -sys_tz.tz_minuteswest; | |
76 | ||
77 | if (!dest) | |
78 | return NULL; | |
79 | ||
56774805 | 80 | dest->typeAndTimezone = cpu_to_le16(0x1000 | (offset & 0x0FFF)); |
1da177e4 | 81 | |
3c399fa4 JK |
82 | seconds = ts.tv_sec + offset * 60; |
83 | time64_to_tm(seconds, 0, &tm); | |
84 | dest->year = cpu_to_le16(tm.tm_year + 1900); | |
85 | dest->month = tm.tm_mon + 1; | |
86 | dest->day = tm.tm_mday; | |
87 | dest->hour = tm.tm_hour; | |
88 | dest->minute = tm.tm_min; | |
89 | dest->second = tm.tm_sec; | |
1da177e4 | 90 | dest->centiseconds = ts.tv_nsec / 10000000; |
4b11111a MS |
91 | dest->hundredsOfMicroseconds = (ts.tv_nsec / 1000 - |
92 | dest->centiseconds * 10000) / 100; | |
28de7948 CG |
93 | dest->microseconds = (ts.tv_nsec / 1000 - dest->centiseconds * 10000 - |
94 | dest->hundredsOfMicroseconds * 100); | |
1da177e4 LT |
95 | return dest; |
96 | } | |
97 | ||
98 | /* EOF */ |