1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#include <fcntl.h>
#ifdef DEBUG
# define PRINTF printf
#else
# define PRINTF(...)
#endif
// RETURN VALUE:
// 0 : ok
// 1 : no file /proc/sys/dev/cdrom
// 2 : failed to chdir /dev
// 3 : cdrom found but cannot creat /dev/cdrom
// 4 : no cdrom data found
#define BUFF_SIZE 4096
#define TMP_SIZE 4096
#define STR_SECT ".rodata"
#define STRING static const char __attribute__ ((__section__(STR_SECT),__aligned__(1)))
STRING dev_str[] = "/dev";
STRING cdrom_str[] = "cdrom";
STRING info_str[] = "/proc/sys/dev/cdrom/info";
STRING driver_name[] = "\ndrive name:";
STRING found_str[] = "Found CDROM: ";
STRING nocdrom_str[] = "No CDROM found\n";
STRING eol_str[] = "\n";
int main() {
int fd, fd2, s, t=0;
char *p, *f;
char tmp[TMP_SIZE], buff[BUFF_SIZE];
// find CDROM detection in /proc/sys/dev/cdrom/info
if ((fd = open(info_str, O_RDONLY)) < 0) {
write(2, nocdrom_str, sizeof(nocdrom_str) - 1);
exit(1);
}
if (chdir(dev_str)) {
PRINTF("Cannot chdir to /dev\n");
exit(2);
}
// looking for "driver name:"
while ((s = read(fd, tmp + t, TMP_SIZE - t)) > 0) {
t += s;
if (t < TMP_SIZE)
tmp[t] = 0;
else
tmp[TMP_SIZE] = 0;
if ((p = (char*)strstr(tmp, driver_name)) && strchr(p += 13, '\n')) {
// have found it, looking for drive name(s)
while (*p && *p != '\n') {
while (*p == ' ' || *p == '\t')
p++;
for (f = p; *f > ' ' ; f++);
if (*f == '\n')
*f = 0;
else
*f++ = 0;
// found and now try
PRINTF("Trying [%s]\n", p);
if ((fd2 = open(p, O_RDONLY)) >= 0) {
// read a small packet to detect valid iso9660
if (read(fd2, buff, BUFF_SIZE) > 0) {
close(fd2);
close(fd);
// creat the symbolic link to /dev/cdrom
if (symlink(p, cdrom_str) == 0) {
#ifdef DEBUG
write(2, " ", 2);
#endif
write(2, found_str, sizeof(found_str) - 1);
write(2, p, strlen(p));
write(2, eol_str, 1);
exit(0);
}
exit(3);
}
PRINTF(" read failed\n");
close(fd2);
} else {
PRINTF(" open failed\n");
}
p = f;
}
break;
}
}
if (s >= 0)
close(fd);
write(2, nocdrom_str, sizeof(nocdrom_str) - 1);
return (4);
}
|