summaryrefslogtreecommitdiffstats
path: root/sysutils/nautilus-cd-burner/files/patch-cd-drive.c
blob: 382c813439234fe1238aa26b3eb4a447476a61d9 (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
99
100
101
102
103
104
105
106
107
--- cd-drive.c.orig Mon May 19 06:16:13 2003
+++ cd-drive.c  Thu May 22 19:10:36 2003
@@ -40,6 +40,12 @@
 #include <scsi/sg.h>
 #endif /* __linux__ */
 
+#ifdef __FreeBSD__
+#include <sys/cdio.h>
+#include <sys/cdrio.h>
+#include <camlib.h>
+#endif
+
 #include <glib.h>
 #include <libgnome/gnome-i18n.h>
 
@@ -603,6 +610,80 @@
 }
 #endif /* __linux__ */
 
+#ifdef __FreeBSD__
+static GList *
+freebsd_scan (gboolean recorder_only)
+{
+   GList *cdroms_list = NULL;
+   const char *dev_type = "cd";
+   int fd;
+   int speed = 16; /* XXX Set the write speed to 16. */
+   int max_speed = CDR_MAX_SPEED;
+   int i = 0;
+
+   while (1) {
+       CDDriveType type = CDDRIVE_TYPE_CD_RECORDER;
+       CDDrive *cdrom;
+           gchar *cam_path = g_strdup_printf ("/dev/%s%dc", dev_type, i);
+       gchar *dev;
+       struct cam_device *cam_dev;
+
+       if (!g_file_test (cam_path, G_FILE_TEST_EXISTS)) {
+               g_free (cam_path);
+           break;
+       }
+
+       if ((cam_dev = cam_open_spec_device (dev_type, i, O_RDWR, NULL)) == NULL) {
+           i++;
+           g_free (cam_path);
+           continue;
+       }
+
+       /* XXX Other controllers might need to be added. */
+       if ((strncmp (cam_dev->sim_name, "ata", 3)) == 0) {
+               dev = g_strdup_printf ("/dev/a%s%dc", dev_type, i);
+       } else {
+               dev = g_strdup (cam_path);
+       }
+
+       g_free (cam_path);
+
+       if ((fd = open (dev, O_RDWR, 0)) < 0) {
+               g_free (dev);
+           free (cam_dev);
+           i++;
+           continue;
+       }
+
+       if (ioctl (fd, CDRIOCWRITESPEED, &max_speed) < 0) {
+           type = CDDRIVE_TYPE_CD_DRIVE;
+       }
+
+       close (fd);
+
+       if (type == CDDRIVE_TYPE_CD_RECORDER || recorder_only == FALSE) {
+               cdrom = g_new0 (CDDrive, 1);
+           cdrom->display_name = g_strdup_printf ("%s %s", cam_dev->inq_data.vendor, cam_dev->inq_data.revision);
+           cdrom->device = g_strdup (dev);
+           cdrom->max_speed_read = speed;
+           cdrom->max_speed_write = speed;
+           cdrom->cdrecord_id = g_strdup_printf ("%d,%d,%d", cam_dev->path_id, cam_dev->target_id, cam_dev->target_lun);
+           cdrom->type = type;
+
+           cdroms_list = g_list_append (cdroms_list, cdrom);
+       }
+
+       g_free (dev);
+       free (cam_dev);
+
+       i++;
+   }
+
+   return cdroms_list;
+}
+#endif /* __FreeBSD__ */
+   
+
 GList *
 scan_for_cdroms (gboolean recorder_only, gboolean add_image)
 {
@@ -611,6 +692,10 @@
 
 #ifdef __linux__
    cdroms = linux_scan (recorder_only);
+#endif
+
+#ifdef __FreeBSD__
+   cdroms = freebsd_scan (recorder_only);
 #endif
 
    if (add_image) {