|
|
|
@ -262,7 +262,7 @@ int burn_drive_grab(struct burn_drive *d, int le)
|
|
|
|
|
}
|
|
|
|
|
if(d->drive_role != 1) {
|
|
|
|
|
d->released = 0;
|
|
|
|
|
if(d->drive_role == 2) {
|
|
|
|
|
if(d->drive_role == 2 || d->drive_role == 3) {
|
|
|
|
|
d->status = BURN_DISC_BLANK;
|
|
|
|
|
d->current_profile = 0xffff;
|
|
|
|
|
} else {
|
|
|
|
@ -1118,18 +1118,42 @@ int burn_drive_is_banned(char *device_address)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ts A70903 : will vanish from API */
|
|
|
|
|
/* ts A70924 */
|
|
|
|
|
int burn_drive__fd_from_special_adr(char *adr)
|
|
|
|
|
{
|
|
|
|
|
int fd = -1, i;
|
|
|
|
|
|
|
|
|
|
if (strcmp(adr, "-") == 0)
|
|
|
|
|
fd = 1;
|
|
|
|
|
if(strncmp(adr, "/dev/fd/", 8) == 0) {
|
|
|
|
|
for (i = 8; adr[i]; i++)
|
|
|
|
|
if (!isdigit(adr[i]))
|
|
|
|
|
break;
|
|
|
|
|
if (i> 8 && adr[i] == 0)
|
|
|
|
|
fd = atoi(adr + 8);
|
|
|
|
|
}
|
|
|
|
|
return fd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ts A70903 : Implements adquiration of pseudo drives */
|
|
|
|
|
int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
{
|
|
|
|
|
int ret;
|
|
|
|
|
int ret = -1, fd = -1, role = 0;
|
|
|
|
|
off_t size = ((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
|
|
|
|
struct burn_drive *d= NULL, *regd_d;
|
|
|
|
|
struct stat stbuf;
|
|
|
|
|
|
|
|
|
|
static int allow_role_3 = 1;
|
|
|
|
|
|
|
|
|
|
if (fname[0] != 0) {
|
|
|
|
|
memset(&stbuf, 0, sizeof(stbuf));
|
|
|
|
|
ret = stat(fname, &stbuf);
|
|
|
|
|
if(ret == -1 || S_ISBLK(stbuf.st_mode) ||
|
|
|
|
|
fd = burn_drive__fd_from_special_adr(fname);
|
|
|
|
|
if (fd >= 0)
|
|
|
|
|
ret = fstat(fd, &stbuf);
|
|
|
|
|
else
|
|
|
|
|
ret = stat(fname, &stbuf);
|
|
|
|
|
if (ret == -1 || S_ISBLK(stbuf.st_mode) ||
|
|
|
|
|
S_ISREG(stbuf.st_mode)) {
|
|
|
|
|
ret = burn_os_stdio_capacity(fname, &size);
|
|
|
|
|
if (ret == -1) {
|
|
|
|
@ -1147,12 +1171,19 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
errno, 0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (fname[0] != 0)
|
|
|
|
|
role = 2;
|
|
|
|
|
else
|
|
|
|
|
role = 0;
|
|
|
|
|
} else {
|
|
|
|
|
libdax_msgs_submit(libdax_messenger, -1,
|
|
|
|
|
0x00020149,
|
|
|
|
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
|
|
|
|
"Unsuitable filetype for pseudo-drive", 0, 0);
|
|
|
|
|
return 0;
|
|
|
|
|
if(S_ISDIR(stbuf.st_mode) || !allow_role_3) {
|
|
|
|
|
libdax_msgs_submit(libdax_messenger, -1,
|
|
|
|
|
0x00020149,
|
|
|
|
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
|
|
|
|
"Unsuitable filetype for pseudo-drive", 0, 0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
role = 3;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
d= (struct burn_drive *) calloc(1, sizeof(struct burn_drive));
|
|
|
|
@ -1161,10 +1192,7 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
burn_setup_drive(d, fname);
|
|
|
|
|
d->status = BURN_DISC_EMPTY;
|
|
|
|
|
|
|
|
|
|
if (fname[0] != 0)
|
|
|
|
|
d->drive_role = 2;
|
|
|
|
|
else
|
|
|
|
|
d->drive_role = 0;
|
|
|
|
|
d->drive_role = role;
|
|
|
|
|
ret = burn_scsi_setup_drive(d, -1, -1, -1, -1, -1, 0);
|
|
|
|
|
if (ret <= 0)
|
|
|
|
|
goto ex;
|
|
|
|
@ -1175,7 +1203,7 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
}
|
|
|
|
|
free((char *) d); /* all sub pointers have been copied to *regd_d */
|
|
|
|
|
d = regd_d;
|
|
|
|
|
if (d->drive_role == 2) {
|
|
|
|
|
if (d->drive_role == 2 || d->drive_role == 3) {
|
|
|
|
|
d->status = BURN_DISC_BLANK;
|
|
|
|
|
d->current_profile = 0xffff; /* MMC for non-compliant drive */
|
|
|
|
|
strcpy(d->current_profile_text,"stdio file");
|
|
|
|
@ -1185,7 +1213,7 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_SAO;
|
|
|
|
|
d->media_capacity_remaining = size;
|
|
|
|
|
|
|
|
|
|
/* >>> ? open file for a test ? */;
|
|
|
|
|
/* >>> ? open file for a test ? (>>> beware of "-" = stdin) */;
|
|
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
d->current_profile = 0; /* Drives return this if empty */
|
|
|
|
@ -1201,6 +1229,10 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|
|
|
|
strcpy((*drive_infos)[0].vendor,"YOYODYNE");
|
|
|
|
|
strcpy((*drive_infos)[0].product,"WARP DRIVE");
|
|
|
|
|
strcpy((*drive_infos)[0].revision,"FX01");
|
|
|
|
|
} else if (d->drive_role == 3) {
|
|
|
|
|
strcpy((*drive_infos)[0].vendor,"YOYODYNE");
|
|
|
|
|
strcpy((*drive_infos)[0].product,"BLACKHOLE");
|
|
|
|
|
strcpy((*drive_infos)[0].revision,"FX02");
|
|
|
|
|
} else {
|
|
|
|
|
strcpy((*drive_infos)[0].vendor,"FERENGI");
|
|
|
|
|
strcpy((*drive_infos)[0].product,"VAPORWARE");
|
|
|
|
@ -1780,7 +1812,7 @@ off_t burn_disc_available_space(struct burn_drive *d,
|
|
|
|
|
return 0;
|
|
|
|
|
if (d->drive_role == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
if (d->drive_role == 2) {
|
|
|
|
|
if (d->drive_role != 1) {
|
|
|
|
|
if (d->media_capacity_remaining <= 0)
|
|
|
|
|
d->media_capacity_remaining =
|
|
|
|
|
((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
|
|
|
@ -2011,7 +2043,7 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|
|
|
|
if (d->drive_role == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
if (d->drive_role == 2) {
|
|
|
|
|
/* stdio file dummy drive */
|
|
|
|
|
/* stdio file drive : random access read-write */
|
|
|
|
|
o->start_adr = 1;
|
|
|
|
|
size = d->media_capacity_remaining;
|
|
|
|
|
burn_os_stdio_capacity(d->devname, &size);
|
|
|
|
@ -2022,6 +2054,12 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|
|
|
|
o->might_do_tao = 2;
|
|
|
|
|
o->advised_write_mode = BURN_WRITE_TAO;
|
|
|
|
|
o->might_simulate = 1;
|
|
|
|
|
} else if (d->drive_role != 1) {
|
|
|
|
|
/* stdio file drive : sequential access write-only */
|
|
|
|
|
o->might_do_sao = 4;
|
|
|
|
|
o->might_do_tao = 2;
|
|
|
|
|
o->advised_write_mode = BURN_WRITE_TAO;
|
|
|
|
|
o->might_simulate = 1;
|
|
|
|
|
} else if (s != BURN_DISC_BLANK && s != BURN_DISC_APPENDABLE) {
|
|
|
|
|
return 0;
|
|
|
|
|
} else if (s == BURN_DISC_APPENDABLE &&
|
|
|
|
@ -2251,6 +2289,12 @@ int burn_drive_equals_adr(struct burn_drive *d1, char *adr2_in, int role2)
|
|
|
|
|
stat_ret2 = stat(adr2, &stbuf2);
|
|
|
|
|
conv_ret2 = burn_drive_convert_fs_adr(adr2, conv_adr2);
|
|
|
|
|
|
|
|
|
|
/* roles 2 and 3 have the same name space and object interpretation */
|
|
|
|
|
if (role1 == 3)
|
|
|
|
|
role1 = 2;
|
|
|
|
|
if (role2 == 3)
|
|
|
|
|
role2 = 2;
|
|
|
|
|
|
|
|
|
|
if (strcmp(adr1, adr2) == 0 && role1 == role2)
|
|
|
|
|
return(1); /* equal role and address */
|
|
|
|
|
if (role1 == 1 && role2 == 1) {
|
|
|
|
|