Called statvfs() for size estimation of regular stdio-files.
This commit is contained in:
parent
ccad19e055
commit
ea09a516bd
@ -270,9 +270,10 @@ Warning: Superusers must take care not to spoil their hard disk via its raw
|
|||||||
block device (like /dev/hda or /dev/sd0).
|
block device (like /dev/hda or /dev/sd0).
|
||||||
.br
|
.br
|
||||||
Pseudo-drives behave much like DVD-RAM. They allow -dummy, nevertheless, and
|
Pseudo-drives behave much like DVD-RAM. They allow -dummy, nevertheless, and
|
||||||
their reply with --tell_media_space is utopic. If the given address does
|
their reply with --tell_media_space can be utopic. If the given address does
|
||||||
not exist yet, then it gets created as regular file.
|
not exist yet but its directory exists, then it gets created as regular file
|
||||||
Note: -dummy runs touch the file.
|
as soon as a write operation occurs.
|
||||||
|
Note: -dummy burn runs touch the file.
|
||||||
.br
|
.br
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
@ -397,7 +398,7 @@ Try to perform the drive operations without actually affecting the inserted
|
|||||||
media. There is no warranty that this will work with a particular combination
|
media. There is no warranty that this will work with a particular combination
|
||||||
of drive, media, and write mode. Blanking is prevented reliably, though.
|
of drive, media, and write mode. Blanking is prevented reliably, though.
|
||||||
To avoid inadverted real burning, -dummy refuses burn runs on anything but
|
To avoid inadverted real burning, -dummy refuses burn runs on anything but
|
||||||
CD-R[W] and DVD-R[W].
|
CD-R[W], DVD-R[W], or emulated stdio-drives.
|
||||||
.TP
|
.TP
|
||||||
.BI \-eject
|
.BI \-eject
|
||||||
Eject the disc after work is done.
|
Eject the disc after work is done.
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2007.09.08.174757"
|
#define Cdrskin_timestamP "2007.09.09.093535"
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
#include "libburn.h"
|
#include "libburn.h"
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
@ -1091,16 +1092,41 @@ int burn_drive_is_banned(char *device_address)
|
|||||||
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;
|
int ret;
|
||||||
|
off_t size = ((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
||||||
|
off_t add_size = 0;
|
||||||
struct burn_drive *d= NULL, *regd_d;
|
struct burn_drive *d= NULL, *regd_d;
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
|
struct statvfs vfsbuf;
|
||||||
|
char testpath[4096];
|
||||||
|
|
||||||
|
testpath[0] = 0;
|
||||||
|
|
||||||
if (fname[0] != 0) {
|
if (fname[0] != 0) {
|
||||||
if (stat(fname, &stbuf) == -1) {
|
if (stat(fname, &stbuf) == -1) {
|
||||||
|
strcpy(testpath,fname);
|
||||||
|
if(strrchr(testpath,'/') == NULL)
|
||||||
|
strcpy(testpath,".");
|
||||||
|
else if(strrchr(testpath,'/') == testpath)
|
||||||
|
testpath[1] = 0;
|
||||||
|
else
|
||||||
|
*strrchr(testpath,'/') = 0;
|
||||||
|
if (stat(testpath, &stbuf) == -1) {
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1,
|
||||||
|
0x00020009,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Neither stdio-path nor its directory exist",
|
||||||
|
0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* >>> ? reject ? try to create ? */;
|
} else if(S_ISBLK(stbuf.st_mode)) {
|
||||||
|
|
||||||
} else if(S_ISREG(stbuf.st_mode) || S_ISBLK(stbuf.st_mode)) {
|
/* >>> ? how to obtain the number of blocks ? */
|
||||||
/* >>> ? open for a test ? */;
|
|
||||||
|
} else if(S_ISREG(stbuf.st_mode)) {
|
||||||
|
add_size = stbuf.st_blocks * (off_t) 512;
|
||||||
|
size -= add_size;
|
||||||
|
strcpy(testpath,fname);
|
||||||
} else {
|
} else {
|
||||||
libdax_msgs_submit(libdax_messenger, -1,
|
libdax_msgs_submit(libdax_messenger, -1,
|
||||||
0x00020149,
|
0x00020149,
|
||||||
@ -1137,6 +1163,14 @@ int burn_drive_grab_dummy(struct burn_drive_info *drive_infos[], char *fname)
|
|||||||
d->current_is_supported_profile = 1;
|
d->current_is_supported_profile = 1;
|
||||||
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
|
d->block_types[BURN_WRITE_TAO] = BURN_BLOCK_MODE1;
|
||||||
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_SAO;
|
d->block_types[BURN_WRITE_SAO] = BURN_BLOCK_SAO;
|
||||||
|
if (testpath[0])
|
||||||
|
if (statvfs(testpath, &vfsbuf) != -1)
|
||||||
|
size = ((off_t) vfsbuf.f_bsize) *
|
||||||
|
(off_t) vfsbuf.f_bavail;
|
||||||
|
d->media_capacity_remaining = size + add_size;
|
||||||
|
|
||||||
|
/* >>> ? open file for a test ? */;
|
||||||
|
|
||||||
} else
|
} else
|
||||||
d->current_profile = 0; /* Drives return this if empty */
|
d->current_profile = 0; /* Drives return this if empty */
|
||||||
|
|
||||||
@ -1731,14 +1765,14 @@ off_t burn_disc_available_space(struct burn_drive *d,
|
|||||||
if (d->drive_role == 0)
|
if (d->drive_role == 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (d->drive_role == 2) {
|
if (d->drive_role == 2) {
|
||||||
|
if (d->media_capacity_remaining <= 0)
|
||||||
/* >>> how to estimate available space for a stdio file ? */
|
d->media_capacity_remaining =
|
||||||
return ((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
||||||
|
} else {
|
||||||
|
if (o != NULL)
|
||||||
|
d->send_write_parameters(d, o);
|
||||||
|
d->get_nwa(d, -1, &lba, &nwa);
|
||||||
}
|
}
|
||||||
if (o != NULL)
|
|
||||||
d->send_write_parameters(d, o);
|
|
||||||
d->get_nwa(d, -1, &lba, &nwa);
|
|
||||||
if (o != NULL) {
|
if (o != NULL) {
|
||||||
if (o->start_byte > 0) {
|
if (o->start_byte > 0) {
|
||||||
if (o->start_byte > d->media_capacity_remaining)
|
if (o->start_byte > d->media_capacity_remaining)
|
||||||
@ -1938,6 +1972,8 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|||||||
int status, num_formats, ret, type, i;
|
int status, num_formats, ret, type, i;
|
||||||
off_t size;
|
off_t size;
|
||||||
unsigned dummy;
|
unsigned dummy;
|
||||||
|
struct statvfs vfsbuf;
|
||||||
|
struct stat stbuf;
|
||||||
|
|
||||||
*caps = NULL;
|
*caps = NULL;
|
||||||
s = burn_disc_get_status(d);
|
s = burn_disc_get_status(d);
|
||||||
@ -1963,11 +1999,14 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
|||||||
if (d->drive_role == 2) {
|
if (d->drive_role == 2) {
|
||||||
/* stdio file dummy drive */
|
/* stdio file dummy drive */
|
||||||
o->start_adr = 1;
|
o->start_adr = 1;
|
||||||
|
size = d->media_capacity_remaining;
|
||||||
size = ((off_t) (1024 * 1024 * 1024) * (off_t) 2048);
|
if (stat(d->devname, &stbuf) != -1)
|
||||||
/* >>> obtain realistic file size */
|
if(S_ISREG(stbuf.st_mode))
|
||||||
|
if (statvfs(d->devname, &vfsbuf) != -1)
|
||||||
|
size = ((off_t) vfsbuf.f_bsize) *
|
||||||
|
(off_t) vfsbuf.f_bavail;
|
||||||
|
d->media_capacity_remaining = size;
|
||||||
o->start_range_high = size;
|
o->start_range_high = size;
|
||||||
|
|
||||||
o->start_alignment = 2048; /* imposting a drive, not a file */
|
o->start_alignment = 2048; /* imposting a drive, not a file */
|
||||||
o->might_do_sao = 4;
|
o->might_do_sao = 4;
|
||||||
o->might_do_tao = 2;
|
o->might_do_tao = 2;
|
||||||
|
@ -305,6 +305,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x00020006 (FATAL,HIGH) = Too many scsi siblings
|
0x00020006 (FATAL,HIGH) = Too many scsi siblings
|
||||||
0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
|
0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
|
||||||
0x00020008 (SORRY,HIGH) = Device busy. Failed to fcntl-lock
|
0x00020008 (SORRY,HIGH) = Device busy. Failed to fcntl-lock
|
||||||
|
0x00020009 (SORRY,HIGH) = Neither stdio-path nor its directory exist
|
||||||
|
|
||||||
General library operations:
|
General library operations:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user