chiark / gitweb /
switch tools and volume_id from LGPL to GPLv2
[elogind.git] / extras / cdrom_id / cdrom_id.c
1 /*
2  * cdrom_id - determines the capabilities of cdrom drives
3  *
4  * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
5  *
6  *      This program is free software; you can redistribute it and/or modify it
7  *      under the terms of the GNU General Public License as published by the
8  *      Free Software Foundation version 2 of the License.
9  *
10  */
11
12 #ifndef _GNU_SOURCE
13 #define _GNU_SOURCE 1
14 #endif
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19 #include <fcntl.h>
20 #include <ctype.h>
21 #include <errno.h>
22 #include <sys/ioctl.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <linux/types.h>
26
27 #include "../../logging.h"
28 #include "../../udev_utils.h"
29
30 /*
31  * Taken from the cdrom.h kernel include file.
32  * Included here as some distros don't have an updated version
33  * with all of the DVD flags.  So we just include our own, aren't
34  * we so nice...
35  */
36 #define CDROM_GET_CAPABILITY    0x5331  /* get capabilities */
37
38 /* capability flags used with the uniform CD-ROM driver */
39 #define CDC_CLOSE_TRAY          0x1     /* caddy systems _can't_ close */
40 #define CDC_OPEN_TRAY           0x2     /* but _can_ eject.  */
41 #define CDC_LOCK                0x4     /* disable manual eject */
42 #define CDC_SELECT_SPEED        0x8     /* programmable speed */
43 #define CDC_SELECT_DISC         0x10    /* select disc from juke-box */
44 #define CDC_MULTI_SESSION       0x20    /* read sessions>1 */
45 #define CDC_MCN                 0x40    /* Medium Catalog Number */
46 #define CDC_MEDIA_CHANGED       0x80    /* media changed */
47 #define CDC_PLAY_AUDIO          0x100   /* audio functions */
48 #define CDC_RESET               0x200   /* hard reset device */
49 #define CDC_IOCTLS              0x400   /* driver has non-standard ioctls */
50 #define CDC_DRIVE_STATUS        0x800   /* driver implements drive status */
51 #define CDC_GENERIC_PACKET      0x1000  /* driver implements generic packets */
52 #define CDC_CD_R                0x2000  /* drive is a CD-R */
53 #define CDC_CD_RW               0x4000  /* drive is a CD-RW */
54 #define CDC_DVD                 0x8000  /* drive is a DVD */
55 #define CDC_DVD_R               0x10000 /* drive can write DVD-R */
56 #define CDC_DVD_RAM             0x20000 /* drive can write DVD-RAM */
57 #define CDC_MO_DRIVE            0x40000 /* drive is an MO device */
58 #define CDC_MRW                 0x80000 /* drive can read MRW */
59 #define CDC_MRW_W               0x100000 /* drive can write MRW */
60 #define CDC_RAM                 0x200000 /* ok to open for WRITE */
61
62 #ifdef USE_LOG
63 void log_message(int priority, const char *format, ...)
64 {
65         va_list args;
66         static int udev_log = -1;
67
68         if (udev_log == -1) {
69                 const char *value;
70
71                 value = getenv("UDEV_LOG");
72                 if (value)
73                         udev_log = log_priority(value);
74                 else
75                         udev_log = LOG_ERR;
76         }
77
78         if (priority > udev_log)
79                 return;
80
81         va_start(args, format);
82         vsyslog(priority, format, args);
83         va_end(args);
84 }
85 #endif
86
87 int main(int argc, char *argv[])
88 {
89         const char *node = NULL;
90         int i;
91         int export = 0;
92         int fd;
93         int rc = 0;
94         int result;
95
96         logging_init("cdrom_id");
97
98         for (i = 1 ; i < argc; i++) {
99                 char *arg = argv[i];
100
101                 if (strcmp(arg, "--export") == 0) {
102                         export = 1;
103                 } else
104                         node = arg;
105         }
106         if (!node) {
107                 info("no node specified");
108                 rc = 1;
109                 goto exit;
110         }
111
112         fd = open(node, O_RDONLY|O_NONBLOCK);
113         if (fd < 0) {
114                 info("unable to open '%s'", node);
115                 rc = 1;
116                 goto exit;
117         }
118
119         result = ioctl(fd, CDROM_GET_CAPABILITY, NULL);
120         if (result < 0) {
121                 info("CDROM_GET_CAPABILITY failed for '%s'", node);
122                 rc = 3;
123                 goto close;
124         }
125
126         printf("ID_CDROM=1\n");
127
128         if (result & CDC_CD_R)
129                 printf("ID_CDROM_CD_R=1\n");
130         if (result & CDC_CD_RW)
131                 printf("ID_CDROM_CD_RW=1\n");
132
133         if (result & CDC_DVD)
134                 printf("ID_CDROM_DVD=1\n");
135         if (result & CDC_DVD_R)
136                 printf("ID_CDROM_DVD_R=1\n");
137         if (result & CDC_DVD_RAM)
138                 printf("ID_CDROM_DVD_RAM=1\n");
139
140         if (result & CDC_MRW)
141                 printf("ID_CDROM_MRW=1\n");
142         if (result & CDC_MRW_W)
143                 printf("ID_CDROM_MRW_W=1\n");
144
145         if (result & CDC_RAM)
146                 printf("ID_CDROM_RAM=1\n");
147 close:
148         close(fd);
149 exit:
150         logging_close();
151         return rc;
152 }