VirtualBox

source: vbox/trunk/include/iprt/isofs.h@ 43530

Last change on this file since 43530 was 40206, checked in by vboxsync, 13 years ago

iprt/isofs: gcc warning and 32-bit file size limit explanation

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.8 KB
Line 
1/** @file
2 * IPRT - ISO 9660 file system handling.
3 */
4
5/*
6 * Copyright (C) 2010 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_isofs_h
27#define ___iprt_isofs_h
28
29#include <iprt/types.h>
30#include <iprt/list.h>
31
32RT_C_DECLS_BEGIN
33
34/** @defgroup grp_rt_isofs RTIsoFs - ISO 9660 Filesystem
35 * @ingroup grp_rt
36 * @{
37 */
38
39#define RTISOFS_MAX_SYSTEM_ID 32
40#define RTISOFS_MAX_VOLUME_ID 32
41#define RTISOFS_MAX_PUBLISHER_ID 128
42#define RTISOFS_MAX_VOLUME_ID 32
43#define RTISOFS_MAX_VOLUMESET_ID 128
44#define RTISOFS_MAX_PREPARER_ID 128
45#define RTISOFS_MAX_APPLICATION_ID 128
46#define RTISOFS_MAX_STRING_LEN 255
47
48/** Standard ID of volume descriptors. */
49#define RTISOFS_STANDARD_ID "CD001"
50
51/** Default sector size. */
52#define RTISOFS_SECTOR_SIZE 2048
53
54
55#pragma pack(1)
56typedef struct RTISOFSDATESHORT
57{
58 uint8_t year;
59 uint8_t month;
60 uint8_t day;
61 uint8_t hour;
62 uint8_t minute;
63 uint8_t second;
64 int8_t gmt_offset;
65} RTISOFSDATESHORT, *PRTISOFSDATESHORT;
66
67typedef struct RTISOFSDATELONG
68{
69 char year[4];
70 char month[2];
71 char day[2];
72 char hour[2];
73 char minute[2];
74 char second[2];
75 char hseconds[2];
76 int8_t gmt_offset;
77} RTISOFSDATELONG, *PRTISOFSDATELONG;
78
79/* Directory Record. */
80typedef struct RTISOFSDIRRECORD
81{
82 uint8_t record_length;
83 uint8_t extented_attr_length;
84 uint32_t extent_location;
85 uint32_t extent_location_big;
86 uint32_t extent_data_length; /* Number of bytes (file) / len (directory). */
87 uint32_t extent_data_length_big;
88 RTISOFSDATESHORT date;
89 uint8_t flags;
90 uint8_t interleave_unit_size;
91 uint8_t interleave_gap_size;
92 uint16_t volume_sequence_number;
93 uint16_t volume_sequence_number_big;
94 uint8_t name_len;
95 /* Starting here there will be the actual directory entry name
96 * and a padding of 1 byte if name_len is odd. */
97} RTISOFSDIRRECORD, *PRTISOFSDIRRECORD;
98
99/* Primary Volume Descriptor. */
100typedef struct RTISOFSPRIVOLDESC
101{
102 uint8_t type;
103 char name_id[6];
104 uint8_t version;
105 char system_id[RTISOFS_MAX_SYSTEM_ID];
106 char volume_id[RTISOFS_MAX_VOLUME_ID];
107 uint8_t unused2[8];
108 uint32_t volume_space_size; /* Number of sectors, Little Endian. */
109 uint32_t volume_space_size_big; /* Number of sectors Big Endian. */
110 uint8_t unused3[32];
111 uint16_t volume_set_size;
112 uint16_t volume_set_size_big;
113 uint16_t volume_sequence_number;
114 uint16_t volume_sequence_number_big;
115 uint16_t logical_block_size; /* 2048. */
116 uint16_t logical_block_size_big;
117 uint32_t path_table_size; /* Size in bytes. */
118 uint32_t path_table_size_big; /* Size in bytes. */
119 uint32_t path_table_start_first;
120 uint32_t path_table_start_second;
121 uint32_t path_table_start_first_big;
122 uint32_t path_table_start_second_big;
123 RTISOFSDIRRECORD root_directory_record;
124 uint8_t directory_padding;
125 char volume_set_id[RTISOFS_MAX_VOLUMESET_ID];
126 char publisher_id[RTISOFS_MAX_PUBLISHER_ID];
127 char preparer_id[RTISOFS_MAX_PREPARER_ID];
128 char application_id[RTISOFS_MAX_APPLICATION_ID];
129 char copyright_file_id[37];
130 char abstract_file_id[37];
131 char bibliographic_file_id[37];
132 RTISOFSDATELONG creation_date;
133 RTISOFSDATELONG modification_date;
134 RTISOFSDATELONG expiration_date;
135 RTISOFSDATELONG effective_date;
136 uint8_t file_structure_version;
137 uint8_t unused4[1];
138 char application_data[512];
139 uint8_t unused5[653];
140} RTISOFSPRIVOLDESC, *PRTISOFSPRIVOLDESC;
141
142typedef struct RTISOFSPATHTABLEHEADER
143{
144 uint8_t length;
145 uint8_t extended_attr_sectors;
146 /** Sector of starting directory table. */
147 uint32_t sector_dir_table;
148 /** Index of parent directory (1 for the root). */
149 uint16_t parent_index;
150 /* Starting here there will be the name of the directory,
151 * specified by length above. */
152} RTISOFSPATHTABLEHEADER, *PRTISOFSPATHTABLEHEADER;
153
154typedef struct RTISOFSPATHTABLEENTRY
155{
156 char *path;
157 char *path_full;
158 RTISOFSPATHTABLEHEADER header;
159 RTLISTNODE Node;
160} RTISOFSPATHTABLEENTRY, *PRTISOFSPATHTABLEENTRY;
161
162typedef struct RTISOFSFILE
163{
164 RTFILE file;
165 RTLISTANCHOR listPaths;
166 RTISOFSPRIVOLDESC pvd;
167} RTISOFSFILE, *PRTISOFSFILE;
168#pragma pack()
169
170
171#ifdef IN_RING3
172/**
173 * Opens an ISO file.
174 *
175 * The following limitations apply:
176 * - Fixed sector size (2048 bytes).
177 * - No extensions (Joliet, RockRidge etc.) support (yet).
178 * - Only primary volume descriptor (PVD) handled.
179 *
180 * @return IPRT status code.
181 * @param pFile Pointer to ISO handle.
182 * @param pszFileName Path to ISO file to open.
183 */
184RTR3DECL(int) RTIsoFsOpen(PRTISOFSFILE pFile, const char *pszFileName);
185
186/**
187 * Closes an ISO file.
188 *
189 * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
190 */
191RTR3DECL(void) RTIsoFsClose(PRTISOFSFILE pFile);
192
193/**
194 * Retrieves the offset + length (both in bytes) of a given file
195 * stored in the ISO.
196 * @note According to the standard, a file cannot be larger than 2^32-1 bytes.
197 * Therefore using size_t / uint32_t is not a problem.
198 *
199 * @return IPRT status code.
200 * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
201 * @param pszPath Path of file within the ISO to retrieve information for.
202 * @param pcbOffset Pointer to store the file's absolute offset within the ISO.
203 * @param pcbLength Pointer to store the file's size.
204 */
205RTR3DECL(int) RTIsoFsGetFileInfo(PRTISOFSFILE pFile, const char *pszPath,
206 uint32_t *pcbOffset, size_t *pcbLength);
207
208/**
209 * Extracts a file from an ISO to the given destination.
210 *
211 * @return IPRT status code.
212 * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
213 * @param pszPath Path of file within the ISO to extract.
214 * @param pszDest Where to store the extracted file.
215 */
216RTR3DECL(int) RTIsoFsExtractFile(PRTISOFSFILE pFile, const char *pszSource,
217 const char *pszDest);
218#endif /* IN_RING3 */
219
220/** @} */
221
222RT_C_DECLS_END
223
224#endif
225
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette