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