brasero r641 - in trunk: . src
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r641 - in trunk: . src
- Date: Sun, 17 Feb 2008 13:01:47 +0000 (GMT)
Author: philippr
Date: Sun Feb 17 13:01:47 2008
New Revision: 641
URL: http://svn.gnome.org/viewvc/brasero?rev=641&view=rev
Log:
2008-02-17 Philippe Rouquier <philippr svn gnome org>
Add FreeBSD support
Patch and work by Joe Marcus Clarke <marcus FreeBSD org>
* configure.in:
* src/Makefile.am:
* src/scsi-cam.c: (brasero_scsi_command_issue_sync),
(brasero_scsi_command_new), (brasero_scsi_command_free),
(brasero_device_handle_open), (brasero_device_handle_close),
(brasero_device_handle_get_fd):
* src/scsi-sg.c:
Added:
trunk/src/scsi-cam.c
Modified:
trunk/ChangeLog
trunk/configure.in
trunk/src/Makefile.am
trunk/src/scsi-sg.c
Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in (original)
+++ trunk/configure.in Sun Feb 17 13:01:47 2008
@@ -39,15 +39,24 @@
AC_HEADER_STDC
dnl ***************** SCSI related *****************************
+AC_SUBST(BRASERO_SCSI_LIBS)
+AC_CHECK_HEADERS([camlib.h],[has_cam="yes"],[has_cam="no"])
+
+if test x"$has_cam" = x"yes"; then
+ BRASERO_SCSI_LIBS="-lcam"
+else
dnl ***************** check for linux sg interface *************
AC_CHECK_TYPES([sg_io_hdr_t],[has_sg="yes"],[has_sg="no"],
[#include <sys/types.h>
#include <scsi/sg.h>])
-if test x"$has_sg" = "xno"; then
+if test x"$has_sg" = x"no"; then
AC_ERROR([Linux sg interface headers could not be found])
fi
+fi
+AM_CONDITIONAL(HAVE_CAM_LIB_H, test x"$has_cam" = "xyes")
+AM_CONDITIONAL(HAVE_SG_IO_HDR_T, test x"$has_sg" = "xyes")
dnl ***************** LARGE FILE SUPPORT ***********************
@@ -111,7 +120,7 @@
AC_SUBST(BRASERO_CFLAGS)
AC_SUBST(BRASERO_LIBS)
BRASERO_CFLAGS="$BRASERO_BASE_CFLAGS $BRASERO_GSTREAMER_CFLAGS $BRASERO_GNOMEVFS_CFLAGS $BRASERO_CFLAGS $CFLAGS"
-BRASERO_LIBS="$BRASERO_BASE_LIBS $BRASERO_BASE_LIBS $BRASERO_GNOMEVFS_LIBS $BRASERO_LIBS $LDFLAGS"
+BRASERO_LIBS="$BRASERO_BASE_LIBS $BRASERO_GSTREAMER_LIBS $BRASERO_GNOMEVFS_LIBS $BRASERO_LIBS $BRASERO_SCSI_LIBS $LDFLAGS"
dnl ****************check for libburn (optional)**************
LIBBURN_REQUIRED=0.4.0
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Sun Feb 17 13:01:47 2008
@@ -21,8 +21,6 @@
AM_CFLAGS = -g
-EXTRA_DIST = cd-content-marshal.list
-
GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
RECMARSHALFILES = brasero-marshal.h brasero-marshal.c
brasero-marshal.h: brasero-marshal.list
@@ -148,7 +146,6 @@
scsi-read-toc-pma-atip.h \
scsi-sense-data.c \
scsi-sense-data.h \
- scsi-sg.c \
scsi-utils.h \
scsi-q-subchannel.h \
scsi-error.c \
@@ -240,6 +237,16 @@
brasero_SOURCES += brasero-file-monitor.c brasero-file-monitor.h
endif
+# FreeBSD's SCSI CAM interface
+if HAVE_CAM_LIB_H
+brasero_SOURCES += scsi-cam.c
+endif
+
+# Linux's SCSI CAM interface
+if HAVE_SG_IO_HDR_T
+brasero_SOURCES += scsi-sg.c
+endif
+
brasero_LDADD = \
$(BRASERO_LIBS)
Added: trunk/src/scsi-cam.c
==============================================================================
--- (empty file)
+++ trunk/src/scsi-cam.c Sun Feb 17 13:01:47 2008
@@ -0,0 +1,191 @@
+/***************************************************************************
+ * scsi-cam.c
+ *
+ * Saturday February 16, 2008
+ * Copyright 2008 Joe Marcus Clarke
+ * <marcus FreeBSD org>
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "scsi-command.h"
+#include "burn-debug.h"
+#include "scsi-utils.h"
+#include "scsi-error.h"
+#include "scsi-sense-data.h"
+
+/* FreeBSD's SCSI CAM interface */
+
+#include <camlib.h>
+#include <cam/scsi/scsi_message.h>
+
+struct _BraseroDeviceHandle {
+ struct cam_device *cam;
+ int fd;
+};
+
+struct _BraseroScsiCmd {
+ uchar cmd [BRASERO_SCSI_CMD_MAX_LEN];
+ BraseroDeviceHandle *handle;
+
+ const BraseroScsiCmdInfo *info;
+};
+typedef struct _BraseroScsiCmd BraseroScsiCmd;
+
+#define BRASERO_SCSI_CMD_OPCODE_OFF 0
+#define BRASERO_SCSI_CMD_SET_OPCODE(command) (command->cmd [BRASERO_SCSI_CMD_OPCODE_OFF] = command->info->opcode)
+
+#define OPEN_FLAGS O_RDONLY /*|O_EXCL */|O_NONBLOCK
+
+BraseroScsiResult
+brasero_scsi_command_issue_sync (gpointer command,
+ gpointer buffer,
+ int size,
+ BraseroScsiErrCode *error)
+{
+ int timeout;
+ BraseroScsiCmd *cmd;
+ union ccb cam_ccb;
+ int direction = -1;
+
+ timeout = 10;
+
+ memset (&cam_ccb, 0, sizeof(cam_ccb));
+ cmd = command;
+
+ cam_ccb.ccb_h.path_id = cmd->handle->cam->path_id;
+ cam_ccb.ccb_h.target_id = cmd->handle->cam->target_id;
+ cam_ccb.ccb_h.target_lun = cmd->handle->cam->target_lun;
+
+ if (cmd->info->direction & BRASERO_SCSI_READ)
+ direction = CAM_DIR_IN;
+ else if (cmd->info->direction & BRASERO_SCSI_WRITE)
+ direction = CAM_DIR_OUT;
+
+ g_assert (direction > -1);
+
+ cam_fill_csio(&cam_ccb.csio,
+ 1,
+ NULL,
+ direction,
+ MSG_SIMPLE_Q_TAG,
+ buffer,
+ size,
+ sizeof(cam_ccb.csio.sense_data),
+ cmd->info->size,
+ timeout * 1000);
+
+ memcpy (cam_ccb.csio.cdb_io.cdb_bytes, cmd->cmd,
+ BRASERO_SCSI_CMD_MAX_LEN);
+
+ if (cam_send_ccb (cmd->handle->cam, &cam_ccb) == -1) {
+ BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_ERRNO);
+ return BRASERO_SCSI_FAILURE;
+ }
+
+ if ((cam_ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ BRASERO_SCSI_SET_ERRCODE (error, BRASERO_SCSI_ERRNO);
+ return BRASERO_SCSI_FAILURE;
+ }
+
+ return BRASERO_SCSI_OK;
+}
+
+gpointer
+brasero_scsi_command_new (const BraseroScsiCmdInfo *info,
+ BraseroDeviceHandle *handle)
+{
+ BraseroScsiCmd *cmd;
+
+ /* make sure we can set the flags of the descriptor */
+
+ /* allocate the command */
+ cmd = g_new0 (BraseroScsiCmd, 1);
+ cmd->info = info;
+ cmd->handle = handle;
+
+ BRASERO_SCSI_CMD_SET_OPCODE (cmd);
+ return cmd;
+}
+
+BraseroScsiResult
+brasero_scsi_command_free (gpointer cmd)
+{
+ g_free (cmd);
+ return BRASERO_SCSI_OK;
+}
+
+/**
+ * This is to open a device
+ */
+
+BraseroDeviceHandle *
+brasero_device_handle_open (const gchar *path,
+ BraseroScsiErrCode *code)
+{
+ int fd;
+ BraseroDeviceHandle *handle;
+ struct cam_device *cam;
+
+ g_assert (path != NULL);
+
+ /* cam_open_device() fails unless we use O_RDWR */
+ cam = cam_open_device (path, O_RDWR);
+ fd = open (path, OPEN_FLAGS);
+ if (cam && fd > -1) {
+ handle = g_new0 (BraseroDeviceHandle, 1);
+ handle->cam = cam;
+ handle->fd = fd;
+ }
+
+ return handle;
+}
+
+void
+brasero_device_handle_close (BraseroDeviceHandle *handle)
+{
+ g_assert (handle != NULL);
+
+ if (handle->cam)
+ cam_close_device (handle->cam);
+
+ close (handle->fd);
+
+ g_free (handle);
+}
+
+int
+brasero_device_handle_get_fd (BraseroDeviceHandle *handle)
+{
+ g_assert (handle != NULL);
+
+ return handle->fd;
+}
+
Modified: trunk/src/scsi-sg.c
==============================================================================
--- trunk/src/scsi-sg.c (original)
+++ trunk/src/scsi-sg.c Sun Feb 17 13:01:47 2008
@@ -34,7 +34,9 @@
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
+
#include <scsi/scsi.h>
+#include <scsi/sg.h>
#include "scsi-command.h"
#include "burn-debug.h"
@@ -42,11 +44,6 @@
#include "scsi-error.h"
#include "scsi-sense-data.h"
-/* Only work for linux when it has the SG interface */
-#if HAVE_SG_IO_HDR_T
-
-#include <scsi/sg.h>
-
struct _BraseroDeviceHandle {
int fd;
};
@@ -198,4 +195,3 @@
return handle->fd;
}
-#endif /* HAVE_SG_IO_HDR_T */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]