New -find test -disk_path

This commit is contained in:
Thomas Schmitt 2012-06-21 20:34:40 +00:00
parent b796a99a03
commit 2edce33c2e
9 changed files with 179 additions and 59 deletions

View File

@ -382,6 +382,7 @@ int Findjob_new(struct FindjoB **o, char *start_path, int flag)
m->subjob= NULL; m->subjob= NULL;
m->errmsg[0]= 0; m->errmsg[0]= 0;
m->errn= 0; m->errn= 0;
m->match_count= 0;
ret= Exprnode_new(&(m->test_tree), m, NULL, "-find", (m->use_shortcuts)<<1); ret= Exprnode_new(&(m->test_tree), m, NULL, "-find", (m->use_shortcuts)<<1);
if(ret<=0) if(ret<=0)
@ -758,7 +759,7 @@ improper_range:;
} }
/* @param flag bit0-1= 0= -name , 1= -wholename , 2= -disk_name /* @param flag bit0-1: 0= -name , 1= -wholename , 2= -disk_name , 3= -disk_path
*/ */
int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag) int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag)
{ {
@ -782,14 +783,18 @@ int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag)
t->test_type= 13; t->test_type= 13;
else if((flag & 3) == 2) else if((flag & 3) == 2)
t->test_type= 16; t->test_type= 16;
else if((flag & 3) == 3)
t->test_type= 20;
t->arg1= strdup(name_expr);
if(t->arg1 == NULL)
{ret= -1; goto ex;};
if((flag & 3) == 3)
{ret= 1; goto ex;}
name_re= (regex_t *) calloc(1, sizeof(regex_t)); name_re= (regex_t *) calloc(1, sizeof(regex_t));
if(name_re == NULL) if(name_re == NULL)
{ret= -1; goto ex;}; {ret= -1; goto ex;};
t->arg1= strdup(name_expr);
if(t->arg1 == NULL) {
free((char *) name_re);
{ret= -1; goto ex;};
}
Xorriso__bourne_to_reg(name_expr, regexpr, 0); Xorriso__bourne_to_reg(name_expr, regexpr, 0);
if(regcomp(name_re, regexpr, 0) != 0) { if(regcomp(name_re, regexpr, 0) != 0) {
free((char *) name_re); free((char *) name_re);

View File

@ -48,6 +48,7 @@ struct ExprtesT {
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet) 17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
18= -has_hfs_crtp char *creator char *type 18= -has_hfs_crtp char *creator char *type
19= -has_hfs_bless int bless_index 19= -has_hfs_bless int bless_index
20= -disk_path char *arg1
*/ */
int test_type; int test_type;
@ -193,6 +194,10 @@ struct FindjoB {
-4 = unsupported command -4 = unsupported command
-5 = -then -elseif -else -endif without -if or at wrong place -5 = -then -elseif -else -endif without -if or at wrong place
*/ */
/* Counts the test matches */
unsigned long match_count;
}; };

View File

@ -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-2011 Thomas Schmitt, <scdbackup@gmx.net> Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
@ -2422,6 +2422,7 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
&mode_and, &mode_or, &type, &date, &subjob, 0); &mode_and, &mode_or, &type, &date, &subjob, 0);
if(action<0) if(action<0)
action= 0; action= 0;
job->match_count++;
hflag= 16*!(flag&2); hflag= 16*!(flag&2);
ret= 1; ret= 1;
@ -2654,6 +2655,8 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
} }
/* flag bit0= perform -disk_path rather than -disk_name
*/
int Exprtest_match_disk_name(struct XorrisO *xorriso, struct ExprtesT *ftest, int Exprtest_match_disk_name(struct XorrisO *xorriso, struct ExprtesT *ftest,
IsoNode *node, int flag) IsoNode *node, int flag)
@ -2668,16 +2671,21 @@ int Exprtest_match_disk_name(struct XorrisO *xorriso, struct ExprtesT *ftest,
ret= Xorriso_retrieve_disk_path(xorriso, node, disk_path, 0); ret= Xorriso_retrieve_disk_path(xorriso, node, disk_path, 0);
if(ret <= 0) if(ret <= 0)
{ret= 0; goto ex;} {ret= 0; goto ex;}
if(flag & 1) {
if(strcmp(disk_path, ftest->arg1) == 0)
{ret= 1; goto ex;}
{ret= 0; goto ex;}
}
arg2= ftest->arg2; arg2= ftest->arg2;
npt= strrchr(disk_path, '/'); npt= strrchr(disk_path, '/');
if(npt != NULL) if(npt != NULL)
npt++; npt++;
else else
npt= disk_path; npt= disk_path;
ret= regexec(arg2, npt, 1, &name_match, 0); ret= ! regexec(arg2, npt, 1, &name_match, 0);
ex:; ex:;
Xorriso_free_meM(disk_path); Xorriso_free_meM(disk_path);
return(!ret); return(ret);
} }
@ -2908,6 +2916,9 @@ return:
value= 1; value= 1;
} }
break; case 20: /* -disk_path */
value= !! Exprtest_match_disk_name(xorriso, ftest, node, 1);
break; default: break; default:
/* >>> complain about unknown test type */; /* >>> complain about unknown test type */;

View File

@ -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-2011 Thomas Schmitt, <scdbackup@gmx.net> Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
@ -2069,12 +2069,78 @@ int Xorriso__file_start_lba(IsoNode *node,
} }
/* flag bit0= examine sub directories rather than data files
*/
int Xorriso_dir_disk_path(struct XorrisO *xorriso, IsoNode *dir_node,
char disk_path[SfileadrL], int flag)
{
int ret;
char *npt;
IsoNode *node;
IsoDir *dir;
IsoDirIter *iter= NULL;
dir= (IsoDir *) dir_node;
ret= iso_dir_get_children(dir, &iter);
if(ret<0) {
Xorriso_cannot_create_iter(xorriso, ret, 0);
{ret= -1; goto ex;}
}
while(1) {
ret= iso_dir_iter_next(iter, &node);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, "", ret,
"Error when iterating over directory", 0, "FAILURE", 1);
ret= -1; goto ex;
}
if(ret == 0)
break;
if(LIBISO_ISDIR(node) && (flag & 1)) {
ret= Xorriso_dir_disk_path(xorriso, node, disk_path, flag);
if(ret < 0)
goto ex;
if(ret == 0)
continue;
} else if(LIBISO_ISREG(node) && !(flag & 1)) {
ret= Xorriso_retrieve_disk_path(xorriso, node, disk_path, 0);
if(ret < 0)
goto ex;
if(ret == 0)
continue;
} else
continue;
/* Use its parent dir as answer */
npt= strrchr(disk_path, '/');
if(npt == NULL || npt == disk_path)
strcpy(disk_path, "/");
else
*npt= 0;
ret= 1; goto ex;
}
if(!(flag & 1))
ret= Xorriso_dir_disk_path(xorriso, dir_node, disk_path, 1);
else
ret= 0;
ex:
if(iter != NULL)
iso_dir_iter_free(iter);
return(ret);
}
int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node, int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node,
char disk_path[SfileadrL], int flag) char disk_path[SfileadrL], int flag)
{ {
IsoFile *file; IsoFile *file;
IsoStream *stream= NULL, *input_stream; IsoStream *stream= NULL, *input_stream;
char type_text[80], *source_path = NULL; char type_text[80], *source_path = NULL;
int ret;
if(LIBISO_ISDIR(node)) {
ret= Xorriso_dir_disk_path(xorriso, node, disk_path, 0);
return(ret);
}
if(!LIBISO_ISREG(node)) if(!LIBISO_ISREG(node))
return(0); return(0);

View File

@ -667,15 +667,17 @@ ex:;
bit2= do not count deleted files with rm and rm_r bit2= do not count deleted files with rm and rm_r
bit3= use Xorriso_findi_sorted() rather than Xorriso_findi() bit3= use Xorriso_findi_sorted() rather than Xorriso_findi()
(this can also be ordered by test -sort_lba) (this can also be ordered by test -sort_lba)
bit4= return number of matches plus 1
*/ */
int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag) int *idx, int flag)
{ {
int ret, i, end_idx, type= 0, action, deleter= 0, start_lba, count; int ret, i, end_idx, type= 0, action, deleter= 0, start_lba, count;
int list_extattr_head= 0, bsl_mem; int list_extattr_head= 0, bsl_mem, disk_path;
struct FindjoB *job, *first_job= NULL, *new_job; struct FindjoB *job, *first_job= NULL, *new_job;
char *start_path, *path= NULL, *cpt, *other_path_start= NULL, *cd_pt; char *start_path, *path= NULL, *cpt, *other_path_start= NULL, *cd_pt;
char *access_acl_text= NULL, *default_acl_text= NULL, *list_extattr_mode; char *access_acl_text= NULL, *default_acl_text= NULL, *list_extattr_mode;
char *arg1_pt;
struct stat dir_stbuf; struct stat dir_stbuf;
uid_t user= 0; uid_t user= 0;
@ -769,14 +771,25 @@ not_enough_arguments:;
Findjob_set_filter_filter(job, -1, 0); Findjob_set_filter_filter(job, -1, 0);
} else if(strcmp(argv[i], "-has_md5")==0) { } else if(strcmp(argv[i], "-has_md5")==0) {
Findjob_set_prop_filter(job, 15, 1, 0); Findjob_set_prop_filter(job, 15, 1, 0);
} else if(strcmp(argv[i], "-disk_name")==0) { } else if(strcmp(argv[i], "-disk_name")==0 ||
strcmp(argv[i], "-disk_path")==0) {
disk_path= (strcmp(argv[i], "-disk_path") == 0);
if(i+1>=end_idx) if(i+1>=end_idx)
goto not_enough_arguments; goto not_enough_arguments;
i++; i++;
ret= Findjob_set_name_expr(job, argv[i], 2); arg1_pt= argv[i];
if(disk_path) {
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, argv[i], path,
1 | 2 | 4 | 8);
if(ret<=0)
goto ex;
arg1_pt= path;
}
ret= Findjob_set_name_expr(job, arg1_pt, 2 + disk_path);
if(ret<=0) { if(ret<=0) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"-find[ix]: cannot set -disk_name expression "); "-find[ix]: cannot set %s ",
disk_path ? "-disk_path address" : "-disk_name expression");
Text_shellsafe(argv[i], xorriso->info_text, 1); Text_shellsafe(argv[i], xorriso->info_text, 1);
goto sorry_ex; goto sorry_ex;
} }
@ -1200,6 +1213,8 @@ ex:;
free(access_acl_text); free(access_acl_text);
if(default_acl_text != NULL) if(default_acl_text != NULL)
free(default_acl_text); free(default_acl_text);
if(ret > 0 && (flag & 16) && first_job != NULL)
ret= first_job->match_count + 1;
Findjob_destroy(&first_job, 0); Findjob_destroy(&first_job, 0);
Xorriso_free_meM(path); Xorriso_free_meM(path);
Xorriso_free_meM(other_path_start); Xorriso_free_meM(other_path_start);

View File

@ -9,7 +9,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Version 1.2.3, Jun 18, 2012" .TH XORRISO 1 "Version 1.2.3, Jun 21, 2012"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -1641,7 +1641,13 @@ Matches if pattern matches the file path as it would be printed by action
.br .br
\fB\-disk_name\fR pattern : \fB\-disk_name\fR pattern :
Like \-name but testing the leaf name of the file source on disk. Like \-name but testing the leaf name of the file source on disk.
Can be true only for data files which stem not from the loaded image. Can match only data files which do not stem from the loaded image,
or for directories above such data files. With directories the result can
change between \-find runs if their content stems from multiple sources.
.br
\fB\-disk_path\fR disk_path :
Matches if the given disk_path is equal to the path of the file source
on disk. The same restrictions apply as with \-disk_name.
.br .br
\fB\-type\fR type_letter : \fB\-type\fR type_letter :
Matches files of the given type: Matches files of the given type:

View File

@ -1488,8 +1488,14 @@ File: xorriso.info, Node: CmdFind, Next: Filter, Prev: Manip, Up: Options
can be matched by wildcards. can be matched by wildcards.
-disk_name pattern : -disk_name pattern :
Like -name but testing the leaf name of the file source on Like -name but testing the leaf name of the file source on
disk. Can be true only for data files which stem not from disk. Can match only data files which do not stem from the
the loaded image. loaded image, or for directories above such data files. With
directories the result can change between -find runs if their
content stems from multiple sources.
-disk_path disk_path :
Matches if the given disk_path is equal to the path of the
file source on disk. The same restrictions apply as with
-disk_name.
-type type_letter : -type type_letter :
Matches files of the given type: "block", "char", "dir", Matches files of the given type: "block", "char", "dir",
"pipe", "file", "link", "socket", "eltorito", and "Xotic" "pipe", "file", "link", "socket", "eltorito", and "Xotic"
@ -4997,43 +5003,43 @@ Node: Insert45897
Node: SetInsert55813 Node: SetInsert55813
Node: Manip64389 Node: Manip64389
Node: CmdFind73212 Node: CmdFind73212
Node: Filter87568 Node: Filter87916
Node: Writing92123 Node: Writing92471
Node: SetWrite101087 Node: SetWrite101435
Node: Bootable118920 Node: Bootable119268
Node: Jigdo133621 Node: Jigdo133969
Node: Charset137867 Node: Charset138215
Node: Exception140628 Node: Exception140976
Node: DialogCtl146747 Node: DialogCtl147095
Node: Inquiry149344 Node: Inquiry149692
Node: Navigate154210 Node: Navigate154558
Node: Verify162507 Node: Verify162855
Node: Restore171473 Node: Restore171821
Node: Emulation178382 Node: Emulation178730
Node: Scripting188193 Node: Scripting188541
Node: Frontend195353 Node: Frontend195701
Node: Examples196653 Node: Examples197001
Node: ExDevices197830 Node: ExDevices198178
Node: ExCreate198489 Node: ExCreate198837
Node: ExDialog199774 Node: ExDialog200122
Node: ExGrowing201039 Node: ExGrowing201387
Node: ExModifying201844 Node: ExModifying202192
Node: ExBootable202348 Node: ExBootable202696
Node: ExCharset202900 Node: ExCharset203248
Node: ExPseudo203721 Node: ExPseudo204069
Node: ExCdrecord204619 Node: ExCdrecord204967
Node: ExMkisofs204936 Node: ExMkisofs205284
Node: ExGrowisofs206276 Node: ExGrowisofs206624
Node: ExException207411 Node: ExException207759
Node: ExTime207865 Node: ExTime208213
Node: ExIncBackup208324 Node: ExIncBackup208672
Node: ExRestore212315 Node: ExRestore212663
Node: ExRecovery213275 Node: ExRecovery213623
Node: Files213845 Node: Files214193
Node: Seealso215144 Node: Seealso215492
Node: Bugreport215867 Node: Bugreport216215
Node: Legal216448 Node: Legal216796
Node: CommandIdx217459 Node: CommandIdx217807
Node: ConceptIdx233258 Node: ConceptIdx233606
 
End Tag Table End Tag Table

View File

@ -50,7 +50,7 @@
@c man .\" First parameter, NAME, should be all caps @c man .\" First parameter, NAME, should be all caps
@c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
@c man .\" other parameters are allowed: see man(7), man(1) @c man .\" other parameters are allowed: see man(7), man(1)
@c man .TH XORRISO 1 "Version 1.2.3, Jun 18, 2012" @c man .TH XORRISO 1 "Version 1.2.3, Jun 21, 2012"
@c man .\" Please adjust this date whenever revising the manpage. @c man .\" Please adjust this date whenever revising the manpage.
@c man .\" @c man .\"
@c man .\" Some roff macros, for reference: @c man .\" Some roff macros, for reference:
@ -2014,7 +2014,13 @@ Matches if pattern matches the file path as it would be printed by action
@* @*
@item -disk_name pattern : @item -disk_name pattern :
Like -name but testing the leaf name of the file source on disk. Like -name but testing the leaf name of the file source on disk.
Can be true only for data files which stem not from the loaded image. Can match only data files which do not stem from the loaded image,
or for directories above such data files. With directories the result can
change between -find runs if their content stems from multiple sources.
@*
@item -disk_path disk_path :
Matches if the given disk_path is equal to the path of the file source
on disk. The same restrictions apply as with -disk_name.
@* @*
@item -type type_letter : @item -type type_letter :
Matches files of the given type: Matches files of the given type:

View File

@ -1 +1 @@
#define Xorriso_timestamP "2012.06.20.190651" #define Xorriso_timestamP "2012.06.21.203531"