Removed more code redundancies and fd leak with Xorriso_obtain_pattern_files_x()
This commit is contained in:
@ -1246,7 +1246,7 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
|
||||
if(xorriso->request_to_abort)
|
||||
return(1);
|
||||
Sfile_scale(((double) num_data) * 2048.0, mem_text,5,1e4,1);
|
||||
sprintf(respt, "Media summary: %d session%s, %d data blocks (%s)\n",
|
||||
sprintf(respt, "Media summary: %d session%s, %d data blocks, %s\n",
|
||||
num_sessions, (num_sessions==1 ? "" : "s"), num_data, mem_text);
|
||||
Xorriso_result(xorriso,0);
|
||||
|
||||
@ -1862,6 +1862,57 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= *node is already valid */
|
||||
int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
|
||||
struct iso_tree_node **node, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct iso_volume *volume;
|
||||
|
||||
if(!(flag&1)) {
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
return(-1);
|
||||
memset((char *) stbuf, 0, sizeof(struct stat));
|
||||
*node= iso_tree_volume_path_to_node(volume,path);
|
||||
}
|
||||
if(*node==NULL)
|
||||
return(0);
|
||||
|
||||
/* >>> stbuf->st_dev */
|
||||
/* >>> stbuf->st_ino */
|
||||
|
||||
stbuf->st_mode= iso_tree_node_get_permissions(*node);
|
||||
if(LIBISO_ISDIR(*node))
|
||||
stbuf->st_mode|= S_IFDIR;
|
||||
else if(LIBISO_ISREG(*node))
|
||||
stbuf->st_mode|= S_IFREG;
|
||||
else if(LIBISO_ISLNK(*node))
|
||||
stbuf->st_mode|= S_IFLNK;
|
||||
|
||||
/* >>> With directories this should be : number of subdirs + 2 */
|
||||
/* >>> ??? How to obtain RR hardlink number for other types ? */
|
||||
stbuf->st_nlink= 1;
|
||||
|
||||
stbuf->st_uid= iso_tree_node_get_uid(*node);
|
||||
stbuf->st_gid= iso_tree_node_get_gid(*node);
|
||||
|
||||
/* >>> stbuf->st_rdev */
|
||||
|
||||
stbuf->st_size= iso_tree_node_get_size(*node);
|
||||
|
||||
stbuf->st_blksize= 2048;
|
||||
stbuf->st_blocks= stbuf->st_size / (off_t) 2048;
|
||||
if(stbuf->st_blocks * (off_t) 2048 != stbuf->st_size)
|
||||
stbuf->st_blocks++;
|
||||
|
||||
stbuf->st_atime= iso_tree_node_get_atime(*node);
|
||||
stbuf->st_mtime= iso_tree_node_get_mtime(*node);
|
||||
stbuf->st_ctime= iso_tree_node_get_ctime(*node);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= long format
|
||||
bit1= do not print count of nodes
|
||||
bit2= du format
|
||||
@ -1872,13 +1923,9 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, int filec, char **filev,
|
||||
int i, ret, was_error= 0;
|
||||
struct iso_tree_node *node;
|
||||
struct iso_volume *volume;
|
||||
char sfe[5*SfileadrL], path[SfileadrL], *rpt, perms[10];
|
||||
mode_t st_mode;
|
||||
char sfe[5*SfileadrL], path[SfileadrL], *rpt;
|
||||
off_t size;
|
||||
time_t mtime;
|
||||
struct tm tms, *tmpt;
|
||||
static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
struct stat stbuf;
|
||||
|
||||
rpt= xorriso->result_line;
|
||||
|
||||
@ -1890,21 +1937,11 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, int filec, char **filev,
|
||||
|
||||
/* Count valid nodes, warn of invalid ones */
|
||||
for(i= 0; i<filec; i++) {
|
||||
if(filev[i][0]!='/') {
|
||||
strcpy(path, xorriso->wdi);
|
||||
if(Sfile_add_to_path(path, filev[i], 0)<=0) {
|
||||
much_too_long:;
|
||||
sprintf(xorriso->info_text,
|
||||
"Path for file listing gets much too long (%d)",
|
||||
(int) (strlen(path)+strlen(filev[i])+1));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
was_error++;
|
||||
ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdi, filev[i], path, 1|4);
|
||||
if(ret<=0) {
|
||||
was_error++;
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
if(Sfile_str(path, filev[i], 0)<=0)
|
||||
goto much_too_long;
|
||||
|
||||
}
|
||||
node= iso_tree_volume_path_to_node(volume,path);
|
||||
if(node==NULL) {
|
||||
sprintf(xorriso->info_text, "Not found in ISO image: %s",
|
||||
@ -1923,55 +1960,20 @@ much_too_long:;
|
||||
}
|
||||
|
||||
for(i= 0; i<filec && !(xorriso->request_to_abort); i++) {
|
||||
if(filev[i][0]!='/') {
|
||||
strcpy(path, xorriso->wdi);
|
||||
if(Sfile_add_to_path(path, filev[i], 0)<=0)
|
||||
continue;
|
||||
} else
|
||||
if(Sfile_str(path, filev[i], 0)<=0)
|
||||
continue;
|
||||
node= iso_tree_volume_path_to_node(volume,path);
|
||||
if(node==NULL)
|
||||
continue;
|
||||
|
||||
size= iso_tree_node_get_size(node);
|
||||
rpt[0]= 0;
|
||||
ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdi, filev[i], path, 1|4);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
ret= Xorriso_fake_stbuf(xorriso, path, &stbuf, &node, 0);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
if((flag&5)==1) { /* -ls_l */
|
||||
if(LIBISO_ISDIR(node))
|
||||
strcat(rpt, "d");
|
||||
else if(LIBISO_ISREG(node))
|
||||
strcat(rpt, "-");
|
||||
else if(LIBISO_ISLNK(node))
|
||||
strcat(rpt, "l");
|
||||
else
|
||||
strcat(rpt, "?");
|
||||
|
||||
st_mode= iso_tree_node_get_permissions(node);
|
||||
Xorriso__mode_to_perms(st_mode, perms, 0);
|
||||
strcat(rpt, perms);
|
||||
|
||||
/* >>> With directories this should be : number of subdirs + 2 */
|
||||
/* >>> ??? How to obtain RR hardlink number for other types ? */
|
||||
strcat(rpt," 1 ");
|
||||
|
||||
sprintf(rpt+strlen(rpt), "%-8lu ",
|
||||
(unsigned long) iso_tree_node_get_uid(node));
|
||||
sprintf(rpt+strlen(rpt), "%-8lu ",
|
||||
(unsigned long) iso_tree_node_get_gid(node));
|
||||
sprintf(rpt+strlen(rpt), "%8.f ",(double) size);
|
||||
mtime= iso_tree_node_get_mtime(node);
|
||||
tmpt= localtime_r(&mtime, &tms);
|
||||
if(tmpt==0)
|
||||
sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime);
|
||||
else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0)
|
||||
sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ",
|
||||
months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min);
|
||||
else
|
||||
sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ",
|
||||
months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year);
|
||||
|
||||
ret= Xorriso_format_ls_l(xorriso, &stbuf, 0);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
} else if(flag&4) { /* -du or -du_s */
|
||||
if(LIBISO_ISDIR(node)) {
|
||||
size= stbuf.st_size;
|
||||
if(S_ISDIR(stbuf.st_mode)) {
|
||||
ret= Xorriso_show_du_subs(xorriso, (struct iso_tree_node_dir *) node,
|
||||
path, filev[i], &size, boss_mem, flag&1);
|
||||
if(ret<0)
|
||||
@ -1990,7 +1992,8 @@ much_too_long:;
|
||||
|
||||
|
||||
/* This function needs less buffer memory than Xorriso_ls_filev() but cannot
|
||||
perform structured pattern matching.
|
||||
perform structured pattern matching as done by Xorriso_expand_pattern()
|
||||
for subsequent Xorriso_ls_filev().
|
||||
@param flag bit0= long format
|
||||
bit1= only check for directory existence
|
||||
bit2= do not apply search pattern but accept any file
|
||||
@ -2002,13 +2005,8 @@ int Xorriso_ls(struct XorrisO *xorriso, int flag)
|
||||
struct iso_tree_node_dir *dir_node;
|
||||
struct iso_volume *volume;
|
||||
struct iso_tree_iter *iter= NULL;
|
||||
char sfe[5*SfileadrL], *npt, *rpt, perms[10];
|
||||
mode_t st_mode;
|
||||
off_t size;
|
||||
time_t mtime;
|
||||
struct tm tms, *tmpt;
|
||||
static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
char sfe[5*SfileadrL], *npt, *rpt;
|
||||
struct stat stbuf;
|
||||
|
||||
rpt= xorriso->result_line;
|
||||
|
||||
@ -2077,42 +2075,13 @@ wdi_is_not_a_dir:;
|
||||
|
||||
npt= (char *) iso_tree_node_get_name(node);
|
||||
rpt[0]= 0;
|
||||
|
||||
if(flag&1) {
|
||||
if(LIBISO_ISDIR(node))
|
||||
strcat(rpt, "d");
|
||||
else if(LIBISO_ISREG(node))
|
||||
strcat(rpt, "-");
|
||||
else if(LIBISO_ISLNK(node))
|
||||
strcat(rpt, "l");
|
||||
else
|
||||
strcat(rpt, "?");
|
||||
|
||||
st_mode= iso_tree_node_get_permissions(node);
|
||||
Xorriso__mode_to_perms(st_mode, perms, 0);
|
||||
strcat(rpt, perms);
|
||||
|
||||
/* >>> With directories this should be : number of subdirs + 2 */
|
||||
/* >>> ??? How to obtain RR hardlink number for other types ? */
|
||||
strcat(rpt," 1 ");
|
||||
|
||||
sprintf(rpt+strlen(rpt), "%-8lu ",
|
||||
(unsigned long) iso_tree_node_get_uid(node));
|
||||
sprintf(rpt+strlen(rpt), "%-8lu ",
|
||||
(unsigned long) iso_tree_node_get_gid(node));
|
||||
size= iso_tree_node_get_size(node);
|
||||
sprintf(rpt+strlen(rpt), "%8.f ",(double) size);
|
||||
mtime= iso_tree_node_get_mtime(node);
|
||||
tmpt= localtime_r(&mtime, &tms);
|
||||
if(tmpt==0)
|
||||
sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime);
|
||||
else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0)
|
||||
sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ",
|
||||
months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min);
|
||||
else
|
||||
sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ",
|
||||
months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year);
|
||||
|
||||
ret= Xorriso_fake_stbuf(xorriso, "", &stbuf, &node, 1);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
ret= Xorriso_format_ls_l(xorriso, &stbuf, 0);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
}
|
||||
sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s\n",
|
||||
Text_shellsafe(npt, sfe, 0));
|
||||
|
Reference in New Issue
Block a user