Add cdio_get_arg("scsi-tuple") for Win32 ioctl.

This commit is contained in:
R. Bernstein
2010-01-29 23:25:59 -05:00
parent 1b05767201
commit a41cfed2a1
4 changed files with 75 additions and 5 deletions

View File

@@ -685,6 +685,8 @@ get_arg_win32 (void *p_user_data, const char key[])
case _AM_NONE: case _AM_NONE:
return "no access method"; return "no access method";
} }
} else if (!strcmp (key, "scsi-tuple")) {
return p_env->gen.scsi_tuple;
} else if (!strcmp (key, "mmc-supported?")) { } else if (!strcmp (key, "mmc-supported?")) {
return is_mmc_supported(p_user_data) ? "true" : "false"; return is_mmc_supported(p_user_data) ? "true" : "false";
} }

View File

@@ -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 "cdtext_private.h"
#include "cdio/logging.h" #include "cdio/logging.h"
#define MAX_ERROR_BUFFER 256
#define MAX_DATA_BUFFER 2048
typedef struct _TRACK_DATA_FULL { typedef struct _TRACK_DATA_FULL {
UCHAR SessionNumber; UCHAR SessionNumber;
UCHAR Control : 4; UCHAR Control : 4;
@@ -412,6 +415,54 @@ close_tray_win32ioctl (const char *psz_win32_drive)
#endif #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. Run a SCSI MMC command.
@@ -828,6 +879,7 @@ init_win32ioctl (_img_private_t *env)
} }
#endif #endif
env->b_ioctl_init = true; env->b_ioctl_init = true;
set_scsi_tuple_win32ioctl(env);
return true; return true;
} }
return false; return false;

View File

@@ -58,19 +58,20 @@ main(int argc, const char *argv[])
p_cdio = cdio_open_linux(ppsz_drives[0]); p_cdio = cdio_open_linux(ppsz_drives[0]);
if (p_cdio) { 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_get_arg_source(p_cdio, ppsz_drives[0]);
check_mmc_supported(p_cdio, 3); check_mmc_supported(p_cdio, 3);
scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple"); psz_scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple");
if (scsi_tuple == NULL) { if (psz_scsi_tuple == NULL) {
fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
cdio_destroy(p_cdio);
exit(3); exit(3);
} }
if (cdio_loglevel_default == CDIO_LOG_DEBUG) if (cdio_loglevel_default == CDIO_LOG_DEBUG)
printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n", printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n",
psz_source, scsi_tuple); psz_source, psz_scsi_tuple);
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
} }

View File

@@ -55,16 +55,31 @@ main(int argc, const char *argv[])
p_cdio = cdio_open_win32(ppsz_drives[0]); p_cdio = cdio_open_win32(ppsz_drives[0]);
if (p_cdio) { if (p_cdio) {
const char *psz_source = cdio_get_arg(p_cdio, "source"); 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], if (0 != strncmp(psz_source, ppsz_drives[0],
strlen(ppsz_drives[0]))) { strlen(ppsz_drives[0]))) {
fprintf(stderr, fprintf(stderr,
"Got %s; should get back %s, the name we opened.\n", "Got %s; should get back %s, the name we opened.\n",
psz_source, ppsz_drives[0]); psz_source, ppsz_drives[0]);
cdio_destroy(p_cdio);
exit(1); 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); cdio_destroy(p_cdio);
p_cdio = cdio_open_am_win32(ppsz_drives[0], "ASPI"); p_cdio = cdio_open_am_win32(ppsz_drives[0], "ASPI");
if (p_cdio) { if (p_cdio) {