diff --git a/lib/driver/MSWindows/win32.c b/lib/driver/MSWindows/win32.c index e2345e88..ef349a23 100644 --- a/lib/driver/MSWindows/win32.c +++ b/lib/driver/MSWindows/win32.c @@ -685,6 +685,8 @@ get_arg_win32 (void *p_user_data, const char key[]) case _AM_NONE: return "no access method"; } + } else if (!strcmp (key, "scsi-tuple")) { + return p_env->gen.scsi_tuple; } else if (!strcmp (key, "mmc-supported?")) { return is_mmc_supported(p_user_data) ? "true" : "false"; } diff --git a/lib/driver/MSWindows/win32_ioctl.c b/lib/driver/MSWindows/win32_ioctl.c index f83b6872..3b523147 100644 --- a/lib/driver/MSWindows/win32_ioctl.c +++ b/lib/driver/MSWindows/win32_ioctl.c @@ -65,6 +65,9 @@ static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.30 2008/04/21 18:30:21 karl #include "cdtext_private.h" #include "cdio/logging.h" +#define MAX_ERROR_BUFFER 256 +#define MAX_DATA_BUFFER 2048 + typedef struct _TRACK_DATA_FULL { UCHAR SessionNumber; UCHAR Control : 4; @@ -412,6 +415,54 @@ close_tray_win32ioctl (const char *psz_win32_drive) #endif } +/*! + Produce a text composed from the system SCSI address tuple + "Port,Path,Target,Lun" and store + it in generic_img_private_t.scsi_tuple. + To be accessed via cdio_get_arg("scsi-tuple-linux") or ("scsi-tuple"). + Drivers which implement this code have to return 5 valid decimal numbers + separated by comma, or empty text if no such numbers are available. + @return 1=success , 0=failure +*/ +static int +set_scsi_tuple_win32ioctl(_img_private_t *env) +#ifdef WIN32 +{ + char tuple[160]; + char dataBuffer[MAX_DATA_BUFFER]; + PSCSI_ADDRESS scsiAddress = (PSCSI_ADDRESS) dataBuffer; + ULONG bytesReturned; + + memset(dataBuffer, 0, sizeof(dataBuffer)); + if (DeviceIoControl(env->h_device_handle, + IOCTL_SCSI_GET_ADDRESS, + NULL, + 0, + dataBuffer, + sizeof(dataBuffer), + &bytesReturned, + FALSE + )) { + sprintf(tuple, "%d,%d,%d,%d", + scsiAddress->PortNumber, + scsiAddress->PathId, + scsiAddress->TargetId, + scsiAddress->Lun); + env->gen.scsi_tuple = strdup(tuple); + return 1; + } else { + /* No tuple. */ + env->gen.scsi_tuple = strdup(""); + return 0; + } +} +#else +{ + env->gen.scsi_tuple = strdup(""); + return 0; +} +#endif + /*! Run a SCSI MMC command. @@ -828,6 +879,7 @@ init_win32ioctl (_img_private_t *env) } #endif env->b_ioctl_init = true; + set_scsi_tuple_win32ioctl(env); return true; } return false; diff --git a/test/driver/gnu_linux.c b/test/driver/gnu_linux.c index a81ff17e..ef936663 100644 --- a/test/driver/gnu_linux.c +++ b/test/driver/gnu_linux.c @@ -58,19 +58,20 @@ main(int argc, const char *argv[]) p_cdio = cdio_open_linux(ppsz_drives[0]); if (p_cdio) { - const char *psz_source = NULL, *scsi_tuple; + const char *psz_source = NULL, *psz_scsi_tuple; check_get_arg_source(p_cdio, ppsz_drives[0]); check_mmc_supported(p_cdio, 3); - scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple"); - if (scsi_tuple == NULL) { + psz_scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple"); + if (psz_scsi_tuple == NULL) { fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); + cdio_destroy(p_cdio); exit(3); } if (cdio_loglevel_default == CDIO_LOG_DEBUG) printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n", - psz_source, scsi_tuple); + psz_source, psz_scsi_tuple); cdio_destroy(p_cdio); } diff --git a/test/driver/win32.c b/test/driver/win32.c index b7c069a0..5fa9ec15 100644 --- a/test/driver/win32.c +++ b/test/driver/win32.c @@ -55,16 +55,31 @@ main(int argc, const char *argv[]) p_cdio = cdio_open_win32(ppsz_drives[0]); if (p_cdio) { const char *psz_source = cdio_get_arg(p_cdio, "source"); + const char *psz_scsi_tuple; + const char *psz_access_mode = cdio_get_arg(p_cdio, "access-mode"); if (0 != strncmp(psz_source, ppsz_drives[0], strlen(ppsz_drives[0]))) { fprintf(stderr, "Got %s; should get back %s, the name we opened.\n", psz_source, ppsz_drives[0]); + cdio_destroy(p_cdio); exit(1); } + + if (0 == strncmp(psz_access_mode, "ioctl", strlen("ioctl"))) { + psz_scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple"); + if (psz_scsi_tuple == NULL) { + fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); + cdio_destroy(p_cdio); + exit(3); + } + if (cdio_loglevel_default == CDIO_LOG_DEBUG) + printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n", + psz_source, psz_scsi_tuple); + } + } - cdio_destroy(p_cdio); p_cdio = cdio_open_am_win32(ppsz_drives[0], "ASPI"); if (p_cdio) {