Load /tmp/tmp.iJANi30786/cdck-0.6.0 into
[debian/cdck.git] / src / lib_cdinfo.cpp
1 /*
2  * $RCSfile: lib_cdinfo.cpp,v $
3  * $Author: swaj $
4  * $Revision: 1.4 $
5  */
6
7 /*
8  * This code is from cdinfo and has the following copyrights:
9  * (c) 1996,1997  Gerd Knorr <kraxel@cs.tu-berlin.de>
10  * and Heiko Eissfeldt <heiko@colossus.escape.de>
11  */
12
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #endif
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 #include <fcntl.h>
22 #include <errno.h>
23 #include <unistd.h>
24 #include <sys/ioctl.h>
25 #include <sys/time.h>
26 #include <stdlib.h>
27
28 #include <linux/cdrom.h>
29
30 #include "defines.h"
31 #include "debugging.h"
32 #include "lib_time.h"
33 #include "lib_cdinfo.h"
34 #include "lib_main.h"
35
36 static 
37 void cannibalize_buffer (char *buff)
38 {
39         int len = strlen(buff);
40
41         if (!len)
42                 return;
43
44         int i;
45         for (i=len-1; i>0; i--)
46         {
47                 switch (buff[i]) {
48                 case 0x20:
49                         buff[i] = 0x0;
50                         break;
51                 default:
52                         return;
53                 }
54         }
55 }
56
57 void Ccdrom::read_creation_data (void)
58 {
59         memset (buffer6, 0, 2048);
60         memset (sbuffer, 0, 256);
61         memset (sbuffer2, 0, 256);
62         memset (sbuffer3, 0, 256);
63
64         lseek (fd, 2048*16, SEEK_SET);
65         read (fd, buffer6, 2048);
66
67         memcpy (sbuffer,  buffer6 + PUBLISHER_OFFSET, PUBLISHER_LEN);
68         memcpy (sbuffer2, buffer6 + PREPARER_OFFSET , PREPARER_LEN);
69         memcpy (sbuffer3, buffer6 + SOFTWARE_OFFSET, SOFTWARE_LEN);
70
71         cannibalize_buffer (sbuffer);
72         cannibalize_buffer (sbuffer2);
73         cannibalize_buffer (sbuffer3);
74 }
75
76 void Ccdrom::read_super(int offset)
77 {
78     /* sector 16, super block */
79     memset(buffer,0,2048);
80     lseek(fd,2048*(offset+16),SEEK_SET);
81     read(fd,buffer,2048);
82 }
83
84 void Ccdrom::read_super2(int offset)
85 {
86     /* sector 0, for photocd check */
87     memset(buffer2,0,2048);
88     lseek(fd,2048*offset,SEEK_SET);
89     read(fd,buffer2,2048);
90 }
91
92 void Ccdrom::read_super3(int offset)
93 {
94     /* sector 4, for ufs check */
95     memset(buffer3,0,2048);
96     lseek(fd,2048*(offset+4),SEEK_SET);
97     read(fd,buffer3,2048);
98 }
99
100 void Ccdrom::read_super4(int offset)
101 {
102     /* sector 17, for bootable CD check */
103     memset(buffer4,0,2048);
104     lseek(fd,2048*(offset+17),SEEK_SET);
105     read(fd,buffer4,2048);
106     read_creation_data();
107 }
108
109 void Ccdrom::read_super5(int offset)
110 {
111     /* sector 150, for Video CD check */
112     memset(buffer5,0,2048);
113     lseek(fd,2048*(offset+150),SEEK_SET);
114     read(fd,buffer5,2048);
115 }
116
117 int Ccdrom::is_isofs(void)
118 {
119     return 0 == strncmp(&buffer[1],"CD001",5);
120 }
121
122 int Ccdrom::is_hs(void)
123 {
124     return 0 == strncmp(&buffer[9],"CDROM",5);
125 }
126
127 int Ccdrom::is_cdi(void)
128 {
129     return (0 == strncmp(&buffer[1],"CD-I",4));
130 }
131
132 int Ccdrom::is_cd_rtos(void)
133 {
134     return (0 == strncmp(&buffer[8],"CD-RTOS",7));
135 }
136
137 int Ccdrom::is_bridge(void)
138 {
139     return (0 == strncmp(&buffer[16],"CD-BRIDGE",9));
140 }
141
142 int Ccdrom::is_xa(void)
143 {
144     return 0 == strncmp(&buffer[1024],"CD-XA001",8);
145 }
146
147 int Ccdrom::is_cdtv(void)
148 {
149     return (0 == strncmp(&buffer[8],"CDTV",4));
150 }
151
152 int Ccdrom::is_photocd(void)
153 {
154     return 0 == strncmp(&buffer2[64], "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", 24);
155 }
156
157 int Ccdrom::is_hfs(void)
158 {
159     return (0 == strncmp(&buffer2[512],"PM",2)) ||
160            (0 == strncmp(&buffer2[512],"TS",2)) ||
161            (0 == strncmp(&buffer2[1024], "BD",2));
162 }
163
164 int Ccdrom::is_ext2(void)
165 {
166     return 0 == strncmp(&buffer2[0x438],"\x53\xef",2);
167 }
168
169 int Ccdrom::is_ufs(void)
170 {
171     return 0 == strncmp(&buffer3[1372],"\x54\x19\x01\x0" ,4);
172 }
173
174 int Ccdrom::is_bootable(void)
175 {
176     return 0 == strncmp(&buffer4[7],"EL TORITO",9);
177 }
178
179 int Ccdrom::is_video_cdi(void)
180 {
181     return 0 == strncmp(&buffer5[0],"VIDEO_CD",8);
182 }
183
184 int Ccdrom::get_size(void)              /* iso9660 volume space in 2048 byte units */
185 {
186     return ((buffer[80] & 0xff) |
187             ((buffer[81] & 0xff) << 8) |
188             ((buffer[82] & 0xff) << 16) |
189             ((buffer[83] & 0xff) << 24));
190 }
191
192 int Ccdrom::guess_filesystem(int start_session)
193 {
194     int ret = 0;
195
196     read_super(start_session);
197
198 #undef _DEBUG
199 #ifdef _DEBUG
200     /* buffer is defined */
201     if (is_cdi())     printf("CD-I, ");
202     if (is_cd_rtos()) printf("CD-RTOS, ");
203     if (is_isofs())   printf("ISOFS, ");
204     if (is_hs())      printf("HS, ");
205     if (is_bridge())  printf("BRIDGE, ");
206     if (is_xa())      printf("XA, ");
207     if (is_cdtv())    printf("CDTV, ");
208     puts("");
209 #endif
210
211     /* filesystem */
212     if (is_cdi() && is_cd_rtos() && !is_bridge() && !is_xa()) {
213         return FS_INTERACTIVE;
214     } else {    /* read sector 0 ONLY, when NO greenbook CD-I !!!! */
215
216         read_super2(start_session);
217
218 #ifdef _DEBUG
219         /* buffer2 is defined */
220         if (is_photocd()) printf("PHOTO CD, ");
221         if (is_hfs()) printf("HFS, ");
222         if (is_ext2()) printf("EXT2 FS, ");
223         puts("");
224 #endif
225         if (is_hs())
226             ret |= FS_HIGH_SIERRA;
227         else if (is_isofs()) {
228             if (is_cd_rtos() && is_bridge())
229                 ret = FS_ISO_9660_INTERACTIVE;
230             else if (is_hfs())
231                 ret = FS_ISO_HFS;
232             else
233                 ret = FS_ISO_9660;
234             isofs_size = get_size();
235
236             read_super4(start_session);
237
238 #ifdef _DEBUG
239             /* buffer4 is defined */
240             if (is_bootable()) printf("BOOTABLE, ");
241             puts("");
242 #endif
243             if (is_bootable())
244                 ret |= BOOTABLE;
245
246             if (is_bridge() && is_xa() && is_isofs() && is_cd_rtos()) {
247                 read_super5(start_session);
248
249 #ifdef _DEBUG
250                 /* buffer5 is defined */
251                 if (is_video_cdi()) printf("VIDEO-CDI, ");
252                 puts("");
253 #endif
254                 if (is_video_cdi())
255                     ret |= VIDEOCDI;
256             }
257         } else if (is_hfs())
258             ret |= FS_HFS;
259         else if (is_ext2())
260             ret |= FS_EXT2;
261         else {
262
263             read_super3(start_session);
264
265 #ifdef _DEBUG
266             /* buffer3 is defined */
267             if (is_ufs()) printf("UFS, ");
268             puts("");
269 #endif
270             if (is_ufs())
271                 ret |= FS_UFS;
272             else
273                 ret |= FS_UNKNOWN;
274         }
275     }
276     /* other checks */
277     if (is_xa())
278         ret |= XA;
279     if (is_photocd())
280         ret |= PHOTO_CD;
281     if (is_cdtv())
282         ret |= CDTV;
283     return ret;
284 }
285
286
287
288 /*
289  * __END__
290  */
291
292
293
294
295
296