Widened the lseek capacity determination to SEEK_SET with wanted size
This commit is contained in:
parent
ddfe5098d8
commit
0c0d542591
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2019 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2022 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -2172,3 +2172,108 @@ ex:;
|
|||||||
Xorriso_wait_child_end(xorriso, forked_pid, &status, 0);
|
Xorriso_wait_child_end(xorriso, forked_pid, &status, 0);
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* flag: bit0= *capacity is a desired value.
|
||||||
|
Try SEEK_SET with *capacity
|
||||||
|
bit1= open for writing
|
||||||
|
return: 0= no random access , -1= cannot open path
|
||||||
|
1= *capacity is valid
|
||||||
|
*/
|
||||||
|
int Xorriso_lseek_capacity(struct XorrisO *xorriso, char *path,
|
||||||
|
off_t *capacity, int flag)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
off_t seek_result;
|
||||||
|
|
||||||
|
if(flag & 2)
|
||||||
|
fd= open(path, O_WRONLY);
|
||||||
|
else
|
||||||
|
fd= open(path, O_RDONLY);
|
||||||
|
if(fd < 0) {
|
||||||
|
sprintf(xorriso->info_text,
|
||||||
|
"Cannot open for determination of random-access capacity: ");
|
||||||
|
Text_shellsafe(path, xorriso->info_text, 1);
|
||||||
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
if(flag & 1) {
|
||||||
|
seek_result= lseek(fd, *capacity, SEEK_SET);
|
||||||
|
} else {
|
||||||
|
seek_result= lseek(fd, 0, SEEK_END);
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
if(seek_result < 0)
|
||||||
|
return(0);
|
||||||
|
*capacity= seek_result;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* flag: bit0= *capacity is a desired value.
|
||||||
|
If SEEK_END fails, try SEEK_SET with *capacity
|
||||||
|
bit1= open for writing
|
||||||
|
return: 0= no random access , -1= path does not exist , -2= wrong type
|
||||||
|
-3= cannot open path
|
||||||
|
1= *capacity is valid
|
||||||
|
*/
|
||||||
|
int Xorriso_determine_capacity(struct XorrisO *xorriso, char *path,
|
||||||
|
off_t *capacity, char **reason, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
off_t src_size, src_seek_size= -1;
|
||||||
|
struct stat stbuf;
|
||||||
|
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "offers no random access";
|
||||||
|
if(lstat(path, &stbuf) == -1) {
|
||||||
|
*capacity= 0;
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "does not exist";
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
if(S_ISREG(stbuf.st_mode)) {
|
||||||
|
src_size= stbuf.st_size;
|
||||||
|
} else if(!(S_ISDIR(stbuf.st_mode) || S_ISLNK(stbuf.st_mode) ||
|
||||||
|
S_ISFIFO(stbuf.st_mode) || S_ISSOCK(stbuf.st_mode))) {
|
||||||
|
ret= Xorriso_lseek_capacity(xorriso, path, &src_size, flag & 2);
|
||||||
|
if(ret <= 0 || src_size <= 0) {
|
||||||
|
if(ret == -1 || !(flag & 1)) {
|
||||||
|
*capacity= 0;
|
||||||
|
if(ret == -1) {
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "cannot be opened";
|
||||||
|
return(-3);
|
||||||
|
}
|
||||||
|
return(ret > 0);
|
||||||
|
}
|
||||||
|
if(ret > 0)
|
||||||
|
src_seek_size= 0;
|
||||||
|
src_size= *capacity;
|
||||||
|
ret= Xorriso_lseek_capacity(xorriso, path, &src_size, flag & 3);
|
||||||
|
if(ret <= 0 || src_size < src_seek_size) {
|
||||||
|
if(src_seek_size == 0) {
|
||||||
|
src_size= src_seek_size;
|
||||||
|
} else {
|
||||||
|
*capacity= 0;
|
||||||
|
if(ret == -1) {
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "cannot be opened";
|
||||||
|
return(-3);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*capacity= 0;
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "is of wrong type";
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
*capacity= src_size;
|
||||||
|
if(reason != NULL)
|
||||||
|
*reason= "";
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2019 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2022 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2 or later.
|
Provided under GPL version 2 or later.
|
||||||
|
|
||||||
@ -127,5 +127,8 @@ int Xorriso_concat(struct XorrisO *xorriso, char *mode, char *target,
|
|||||||
int progc, char **progv,
|
int progc, char **progv,
|
||||||
int filec, char **filev, int flag);
|
int filec, char **filev, int flag);
|
||||||
|
|
||||||
|
int Xorriso_determine_capacity(struct XorrisO *xorriso, char *path,
|
||||||
|
off_t *capacity, char **reason, int flag);
|
||||||
|
|
||||||
#endif /* ! Xorriso_pvt_diskop_includeD */
|
#endif /* ! Xorriso_pvt_diskop_includeD */
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
#include "sort_cmp.h"
|
#include "sort_cmp.h"
|
||||||
#include "parse_exec.h"
|
#include "parse_exec.h"
|
||||||
#include "write_run.h"
|
#include "write_run.h"
|
||||||
|
#include "disk_ops.h"
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= give directory x-permission where is r-permission
|
/* @param flag bit0= give directory x-permission where is r-permission
|
||||||
@ -1225,27 +1225,6 @@ ex:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Xorriso_lseek_capacity(struct XorrisO *xorriso, char *path,
|
|
||||||
off_t *capacity, int flag)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
fd= open(path, O_RDONLY);
|
|
||||||
if(fd < 0) {
|
|
||||||
sprintf(xorriso->info_text,
|
|
||||||
"Determination of random-access readable capacity failed: ");
|
|
||||||
Text_shellsafe(path, xorriso->info_text, 1);
|
|
||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*capacity= lseek(fd, 0, SEEK_END);
|
|
||||||
close(fd);
|
|
||||||
if(*capacity < 0)
|
|
||||||
return(-1);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= -follow: disk_path is not a command parameter
|
/* @param flag bit0= -follow: disk_path is not a command parameter
|
||||||
*/
|
*/
|
||||||
int Xorriso_cut_out(struct XorrisO *xorriso, char *disk_path,
|
int Xorriso_cut_out(struct XorrisO *xorriso, char *disk_path,
|
||||||
@ -1292,7 +1271,8 @@ int Xorriso_cut_out(struct XorrisO *xorriso, char *disk_path,
|
|||||||
src_size= stbuf.st_size;
|
src_size= stbuf.st_size;
|
||||||
} else if(!(S_ISDIR(stbuf.st_mode) || S_ISLNK(stbuf.st_mode) ||
|
} else if(!(S_ISDIR(stbuf.st_mode) || S_ISLNK(stbuf.st_mode) ||
|
||||||
S_ISFIFO(stbuf.st_mode) || S_ISSOCK(stbuf.st_mode))) {
|
S_ISFIFO(stbuf.st_mode) || S_ISSOCK(stbuf.st_mode))) {
|
||||||
ret= Xorriso_lseek_capacity(xorriso, eff_source, &src_size, 0);
|
src_size= startbyte + bytecount;
|
||||||
|
ret= Xorriso_determine_capacity(xorriso, eff_source, &src_size, NULL, 1);
|
||||||
if(ret <= 0)
|
if(ret <= 0)
|
||||||
goto unsupported_type;
|
goto unsupported_type;
|
||||||
if(src_size <= 0) {
|
if(src_size <= 0) {
|
||||||
@ -1311,7 +1291,7 @@ unsupported_type:;
|
|||||||
Ftypetxt(stbuf.st_mode, 0));
|
Ftypetxt(stbuf.st_mode, 0));
|
||||||
} else {
|
} else {
|
||||||
sprintf(xorriso->info_text,
|
sprintf(xorriso->info_text,
|
||||||
"-cut_out: File (%s) does not support random read access: ",
|
"-cut_out: File (%s) does not support or permit random read access: ",
|
||||||
Ftypetxt(stbuf.st_mode, 0));
|
Ftypetxt(stbuf.st_mode, 0));
|
||||||
}
|
}
|
||||||
Text_shellsafe(eff_source, xorriso->info_text, 1);
|
Text_shellsafe(eff_source, xorriso->info_text, 1);
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2022.04.26.101633"
|
#define Xorriso_timestamP "2022.05.30.164422"
|
||||||
|
Loading…
Reference in New Issue
Block a user