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