Implemented option -find alias -findi
This commit is contained in:
@ -1951,11 +1951,11 @@ int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
|
||||
int ret;
|
||||
struct iso_volume *volume;
|
||||
|
||||
memset((char *) stbuf, 0, sizeof(struct stat));
|
||||
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)
|
||||
@ -2081,7 +2081,7 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, char *wd,
|
||||
|
||||
/* Count valid nodes, warn of invalid ones */
|
||||
for(i= 0; i<filec; i++) {
|
||||
ret= Xorriso_make_pattern_adr(xorriso, wd, filev[i], path, 1|4);
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, filev[i], path, 1|4);
|
||||
if(ret<=0) {
|
||||
was_error++;
|
||||
continue;
|
||||
@ -2107,7 +2107,7 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, char *wd,
|
||||
for(pass= 0; pass<passes; pass++)
|
||||
for(i= 0; i<filec && !(xorriso->request_to_abort); i++) {
|
||||
rpt[0]= 0;
|
||||
ret= Xorriso_make_pattern_adr(xorriso, wd, filev[i], path, 1|4);
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, filev[i], path, 1|4);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
ret= Xorriso_fake_stbuf(xorriso, path, &stbuf, &node, 0);
|
||||
@ -2481,7 +2481,7 @@ int Xorriso_obtain_pattern_files_i(
|
||||
}
|
||||
while((node= iso_tree_iter_next(iter)) != NULL) {
|
||||
name= (char *) iso_tree_node_get_name(node);
|
||||
ret= Xorriso_make_pattern_adr(xorriso, wd, name, adr, flag&4);
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, name, adr, flag&4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
ret= Xorriso_regexec(xorriso, adr, &failed_at, 1);
|
||||
@ -2714,3 +2714,89 @@ int Xorriso_set_time(struct XorrisO *xorriso, char *in_path, time_t t,
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
void *dir_node_generic, char *dir_path,
|
||||
struct stat *dir_stbuf, int depth, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct iso_tree_iter *iter= NULL;
|
||||
struct iso_tree_node_dir *dir_node;
|
||||
struct iso_tree_node *node;
|
||||
struct iso_volume *volume;
|
||||
struct stat stbuf;
|
||||
char *name, path[SfileadrL], sfe[5*SfileadrL];
|
||||
|
||||
dir_node= (struct iso_tree_node_dir *) dir_node_generic;
|
||||
if(dir_node==NULL) {
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdi, dir_path, path, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
dir_node= (struct iso_tree_node_dir *)
|
||||
iso_tree_volume_path_to_node(volume, path);
|
||||
if(dir_node==NULL)
|
||||
{ret= 0; goto ex;}
|
||||
ret= Xorriso_fake_stbuf(xorriso, "", dir_stbuf,
|
||||
(struct iso_tree_node **) &dir_node, 1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
|
||||
name= strrchr(dir_path, '/');
|
||||
if(name==NULL)
|
||||
name= dir_path;
|
||||
else
|
||||
name++;
|
||||
ret= Findjob_test(job, name, NULL, dir_stbuf, depth, 0);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret>0) {
|
||||
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(dir_path, sfe, 0));
|
||||
Xorriso_result(xorriso, 0);
|
||||
}
|
||||
}
|
||||
if(!LIBISO_ISDIR((struct iso_tree_node *) dir_node))
|
||||
{ret= 2; goto ex;}
|
||||
|
||||
iter= iso_tree_node_children(dir_node);
|
||||
if(iter==NULL) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text, "Cannot obtain ISO directory iterator");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
while((node= iso_tree_iter_next(iter)) != NULL && !xorriso->request_to_abort){
|
||||
name= (char *) iso_tree_node_get_name(node);
|
||||
ret= Xorriso_make_abs_adr(xorriso, dir_path, name, path, 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
ret= Xorriso_fake_stbuf(xorriso, "", &stbuf, &node, 1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret==0)
|
||||
continue;
|
||||
|
||||
ret= Findjob_test(job, name, dir_stbuf, &stbuf, depth, 0);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret>0) {
|
||||
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(path, sfe, 0));
|
||||
Xorriso_result(xorriso, 0);
|
||||
}
|
||||
|
||||
if(S_ISDIR(stbuf.st_mode)) {
|
||||
ret= Xorriso_findi(xorriso, job, (void *) node, path,
|
||||
&stbuf, depth+1, flag);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(iter!=NULL)
|
||||
iso_tree_iter_free(iter);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user