Implemented option -find alias -findi

This commit is contained in:
2007-12-21 13:16:49 +00:00
parent 6c2f033ec8
commit 1d65dc7ddb
7 changed files with 274 additions and 28 deletions

View File

@ -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);
}