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:
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";
}

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 "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;

View File

@@ -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);
}

View File

@@ -55,15 +55,30 @@ 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");