New OS adapter burn_os_is_2k_seekrw() replaces S_ISBLK() with pseudo-drives

This commit is contained in:
Thomas Schmitt 2010-01-16 12:51:24 +00:00
parent 7ead54c8b9
commit 39fd8b922d
8 changed files with 224 additions and 35 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2010.01.15.182615" #define Cdrskin_timestamP "2010.01.16.125258"

View File

@ -1322,7 +1322,7 @@ int burn_drive__fd_from_special_adr(char *adr)
int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname) int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
{ {
int ret = -1, fd = -1, role = 0; int ret = -1, fd = -1, role = 0;
int is_fabricated_block_dev, is_block_dev = 0; int is_block_dev = 0;
/* divided by 512 it needs to fit into a signed long integer */ /* divided by 512 it needs to fit into a signed long integer */
off_t size = ((off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048); off_t size = ((off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
off_t read_size = -1; off_t read_size = -1;
@ -1331,36 +1331,6 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
static int allow_role_3 = 1; static int allow_role_3 = 1;
/* ts B00112 :
>>> this is just a test hack to work with an USB stick on FreeBSD
*/
#ifdef __FreeBSD__
#define Libburn_guess_block_devicE 1
#endif
#ifdef __FreeBSD_kernel__
#define Libburn_guess_block_devicE 1
#endif
is_fabricated_block_dev = 0;
#ifdef Libburn_guess_block_devicE
{
char *spt;
spt = strrchr(fname, '/');
if (spt == NULL)
spt = fname;
else
spt++;
if (spt[0] == 'd' && spt[1] == 'a' &&
(spt[2] >= '0' || spt[2] <= '9') && spt[3] == 0)
is_fabricated_block_dev = 1;
if (spt[0] == 'c' && spt[1] == 'd' &&
(spt[2] >= '0' || spt[2] <= '9') && spt[3] == 0)
is_fabricated_block_dev = 1;
}
#endif /* Libburn_guess_block_devicE */
if (fname[0] != 0) { if (fname[0] != 0) {
memset(&stbuf, 0, sizeof(stbuf)); memset(&stbuf, 0, sizeof(stbuf));
fd = burn_drive__fd_from_special_adr(fname); fd = burn_drive__fd_from_special_adr(fname);
@ -1369,8 +1339,7 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
else else
ret = stat(fname, &stbuf); ret = stat(fname, &stbuf);
if (ret != -1) { if (ret != -1) {
is_block_dev = S_ISBLK(stbuf.st_mode) || is_block_dev = burn_os_is_2k_seekrw(fname, 0);
is_fabricated_block_dev;
if (S_ISREG(stbuf.st_mode)) if (S_ISREG(stbuf.st_mode))
read_size = stbuf.st_size; read_size = stbuf.st_size;
else if (is_block_dev) { else if (is_block_dev) {

View File

@ -206,6 +206,23 @@ int sg_is_enumerable_adr(char *adr)
} }
/* Return 1 if the given path leads to a regular file or a device that can be
seeked, read, and possibly written with 2 kB granularity.
*/
int burn_os_is_2k_seekrw(char *path, int flag)
{
struct stat stbuf;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (S_ISBLK(stbuf.st_mode))
return 1;
return 0;
}
/** Estimate the potential payload capacity of a file address. /** Estimate the potential payload capacity of a file address.
@param path The address of the file to be examined. If it does not @param path The address of the file to be examined. If it does not
exist yet, then the directory will be inquired. exist yet, then the directory will be inquired.

View File

@ -64,8 +64,25 @@ sg_issue_command() sends a SCSI command to the drive, receives reply,
sg_obtain_scsi_adr() tries to obtain SCSI address parameters. sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
burn_os_is_2k_seekrw() tells whether the given path leads to a file object
that can be used in 2 kB granularity by lseek(2),
read(2), and possibly write(2) if not read-only.
E.g. a USB stick or a hard disk.
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives. burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
burn_os_open_track_src() opens a disk file in a way that allows best
throughput with file reading and/or SCSI write command
transmission.
burn_os_alloc_buffer() allocates a memory area that is suitable for file
descriptors issued by burn_os_open_track_src().
The buffer size may be rounded up for alignment
reasons.
burn_os_free_buffer() delete a buffer obtained by burn_os_alloc_buffer().
Porting hints are marked by the text "PORTING:". Porting hints are marked by the text "PORTING:".
Send feedback to libburn-hackers@pykix.org . Send feedback to libburn-hackers@pykix.org .
@ -370,7 +387,7 @@ try_item:; /* This spaghetti loop keeps the number of tabs small */
break; break;
snprintf(buf, sizeof (buf), "/dev/%s%d", snprintf(buf, sizeof (buf), "/dev/%s%d",
result->periph_name, result->unit_number); result->periph_name, result->unit_number);
if(adr_size <= strlen(buf) if(adr_size <= strlen(buf))
return -1; return -1;
strcpy(adr, buf); strcpy(adr, buf);
@ -637,6 +654,47 @@ int sg_is_enumerable_adr(char* adr)
} }
/* ts B00115 */
/* Return 1 if the given path leads to a regular file or a device that can be
seeked, written, and read with 2 kB granularity.
*/
int burn_os_is_2k_seekrw(char *path, int flag)
{
struct stat stbuf;
char *spt;
int i, e;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (!S_ISCHR(stbuf.st_mode))
return 0;
spt = strrchr(path, '/');
if (spt == NULL)
spt = path;
else
spt++;
e = strlen(spt);
for (i = strlen(spt) - 1; i > 0; i--)
if (spt[i] >= '0' && spt[i] <= '9')
e = i;
if (strncmp(spt, "da", e) == 0) /* SCSI disk. E.g. USB stick. */
return 1;
if (strncmp(spt, "cd", e) == 0) /* SCSI CD drive might be writeable. */
return 1;
if (strncmp(spt, "ad", e) == 0) /* IDE hard drive */
return 1;
if (strncmp(spt, "acd", e) == 0) /* IDE CD drive might be writeable */
return 1;
if (strncmp(spt, "fd", e) == 0) /* Floppy disk */
return 1;
if (strncmp(spt, "fla", e) == 0) /* Flash drive */
return 1;
return 0;
}
/* ts A70909 */ /* ts A70909 */
/** Estimate the potential payload capacity of a file address. /** Estimate the potential payload capacity of a file address.
@param path The address of the file to be examined. If it does not @param path The address of the file to be examined. If it does not

View File

@ -852,6 +852,47 @@ ex:;
} }
/* ts B00115 */
/* Return 1 if the given path leads to a regular file or a device that can be
seeked, read and eventually written with 2 kB granularity.
*/
int burn_os_is_2k_seekrw(char *path, int flag)
{
struct stat stbuf;
char *spt;
int i, e;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (!S_ISCHR(stbuf.st_mode))
return 0;
spt = strrchr(path, '/');
if (spt == NULL)
spt = path;
else
spt++;
e = strlen(spt);
for (i = strlen(spt) - 1; i > 0; i--)
if (spt[i] >= '0' && spt[i] <= '9')
e = i;
if (strncmp(spt, "da", e) == 0) /* SCSI disk. E.g. USB stick. */
return 1;
if (strncmp(spt, "cd", e) == 0) /* SCSI CD drive might be writeable. */
return 1;
if (strncmp(spt, "ad", e) == 0) /* IDE hard drive */
return 1;
if (strncmp(spt, "acd", e) == 0) /* IDE CD drive might be writeable */
return 1;
if (strncmp(spt, "fd", e) == 0) /* Floppy disk */
return 1;
if (strncmp(spt, "fla", e) == 0) /* Flash drive */
return 1;
return 0;
}
/* ts A70909 */ /* ts A70909 */
/** Estimate the potential payload capacity of a file address. /** Estimate the potential payload capacity of a file address.
@param path The address of the file to be examined. If it does not @param path The address of the file to be examined. If it does not

View File

@ -64,6 +64,12 @@ sg_issue_command() sends a SCSI command to the drive, receives reply,
sg_obtain_scsi_adr() tries to obtain SCSI address parameters. sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
burn_os_is_2k_seekrw() tells whether the given path leads to a file object
that can be used in 2 kB granularity by lseek(2),
read(2), and possibly write(2) if not read-only..
E.g. a USB stick or a hard disk.
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives. burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
burn_os_open_track_src() opens a disk file in a way that allows best burn_os_open_track_src() opens a disk file in a way that allows best
@ -709,6 +715,79 @@ int sg_is_enumerable_adr(char* adr)
} }
#ifdef __FreeBSD__
#define Libburn_guess_block_devicE 1
#endif
#ifdef __FreeBSD_kernel__
#define Libburn_guess_block_devicE 1
#endif
#ifdef Libburn_guess_block_devicE
/* ts B00115 */
/* The FreeBSD implementation of burn_os_is_2k_seekrw().
On FreeBSD there are no block devices.
*/
static int freebsd_is_2k_seekrw(char *path, int flag)
{
struct stat stbuf;
char *spt;
int i, e;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (!S_ISCHR(stbuf.st_mode))
return 0;
spt = strrchr(path, '/');
if (spt == NULL)
spt = path;
else
spt++;
e = strlen(spt);
for (i = strlen(spt) - 1; i > 0; i--)
if (spt[i] >= '0' && spt[i] <= '9')
e = i;
if (strncmp(spt, "da", e) == 0) /* SCSI disk. E.g. USB stick. */
return 1;
if (strncmp(spt, "cd", e) == 0) /* SCSI CD drive might be writeable. */
return 1;
if (strncmp(spt, "ad", e) == 0) /* IDE hard drive */
return 1;
if (strncmp(spt, "acd", e) == 0) /* IDE CD drive might be writeable */
return 1;
if (strncmp(spt, "fd", e) == 0) /* Floppy disk */
return 1;
if (strncmp(spt, "fla", e) == 0) /* Flash drive */
return 1;
return 0;
}
#endif /* Libburn_guess_block_devicE */
/* Return 1 if the given path leads to a regular file or a device that can be
seeked, read, and possibly written with 2 kB granularity.
*/
int burn_os_is_2k_seekrw(char *path, int flag)
{
#ifdef Libburn_guess_block_devicE
return freebsd_is_2k_seekrw(path, flag);
#else
struct stat stbuf;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (S_ISBLK(stbuf.st_mode))
return 1;
return 0;
#endif /* ! Libburn_guess_block_devicE */
}
/** Estimate the potential payload capacity of a file address. /** Estimate the potential payload capacity of a file address.
@param path The address of the file to be examined. If it does not @param path The address of the file to be examined. If it does not
exist yet, then the directory will be inquired. exist yet, then the directory will be inquired.

View File

@ -71,6 +71,11 @@ sg_issue_command() sends a SCSI command to the drive, receives reply,
sg_obtain_scsi_adr() tries to obtain SCSI address parameters. sg_obtain_scsi_adr() tries to obtain SCSI address parameters.
burn_os_is_2k_seekrw() tells whether the given path leads to a file object
that can be used in 2 kB granularity by lseek(2),
read(2), and possibly write(2).
E.g. a USB stick or a hard disk.
burn_os_stdio_capacity() estimates the emulated media space of stdio-drives. burn_os_stdio_capacity() estimates the emulated media space of stdio-drives.
burn_os_open_track_src() opens a disk file in a way that allows best burn_os_open_track_src() opens a disk file in a way that allows best
@ -2050,6 +2055,24 @@ int sg_is_enumerable_adr(char *adr)
} }
/* ts B00115 */
/* Return 1 if the given path leads to a regular file or a device that can be
seeked, read, and possibly written with 2 kB granularity.
*/
int burn_os_is_2k_seekrw(char *path, int flag)
{
struct stat stbuf;
if (stat(path, &stbuf) == -1)
return 0;
if (S_ISREG(stbuf.st_mode))
return 1;
if (S_ISBLK(stbuf.st_mode))
return 1;
return 0;
}
/* ts A70909 */ /* ts A70909 */
/** Estimate the potential payload capacity of a file address. /** Estimate the potential payload capacity of a file address.
@param path The address of the file to be examined. If it does not @param path The address of the file to be examined. If it does not

View File

@ -31,6 +31,8 @@ int scsi_enumerate_drives(void);
int sg_drive_is_open(struct burn_drive * d); int sg_drive_is_open(struct burn_drive * d);
int burn_os_is_2k_seekrw(char *path, int flag);
int burn_os_stdio_capacity(char *path, off_t *bytes); int burn_os_stdio_capacity(char *path, off_t *bytes);
/* ts A91227 */ /* ts A91227 */