2 * $RCSfile: lib_cdinfo.cpp,v $
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>
19 #include <sys/types.h>
24 #include <sys/ioctl.h>
28 #include <linux/cdrom.h>
31 #include "debugging.h"
33 #include "lib_cdinfo.h"
36 void Ccdrom::read_super(int offset)
38 /* sector 16, super block */
39 memset(buffer,0,2048);
40 lseek(fd,2048*(offset+16),SEEK_SET);
44 void Ccdrom::read_super2(int offset)
46 /* sector 0, for photocd check */
47 memset(buffer2,0,2048);
48 lseek(fd,2048*offset,SEEK_SET);
49 read(fd,buffer2,2048);
52 void Ccdrom::read_super3(int offset)
54 /* sector 4, for ufs check */
55 memset(buffer3,0,2048);
56 lseek(fd,2048*(offset+4),SEEK_SET);
57 read(fd,buffer3,2048);
60 void Ccdrom::read_super4(int offset)
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);
68 void Ccdrom::read_super5(int offset)
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);
76 int Ccdrom::is_isofs(void)
78 return 0 == strncmp(&buffer[1],"CD001",5);
81 int Ccdrom::is_hs(void)
83 return 0 == strncmp(&buffer[9],"CDROM",5);
86 int Ccdrom::is_cdi(void)
88 return (0 == strncmp(&buffer[1],"CD-I",4));
91 int Ccdrom::is_cd_rtos(void)
93 return (0 == strncmp(&buffer[8],"CD-RTOS",7));
96 int Ccdrom::is_bridge(void)
98 return (0 == strncmp(&buffer[16],"CD-BRIDGE",9));
101 int Ccdrom::is_xa(void)
103 return 0 == strncmp(&buffer[1024],"CD-XA001",8);
106 int Ccdrom::is_cdtv(void)
108 return (0 == strncmp(&buffer[8],"CDTV",4));
111 int Ccdrom::is_photocd(void)
113 return 0 == strncmp(&buffer2[64], "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", 24);
116 int Ccdrom::is_hfs(void)
118 return (0 == strncmp(&buffer2[512],"PM",2)) ||
119 (0 == strncmp(&buffer2[512],"TS",2)) ||
120 (0 == strncmp(&buffer2[1024], "BD",2));
123 int Ccdrom::is_ext2(void)
125 return 0 == strncmp(&buffer2[0x438],"\x53\xef",2);
128 int Ccdrom::is_ufs(void)
130 return 0 == strncmp(&buffer3[1372],"\x54\x19\x01\x0" ,4);
133 int Ccdrom::is_bootable(void)
135 return 0 == strncmp(&buffer4[7],"EL TORITO",9);
138 int Ccdrom::is_video_cdi(void)
140 return 0 == strncmp(&buffer5[0],"VIDEO_CD",8);
143 int Ccdrom::get_size(void) /* iso9660 volume space in 2048 byte units */
145 return ((buffer[80] & 0xff) |
146 ((buffer[81] & 0xff) << 8) |
147 ((buffer[82] & 0xff) << 16) |
148 ((buffer[83] & 0xff) << 24));
151 int Ccdrom::guess_filesystem(int start_session)
155 read_super(start_session);
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, ");
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 !!!! */
175 read_super2(start_session);
178 /* buffer2 is defined */
179 if (is_photocd()) printf("PHOTO CD, ");
180 if (is_hfs()) printf("HFS, ");
181 if (is_ext2()) printf("EXT2 FS, ");
185 ret |= FS_HIGH_SIERRA;
186 else if (is_isofs()) {
187 if (is_cd_rtos() && is_bridge())
188 ret = FS_ISO_9660_INTERACTIVE;
193 isofs_size = get_size();
195 read_super4(start_session);
198 /* buffer4 is defined */
199 if (is_bootable()) printf("BOOTABLE, ");
205 if (is_bridge() && is_xa() && is_isofs() && is_cd_rtos()) {
206 read_super5(start_session);
209 /* buffer5 is defined */
210 if (is_video_cdi()) printf("VIDEO-CDI, ");
222 read_super3(start_session);
225 /* buffer3 is defined */
226 if (is_ufs()) printf("UFS, ");