2 * $RCSfile: lib_cdinfo.cpp,v $
13 #include <sys/types.h>
18 #include <sys/ioctl.h>
22 #include <linux/cdrom.h>
25 #include "debugging.h"
27 #include "lib_cdinfo.h"
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>
35 void Ccdrom::read_super(int offset)
37 /* sector 16, super block */
38 memset(buffer,0,2048);
39 lseek(fd,2048*(offset+16),SEEK_SET);
43 void Ccdrom::read_super2(int offset)
45 /* sector 0, for photocd check */
46 memset(buffer2,0,2048);
47 lseek(fd,2048*offset,SEEK_SET);
48 read(fd,buffer2,2048);
51 void Ccdrom::read_super3(int offset)
53 /* sector 4, for ufs check */
54 memset(buffer3,0,2048);
55 lseek(fd,2048*(offset+4),SEEK_SET);
56 read(fd,buffer3,2048);
59 void Ccdrom::read_super4(int offset)
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);
67 void Ccdrom::read_super5(int offset)
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);
75 int Ccdrom::is_isofs(void)
77 return 0 == strncmp(&buffer[1],"CD001",5);
80 int Ccdrom::is_hs(void)
82 return 0 == strncmp(&buffer[9],"CDROM",5);
85 int Ccdrom::is_cdi(void)
87 return (0 == strncmp(&buffer[1],"CD-I",4));
90 int Ccdrom::is_cd_rtos(void)
92 return (0 == strncmp(&buffer[8],"CD-RTOS",7));
95 int Ccdrom::is_bridge(void)
97 return (0 == strncmp(&buffer[16],"CD-BRIDGE",9));
100 int Ccdrom::is_xa(void)
102 return 0 == strncmp(&buffer[1024],"CD-XA001",8);
105 int Ccdrom::is_cdtv(void)
107 return (0 == strncmp(&buffer[8],"CDTV",4));
110 int Ccdrom::is_photocd(void)
112 return 0 == strncmp(&buffer2[64], "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", 24);
115 int Ccdrom::is_hfs(void)
117 return (0 == strncmp(&buffer2[512],"PM",2)) ||
118 (0 == strncmp(&buffer2[512],"TS",2)) ||
119 (0 == strncmp(&buffer2[1024], "BD",2));
122 int Ccdrom::is_ext2(void)
124 return 0 == strncmp(&buffer2[0x438],"\x53\xef",2);
127 int Ccdrom::is_ufs(void)
129 return 0 == strncmp(&buffer3[1372],"\x54\x19\x01\x0" ,4);
132 int Ccdrom::is_bootable(void)
134 return 0 == strncmp(&buffer4[7],"EL TORITO",9);
137 int Ccdrom::is_video_cdi(void)
139 return 0 == strncmp(&buffer5[0],"VIDEO_CD",8);
142 int Ccdrom::get_size(void) /* iso9660 volume space in 2048 byte units */
144 return ((buffer[80] & 0xff) |
145 ((buffer[81] & 0xff) << 8) |
146 ((buffer[82] & 0xff) << 16) |
147 ((buffer[83] & 0xff) << 24));
150 int Ccdrom::guess_filesystem(int start_session)
154 read_super(start_session);
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, ");
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 !!!! */
174 read_super2(start_session);
177 /* buffer2 is defined */
178 if (is_photocd()) printf("PHOTO CD, ");
179 if (is_hfs()) printf("HFS, ");
180 if (is_ext2()) printf("EXT2 FS, ");
184 ret |= FS_HIGH_SIERRA;
185 else if (is_isofs()) {
186 if (is_cd_rtos() && is_bridge())
187 ret = FS_ISO_9660_INTERACTIVE;
192 isofs_size = get_size();
194 read_super4(start_session);
197 /* buffer4 is defined */
198 if (is_bootable()) printf("BOOTABLE, ");
204 if (is_bridge() && is_xa() && is_isofs() && is_cd_rtos()) {
205 read_super5(start_session);
208 /* buffer5 is defined */
209 if (is_video_cdi()) printf("VIDEO-CDI, ");
221 read_super3(start_session);
224 /* buffer3 is defined */
225 if (is_ufs()) printf("UFS, ");