Add cdio_get_arg("scsi-tuple") for Win32 ioctl.
This commit is contained in:
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user