aboutsummaryrefslogtreecommitdiff
path: root/findcdrom/findcdrom.c
blob: d0c985e0a7982cdd438e73b7eeed758a7f9903d4 (plain) (blame)
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);
}