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->errmsg[0]= 0;
m->errn= 0;
m->match_count= 0;
ret= Exprnode_new(&(m->test_tree), m, NULL, "-find", (m->use_shortcuts)<<1);
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)
{
@ -782,14 +783,18 @@ int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag)
t->test_type= 13;
else if((flag & 3) == 2)
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));
if(name_re == NULL)
{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);
if(regcomp(name_re, regexpr, 0) != 0) {
free((char *) name_re);

View File

@ -48,6 +48,7 @@ struct ExprtesT {
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
18= -has_hfs_crtp char *creator char *type
19= -has_hfs_bless int bless_index
20= -disk_path char *arg1
*/
int test_type;
@ -193,6 +194,10 @@ struct FindjoB {
-4 = unsupported command
-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.
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
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);
if(action<0)
action= 0;
job->match_count++;
hflag= 16*!(flag&2);
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,
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);
if(ret <= 0)
{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;
npt= strrchr(disk_path, '/');
if(npt != NULL)
npt++;
else
npt= disk_path;
ret= regexec(arg2, npt, 1, &name_match, 0);
ret= ! regexec(arg2, npt, 1, &name_match, 0);
ex:;
Xorriso_free_meM(disk_path);
return(!ret);
return(ret);
}
@ -2908,6 +2916,9 @@ return:
value= 1;
}
break; case 20: /* -disk_path */
value= !! Exprtest_match_disk_name(xorriso, ftest, node, 1);
break; default:
/* >>> complain about unknown test type */;

View File

@ -1,7 +1,7 @@
/* 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.
@ -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,
char disk_path[SfileadrL], int flag)
{
IsoFile *file;
IsoStream *stream= NULL, *input_stream;
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))
return(0);

View File

@ -667,15 +667,17 @@ ex:;
bit2= do not count deleted files with rm and rm_r
bit3= use Xorriso_findi_sorted() rather than Xorriso_findi()
(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 *idx, int flag)
{
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;
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 *arg1_pt;
struct stat dir_stbuf;
uid_t user= 0;
@ -769,14 +771,25 @@ not_enough_arguments:;
Findjob_set_filter_filter(job, -1, 0);
} else if(strcmp(argv[i], "-has_md5")==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)
goto not_enough_arguments;
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) {
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);
goto sorry_ex;
}
@ -1200,6 +1213,8 @@ ex:;
free(access_acl_text);
if(default_acl_text != NULL)
free(default_acl_text);
if(ret > 0 && (flag & 16) && first_job != NULL)
ret= first_job->match_count + 1;
Findjob_destroy(&first_job, 0);
Xorriso_free_meM(path);
Xorriso_free_meM(other_path_start);

View File

@ -9,7 +9,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" 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.
.\"
.\" Some roff macros, for reference:
@ -1641,7 +1641,13 @@ Matches if pattern matches the file path as it would be printed by action
.br
\fB\-disk_name\fR pattern :
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
\fB\-type\fR type_letter :
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.
-disk_name pattern :
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.
disk. 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.
-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 :
Matches files of the given type: "block", "char", "dir",
"pipe", "file", "link", "socket", "eltorito", and "Xotic"
@ -4997,43 +5003,43 @@ Node: Insert45897
Node: SetInsert55813
Node: Manip64389
Node: CmdFind73212
Node: Filter87568
Node: Writing92123
Node: SetWrite101087
Node: Bootable118920
Node: Jigdo133621
Node: Charset137867
Node: Exception140628
Node: DialogCtl146747
Node: Inquiry149344
Node: Navigate154210
Node: Verify162507
Node: Restore171473
Node: Emulation178382
Node: Scripting188193
Node: Frontend195353
Node: Examples196653
Node: ExDevices197830
Node: ExCreate198489
Node: ExDialog199774
Node: ExGrowing201039
Node: ExModifying201844
Node: ExBootable202348
Node: ExCharset202900
Node: ExPseudo203721
Node: ExCdrecord204619
Node: ExMkisofs204936
Node: ExGrowisofs206276
Node: ExException207411
Node: ExTime207865
Node: ExIncBackup208324
Node: ExRestore212315
Node: ExRecovery213275
Node: Files213845
Node: Seealso215144
Node: Bugreport215867
Node: Legal216448
Node: CommandIdx217459
Node: ConceptIdx233258
Node: Filter87916
Node: Writing92471
Node: SetWrite101435
Node: Bootable119268
Node: Jigdo133969
Node: Charset138215
Node: Exception140976
Node: DialogCtl147095
Node: Inquiry149692
Node: Navigate154558
Node: Verify162855
Node: Restore171821
Node: Emulation178730
Node: Scripting188541
Node: Frontend195701
Node: Examples197001
Node: ExDevices198178
Node: ExCreate198837
Node: ExDialog200122
Node: ExGrowing201387
Node: ExModifying202192
Node: ExBootable202696
Node: ExCharset203248
Node: ExPseudo204069
Node: ExCdrecord204967
Node: ExMkisofs205284
Node: ExGrowisofs206624
Node: ExException207759
Node: ExTime208213
Node: ExIncBackup208672
Node: ExRestore212663
Node: ExRecovery213623
Node: Files214193
Node: Seealso215492
Node: Bugreport216215
Node: Legal216796
Node: CommandIdx217807
Node: ConceptIdx233606

End Tag Table

View File

@ -50,7 +50,7 @@
@c man .\" First parameter, NAME, should be all caps
@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 .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 .\"
@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 :
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 :
Matches files of the given type:

View File

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