aboutsummaryrefslogtreecommitdiff
path: root/findcdrom/findcdrom.c
blob: 3c99b34ee9842bcc237e32ed7f8758a634b82c87 (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
#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


int main() {
  int fd,fd2,s,t=0;
  char tmp[4096],buff[4096],*p,*f;
  static const char nocdrom[]="No CDROM found\n";

  // find CDROM detection in /proc/sys/dev/cdrom/info
  if ((fd=open("/proc/sys/dev/cdrom/info",O_RDONLY)) < 0) {
    write(2,nocdrom,sizeof(nocdrom));
    exit(1);
  }
  if (chdir("/dev")) { 
    PRINTF("Cannot chdir to /dev\n");
    exit(2);
  }
  // looking for "driver name:"
  while ((s=read(fd,tmp+t,4096-t)) > 0) {
    t+=s;
    if ((p=(char*)strstr(tmp,"\ndrive name:")) && strchr(p+=13,'\n')) {
      // have found it, looking for drive name(s)
      while (*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,4096) > 0) {
            close(fd2);
            close(fd);
            // creat the symbolic link to /dev/cdrom
            if (symlink(p,"cdrom") == 0) {
#ifdef DEBUG
              write(2,"  ",2);
#endif
              write(2,"Found CDROM: ",13);
              write(2,p,strlen(p)); 
              write(2,"\n",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,sizeof(nocdrom));
  return (4);
}