]> git.ozlabs.org Git - petitboot/blob - discover/cdrom.c
discover/pxe-parser: Parse simple iPXE scripts
[petitboot] / discover / cdrom.c
1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <fcntl.h>
4 #include <errno.h>
5 #include <limits.h>
6 #include <string.h>
7 #include <sys/ioctl.h>
8 #include <linux/cdrom.h>
9
10 #include <log/log.h>
11
12 #include "cdrom.h"
13
14 static int cdrom_open(const char *devpath, const char *loc)
15 {
16         int fd;
17
18         fd = open(devpath, O_RDONLY | O_NONBLOCK);
19         if (fd < 0)
20                 pb_log("%s: can't open %s: %s\n", loc, devpath,
21                                 strerror(errno));
22
23         return fd;
24 }
25
26 void cdrom_init(const char *devpath)
27 {
28         int fd, rc;
29
30         fd = cdrom_open(devpath, __func__);
31         if (fd < 0)
32                 return;
33
34         /* We disable autoclose so that any attempted mount() operation doesn't
35          * close the tray, and disable CDO_LOCK to prevent the lock status
36          * changing on open()/close()
37          */
38         rc = ioctl(fd, CDROM_CLEAR_OPTIONS, CDO_LOCK | CDO_AUTO_CLOSE);
39         if (rc < 0)
40                 pb_debug("%s: CLEAR CDO_LOCK|CDO_AUTO_CLOSE failed: %s\n",
41                                 __func__, strerror(errno));
42
43         close(fd);
44 }
45
46 bool cdrom_media_present(const char *devpath)
47 {
48         int fd, rc;
49
50         fd = cdrom_open(devpath, __func__);
51         if (fd < 0)
52                 return false;
53
54         rc = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
55
56         close(fd);
57
58         return rc == CDS_DISC_OK;
59 }
60
61 void cdrom_eject(const char *devpath)
62 {
63         int fd, rc;
64
65         fd = cdrom_open(devpath, __func__);
66         if (fd < 0)
67                 return;
68
69         /* unlock cdrom device */
70         rc = ioctl(fd, CDROM_LOCKDOOR, 0);
71         if (rc < 0)
72                 pb_log("%s: CDROM_LOCKDOOR(unlock) failed: %s\n",
73                                 __func__, strerror(errno));
74
75         rc = ioctl(fd, CDROMEJECT, 0);
76         if (rc < 0)
77                 pb_log("%s: CDROM_EJECT failed: %s\n",
78                                 __func__, strerror(errno));
79         close(fd);
80 }
81