1 /* $NetBSD: cd9660_conversion.c,v 1.4 2007/03/14 14:11:17 christos Exp $ */
4 * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan
5 * Perez-Rathke and Ram Vedam. All rights reserved.
7 * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys,
8 * Alan Perez-Rathke and Ram Vedam.
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
20 * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN
21 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN
25 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
36 #include <sys/cdefs.h>
37 #if defined(__RCSID) && !defined(__lint)
38 __RCSID("$NetBSD: cd9660_conversion.c,v 1.4 2007/03/14 14:11:17 christos Exp $");
42 static char cd9660_compute_gm_offset(time_t);
46 cd9660_pad_even(length
)
49 return length
+ (length
& 0x01);
54 * These can probably be implemented using a macro
59 cd9660_721(uint16_t w
, unsigned char *twochar
)
61 #if BYTE_ORDER == BIG_ENDIAN
68 cd9660_731(uint32_t w
, unsigned char *fourchar
)
70 #if BYTE_ORDER == BIG_ENDIAN
73 memcpy(fourchar
,&w
,4);
78 cd9660_722(uint16_t w
, unsigned char *twochar
)
80 #if BYTE_ORDER == LITTLE_ENDIAN
87 cd9660_732(uint32_t w
, unsigned char *fourchar
)
89 #if BYTE_ORDER == LITTLE_ENDIAN
92 memcpy(fourchar
,&w
,4);
96 * Convert a dword into a double endian string of eight characters
97 * @param int The double word to convert
98 * @param char* The string to write the both endian double word to - It is assumed this is allocated and at least
99 * eight characters long
102 cd9660_bothendian_dword(uint32_t dw
, unsigned char *eightchar
)
105 #if BYTE_ORDER == LITTLE_ENDIAN
109 #if BYTE_ORDER == BIG_ENDIAN
113 memcpy(eightchar
, &le
, 4);
114 memcpy((eightchar
+4), &be
, 4);
118 * Convert a word into a double endian string of four characters
119 * @param int The word to convert
120 * @param char* The string to write the both endian word to - It is assumed this is allocated and at least
121 * four characters long
124 cd9660_bothendian_word(uint16_t dw
, unsigned char *fourchar
)
127 #if BYTE_ORDER == LITTLE_ENDIAN
131 #if BYTE_ORDER == BIG_ENDIAN
135 memcpy(fourchar
, &le
, 2);
136 memcpy((fourchar
+2), &be
, 2);
140 cd9660_pad_string_spaces(char *str
, int len
)
144 for (i
= 0; i
< len
; i
++) {
151 cd9660_compute_gm_offset(time_t tim
)
155 (void)localtime_r(&tim
, &t
);
156 (void)gmtime_r(&tim
, &gm
);
157 gm
.tm_year
-= t
.tm_year
;
158 gm
.tm_yday
-= t
.tm_yday
;
159 gm
.tm_hour
-= t
.tm_hour
;
160 gm
.tm_min
-= t
.tm_min
;
163 else if (gm
.tm_year
> 0)
166 return (char)(-(gm
.tm_min
+ 60* (24 * gm
.tm_yday
+ gm
.tm_hour
)) / 15);
169 /* Long dates: 17 characters */
171 cd9660_time_8426(unsigned char *buf
, time_t tim
)
176 (void)localtime_r(&tim
, &t
);
177 (void)snprintf(temp
, sizeof(temp
), "%04i%02i%02i%02i%02i%02i%02i",
185 (void)memcpy(buf
, temp
, 16);
186 buf
[16] = cd9660_compute_gm_offset(tim
);
189 /* Short dates: 7 characters */
191 cd9660_time_915(unsigned char *buf
, time_t tim
)
195 (void)localtime_r(&tim
, &t
);
202 buf
[6] = cd9660_compute_gm_offset(tim
);