From ea64a36a446a5d5ba549a52a70787163f6ccda68 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 27 Jun 2005 12:07:49 +0000 Subject: [PATCH] Add a check for sg_io_hdr_t and (not tested) check for scsireq_t presence. --- configure | 232 ++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 7 ++ dlls/ntdll/cdrom.c | 32 +++--- include/config.h.in | 6 ++ 4 files changed, 258 insertions(+), 19 deletions(-) diff --git a/configure b/configure index e5d5e92565b..09710cc7678 100755 --- a/configure +++ b/configure @@ -19426,6 +19426,238 @@ _ACEOF fi +echo "$as_me:$LINENO: checking for scsireq_t.cmd" >&5 +echo $ECHO_N "checking for scsireq_t.cmd... $ECHO_C" >&6 +if test "${ac_cv_member_scsireq_t_cmd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef HAVE_SCSI_SG_H +#include +#endif + +int +main () +{ +static scsireq_t ac_aggr; +if (ac_aggr.cmd) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_scsireq_t_cmd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef HAVE_SCSI_SG_H +#include +#endif + +int +main () +{ +static scsireq_t ac_aggr; +if (sizeof ac_aggr.cmd) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_scsireq_t_cmd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_member_scsireq_t_cmd=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_member_scsireq_t_cmd" >&5 +echo "${ECHO_T}$ac_cv_member_scsireq_t_cmd" >&6 +if test $ac_cv_member_scsireq_t_cmd = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_SCSIREQ_T_CMD 1 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking for sg_io_hdr_t.interface_id" >&5 +echo $ECHO_N "checking for sg_io_hdr_t.interface_id... $ECHO_C" >&6 +if test "${ac_cv_member_sg_io_hdr_t_interface_id+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef HAVE_SCSI_SG_H +#include +#endif + +int +main () +{ +static sg_io_hdr_t ac_aggr; +if (ac_aggr.interface_id) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_sg_io_hdr_t_interface_id=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef HAVE_SCSI_SG_H +#include +#endif + +int +main () +{ +static sg_io_hdr_t ac_aggr; +if (sizeof ac_aggr.interface_id) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_sg_io_hdr_t_interface_id=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_member_sg_io_hdr_t_interface_id=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_member_sg_io_hdr_t_interface_id" >&5 +echo "${ECHO_T}$ac_cv_member_sg_io_hdr_t_interface_id" >&6 +if test $ac_cv_member_sg_io_hdr_t_interface_id = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_SG_IO_HDR_T_INTERFACE_ID 1 +_ACEOF + + +fi + + echo "$as_me:$LINENO: checking for siginfo_t.si_fd" >&5 echo $ECHO_N "checking for siginfo_t.si_fd... $ECHO_C" >&6 if test "${ac_cv_member_siginfo_t_si_fd+set}" = set; then diff --git a/configure.ac b/configure.ac index 07c04097ecc..3eb89f5c49f 100644 --- a/configure.ac +++ b/configure.ac @@ -1463,6 +1463,13 @@ AC_CHECK_MEMBERS([struct msghdr.msg_accrights, struct sockaddr.sa_len, struct so # include #endif]) +dnl Check for scsireq_t and sg_io_hdr_t members +AC_CHECK_MEMBERS([scsireq_t.cmd, sg_io_hdr_t.interface_id],,, +[#include +#ifdef HAVE_SCSI_SG_H +#include +#endif]) + dnl Check for siginfo_t members AC_CHECK_MEMBERS([siginfo_t.si_fd],,,[#include ]) diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c index feb975d1c2d..bc4e6de58e0 100644 --- a/dlls/ntdll/cdrom.c +++ b/dlls/ntdll/cdrom.c @@ -1403,9 +1403,11 @@ static NTSTATUS CDROM_RawRead(int fd, const RAW_READ_INFO* raw, void* buffer, DW static NTSTATUS CDROM_ScsiPassThroughDirect(int fd, PSCSI_PASS_THROUGH_DIRECT pPacket) { int ret = STATUS_NOT_SUPPORTED; - -#if defined(linux) +#ifdef HAVE_SG_IO_HDR_T_INTERFACE_ID sg_io_hdr_t cmd; +#elif defined HAVE_SCSIREQ_T_CMD + scsireq_t cmd; +#endif int io; if (pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT)) @@ -1420,6 +1422,7 @@ static NTSTATUS CDROM_ScsiPassThroughDirect(int fd, PSCSI_PASS_THROUGH_DIRECT pP if (pPacket->DataTransferLength > 0 && !pPacket->DataBuffer) return STATUS_INVALID_PARAMETER; +#ifdef HAVE_SG_IO_HDR_T_INTERFACE_ID RtlZeroMemory(&cmd, sizeof(cmd)); cmd.interface_id = 'S'; @@ -1454,18 +1457,7 @@ static NTSTATUS CDROM_ScsiPassThroughDirect(int fd, PSCSI_PASS_THROUGH_DIRECT pP ret = CDROM_GetStatusCode(io); -#elif defined(__NetBSD__) - scsireq_t cmd; - int io; - - if (pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT)) - return STATUS_BUFFER_TOO_SMALL; - - if (pPacket->CdbLength > 12) - return STATUS_INVALID_PARAMETER; - - if (pPacket->SenseInfoLength > SENSEBUFLEN) - return STATUS_INVALID_PARAMETER; +#elif defined HAVE_SCSIREQ_T_CMD memset(&cmd, 0, sizeof(cmd)); memcpy(&(cmd.cmd), &(pPacket->Cdb), pPacket->CdbLength); @@ -1526,8 +1518,11 @@ static NTSTATUS CDROM_ScsiPassThroughDirect(int fd, PSCSI_PASS_THROUGH_DIRECT pP static NTSTATUS CDROM_ScsiPassThrough(int fd, PSCSI_PASS_THROUGH pPacket) { int ret = STATUS_NOT_SUPPORTED; -#if defined(linux) +#ifdef HAVE_SG_IO_HDR_T_INTERFACE_ID sg_io_hdr_t cmd; +#elif defined HAVE_SCSIREQ_T_CMD + scsireq_t cmd; +#endif int io; if (pPacket->Length < sizeof(SCSI_PASS_THROUGH)) @@ -1542,6 +1537,7 @@ static NTSTATUS CDROM_ScsiPassThrough(int fd, PSCSI_PASS_THROUGH pPacket) if (pPacket->DataTransferLength > 0 && pPacket->DataBufferOffset < sizeof(SCSI_PASS_THROUGH)) return STATUS_INVALID_PARAMETER; +#ifdef HAVE_SG_IO_HDR_T_INTERFACE_ID RtlZeroMemory(&cmd, sizeof(cmd)); cmd.interface_id = 'S'; @@ -1578,9 +1574,7 @@ static NTSTATUS CDROM_ScsiPassThrough(int fd, PSCSI_PASS_THROUGH pPacket) ret = CDROM_GetStatusCode(io); -#elif defined(__NetBSD__) - scsireq_t cmd; - int io; +#elif defined HAVE_SCSIREQ_T_CMD if (pPacket->Length < sizeof(SCSI_PASS_THROUGH)) return STATUS_BUFFER_TOO_SMALL; @@ -1660,7 +1654,7 @@ static NTSTATUS CDROM_ScsiGetCaps(PIO_SCSI_CAPABILITIES caps) NTSTATUS ret = STATUS_NOT_IMPLEMENTED; caps->Length = sizeof(*caps); -#if defined(linux) +#ifdef SG_SCATTER_SZ caps->MaximumTransferLength = SG_SCATTER_SZ; /* FIXME */ caps->MaximumPhysicalPages = SG_SCATTER_SZ / getpagesize(); caps->SupportedAsynchronousEvents = TRUE; diff --git a/include/config.h.in b/include/config.h.in index 05590d44f0d..f3fb23dd326 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -497,6 +497,9 @@ /* Define to 1 if you have the `sched_yield' function. */ #undef HAVE_SCHED_YIELD +/* Define to 1 if `cmd' is member of `scsireq_t'. */ +#undef HAVE_SCSIREQ_T_CMD + /* Define to 1 if you have the header file. */ #undef HAVE_SCSI_SCSI_H @@ -515,6 +518,9 @@ /* Define to 1 if you have the `settimeofday' function. */ #undef HAVE_SETTIMEOFDAY +/* Define to 1 if `interface_id' is member of `sg_io_hdr_t'. */ +#undef HAVE_SG_IO_HDR_T_INTERFACE_ID + /* Define if sigaddset is supported */ #undef HAVE_SIGADDSET