1 
2 /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
3 
4    Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
5 
6    Provided under GPL version 2 or later.
7 
8    This file contains declarations of classes FindjoB, ExprnodE, ExprtesT
9    which perform tree searches in libisofs or in POSIX filesystem.
10 */
11 
12 
13 #ifndef Xorriso_pvt_findjob_includeD
14 #define Xorriso_pvt_findjob_includeD yes
15 
16 
17 #define Xorriso_findjob_on_expR yes
18 
19 #ifdef Xorriso_findjob_on_expR
20 
21 /*
22    A single Testnode.
23 */
24 struct ExprtesT {
25 
26  struct FindjoB *boss;
27 
28  int invert;  /* 0=normal  1=invert result */
29 
30  /*
31    0= -false (with invert : -true)
32    1= -name char *arg1 (regex_t in *arg2)
33    2= -type char *arg1
34    3= -damaged
35    4= -lba_range int *arg1 int *arg2
36    5= -has_acl
37    6= -has_xattr
38    7= -has_aaip
39    8= -has_filter
40    9= -wanted_node IsoNode *arg1 (for internal use, arg1 not allocated)
41   10= -pending_data
42   11= -decision char *arg1 ("yes", "no")
43   12= -prune
44   13= -wholename char *arg1 (regex_t in *arg2)
45   14= -has_any_xattr
46   15= -has_md5
47   16= -disk_name char *arg1 (regex_t in *arg2)
48   17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
49   18= -has_hfs_crtp char *creator char *type
50   19= -has_hfs_bless int bless_index
51   20= -disk_path char *arg1
52   21= -bad_outname int namespace
53   22= -use_pattern char *arg1 ("on" [or "ls"], "off")
54   23= -or_use_pattern char *arg1 ("on" [or "ls"], "off")
55   24= -name_limit_blocker int *arg1
56   25= -maxdepth int *arg1
57   26= -mindepth int *arg1
58  */
59  int test_type;
60 
61  void *arg1;
62  void *arg2;
63 
64 };
65 
66 
67 /*
68    A computational node.
69    A tree of these nodes forms the expression.
70    Sequences of AND/OR operations form branches, brackets spawn new branches,
71    NOT inverts node's test resp. subtree result.
72 */
73 struct ExprnodE {
74 
75  struct ExprnodE *up;
76 
77  char origin[8];
78 
79   /* Operators */
80  int invert;  /* 0=normal  1=invert own result (subtree or test, but not op) */
81 
82  int assoc; /*
83                 0= left : compute own value, combine with left value,
84                           compute right value, combine with current value
85                 1= right: compute own value, compute right value,
86                           combine own and right, combine with left value
87              */
88 
89  int use_shortcuts; /* 0= evaluate all tests of -and and -or,
90                        1= evaluate only until the combined result is known
91                      */
92 
93  struct ExprnodE *left;
94  int left_op; /* 0=OR , 1=AND */
95 
96  struct ExprnodE *right;
97  int right_op; /* see left_op */
98 
99  /* Brackets : a pointer to the first node in a subchain */
100  struct ExprnodE *sub;
101 
102  int is_if_then_else;
103  struct ExprnodE *true_branch;
104  struct ExprnodE *false_branch;
105 
106  /* elementary test : if sub!=NULL , test is ignored */
107  struct ExprtesT *test;
108 
109  /* Result */
110  int own_value;
111  int composed_value;
112 
113 };
114 
115 
116 struct FindjoB {
117 
118  char *start_path;
119 
120  struct ExprnodE *test_tree;
121 
122  struct ExprnodE *cursor;
123  int invert;  /* 0=normal  1=set invert-property for next new test node */
124  int use_shortcuts;
125 
126  /* 0= echo
127     1= rm (also rmdir)
128     2= rm_r
129 >>> 3= mv target
130     4= chown user
131     5= chgrp group
132     6= chmod mode_and mode_or
133     7= alter_date type date
134     8= lsdl
135     9= chown_r user
136    10= chgrp_r group
137    11= chmod_r mode_and mode_or
138    12= alter_date_r type date
139    13= find
140    14= compare disk_equivalent_of_start_path
141    15= in_iso iso_rr_equivalent_of_start_path
142    16= not_in_iso iso_rr_equiv
143    17= update disk_equiv
144    18= add_missing iso_rr_equiv
145    19= empty_iso_dir iso_rr_equiv
146    20= is_full_in_iso iso_rr_equiv
147    21= report_damage
148    22= report_lba
149    23= internal: memorize path of last matching node in found_path
150    24= getfacl
151    25= setfacl access_acl default_acl
152    26= getfattr
153    27= setfattr
154    28= set_filter name
155    29= show_stream
156    30= internal: count by xorriso->node_counter
157    31= internal: register in xorriso->node_array
158    32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen
159    33= get_any_xattr
160    34= get_md5
161    35= check_md5
162    36= make_md5
163    37= mkisofs_r
164    38= sort_weight number
165    39= hide on|iso_rr|joliet|off
166    40= estimate_size
167    41= update_merge disk_equiv
168    42= rm_merge
169    43= clear_merge
170    44= list_extattr
171    45= set_hfs_crtp creator type
172    46= get_hfs_crtp
173    47= set_hfs_bless blessing
174    48= get_hfs_bless
175    49= internal: update creator, type, and blessings from persistent isofs.*
176    50= print_outname namespace
177    51= report_sections
178    52= show_stream_id
179    53= internal: show_hfs_cmd , controlled by xorriso->show_hfs_cmd*
180    54= internal: truncate_names
181    55= internal: unique_trunc_test length
182                  test for not uniquely truncatable names,
183                  result delivered in XorrisO.find_unique_trunc_result
184    56= like 54 but tolerating existing truncated names
185    57= like 55 but tolerating existing truncated names
186    58= internal: last_data_file_block
187    59= set_to_mtime
188  */
189  int action;
190  int prune;
191  int use_pattern;
192 
193  /* action specific parameters */
194  char *target;
195  char *text_2;
196  uid_t user;
197  gid_t group;
198  mode_t mode_and, mode_or;
199  int type; /* see Xorriso_set_time flag,
200               also used as weight and truncate_length */
201  time_t date;
202  char *found_path;
203  off_t estim_upper_size;
204  off_t estim_lower_size;
205  struct FindjoB *subjob;
206  uint32_t last_data_file_block;
207 
208  /* Errors */
209  char errmsg[4096];
210  int errn; /*
211              >0 = UNIX errno
212              -1 = close_bracket: no bracket open
213              -2 = binary operator or closing bracket expected
214              -3 = unexpected binary operator or closing bracket
215              -4 = unsupported command
216              -5 = -then -elseif -else -endif without -if or at wrong place
217            */
218 
219  /* Counts the test matches */
220  unsigned long match_count;
221 
222  /* Current depth of tree walking. Relative to start path. */
223  int depth;
224 
225 };
226 
227 
228 int Exprnode_destroy(struct ExprnodE **fnode, int flag);
229 
230 int Exprnode_tree_value(struct XorrisO *xorriso, struct ExprnodE *fnode,
231                         int left_value, void *node, char *name, char *path,
232                         struct stat *boss_stbuf, struct stat *stbuf, int flag);
233 
234 
235 int Findjob_new(struct FindjoB **o, char *start_path, int flag);
236 
237 int Findjob_destroy(struct FindjoB **o, int flag);
238 
239 int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
240 
241 int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
242 
243 int Findjob_set_commit_filter_2(struct FindjoB *o, int flag);
244 
245 int Findjob_set_num_filter(struct FindjoB *o, int test_type,
246                            int num1, int num2, int flag);
247 
248 int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
249                           int flag);
250 
251 int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
252 
253 /* @param value -1= only undamaged files, 1= only damaged files
254 */
255 int Findjob_set_damage_filter(struct FindjoB *o, int value, int flag);
256 
257 int Findjob_set_test_hidden(struct FindjoB *o, int mode, int flag);
258 
259 int Findjob_set_crtp_filter(struct FindjoB *o, char *creator, char *hfs_type,
260                             int flag);
261 
262 int Findjob_set_bless_filter(struct XorrisO *xorriso, struct FindjoB *o,
263                              char *blessing, int flag);
264 
265 
266 int Findjob_set_arg1(struct FindjoB *o, int test_type, char *arg1, int flag);
267 
268 int Findjob_open_bracket(struct FindjoB *job, int flag);
269 
270 int Findjob_close_bracket(struct FindjoB *job, int flag);
271 
272 int Findjob_not(struct FindjoB *job, int flag);
273 
274 int Findjob_and(struct FindjoB *job, int flag);
275 
276 int Findjob_or(struct FindjoB *job, int flag);
277 
278 int Findjob_if(struct FindjoB *job, int flag);
279 
280 int Findjob_then(struct FindjoB *job, int flag);
281 
282 int Findjob_else(struct FindjoB *job, int flag);
283 
284 int Findjob_elseif(struct FindjoB *job, int flag);
285 
286 int Findjob_endif(struct FindjoB *job, int flag);
287 
288 int Findjob_test_2(struct XorrisO *xorriso, struct FindjoB *o,
289                    void *node, char *name, char *path,
290                    struct stat *boss_stbuf, struct stat *stbuf, int flag);
291 
292 int Findjob_set_action_found_path(struct FindjoB *o, int flag);
293 
294 /* @param flag bit0= recursive
295 */
296 int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
297                               int flag);
298 
299 /* @param flag bit0= recursive
300 */
301 int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
302 
303 /* @param flag bit0= recursive
304 */
305 int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
306 
307 /* @param flag bit0= recursive
308 */
309 int Findjob_set_action_chmod(struct FindjoB *o,
310                              mode_t mode_and, mode_t mode_or, int flag);
311 
312 /* @param flag bit0= recursive
313 */
314 int Findjob_set_action_chown(struct FindjoB *o, uid_t user,int flag);
315 
316 /* @param flag bit0= -wholename rather than -name
317 */
318 int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag);
319 
320 int Findjob_set_file_type(struct FindjoB *o, char file_type, int flag);
321 
322 /* @param value -1= files without ACL, 1= only files with ACL
323 */
324 int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag);
325 
326 /* @param value -1= files without xattr, 1= only files with xattr
327    @param flag bit0=-has_any_xattr rather than -has_xattr
328 */
329 int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag);
330 
331 /* @param value -1= files without aaip, 1= only files with aaip
332 */
333 int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag);
334 
335 /* @param value -1= files without filter, 1= files with filter
336 */
337 int Findjob_set_filter_filter(struct FindjoB *o, int value, int flag);
338 
339 /* @param value -1= only without property, 1= only with property
340    @param flag bit0= pseudo-test:
341                      if no operator is open, do nothing and return 2
342 */
343 int Findjob_set_prop_filter(struct FindjoB *o, int test_type, int value,
344                             int flag);
345 
346 /* @param value -1= true, 1= false
347    @param flag bit0= pseudo-test:
348                      if no operator is open, do nothing and return 2
349 */
350 int Findjob_set_false(struct FindjoB *o, int value, int flag);
351 
352 int Findjob_set_prune(struct FindjoB *o, int flag);
353 
354 
355 int Findjob_set_action_subjob(struct FindjoB *o, int action,
356                               struct FindjoB *subjob, int flag);
357 
358 int Findjob_set_action_text_2(struct FindjoB *o, int action, char *target,
359                               char* text_2, int flag);
360 
361 int Findjob_set_action_type(struct FindjoB *o, int action, int type, int flag);
362 
363 
364 int Findjob_get_action(struct FindjoB *o, int flag);
365 
366 int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
367                              uid_t *user, gid_t *group,
368                              mode_t *mode_and, mode_t *mode_or,
369                              int *type, time_t *date, struct FindjoB **subjob,
370                              int flag);
371 
372 int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
373 
374 int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
375 
376 int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
377                                      int flag);
378 
379 #else /* Xorriso_findjob_on_expR */
380 
381 
382 struct FindjoB;
383 
384 
385 int Findjob_new(struct FindjoB **o, char *start_path, int flag);
386 
387 int Findjob_destroy(struct FindjoB **job, int flag);
388 
389 
390 /* @return 0=no match , 1=match , <0 = error
391 */
392 int Findjob_test(struct FindjoB *job, char *name,
393                  struct stat *boss_stbuf, struct stat *stbuf,
394                  int depth, int flag);
395 
396 /* @return <0 error, >=0 see xorriso.c struct FindjoB.action
397 */
398 int Findjob_get_action(struct FindjoB *o, int flag);
399 
400 /* @return <0 error, >=0 see xorriso.c struct FindjoB.action
401 */
402 int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
403                              uid_t *user, gid_t *group,
404                              mode_t *mode_and, mode_t *mode_or,
405                              int *type, time_t *date, struct FindjoB **subjob,
406                              int flag);
407 
408 /* @param flag bit0= recursive
409 */
410 int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
411                               int flag);
412 
413 /* @param flag bit0= recursive
414 */
415 int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
416 
417 /* @param flag bit0= recursive
418 */
419 int Findjob_set_action_chmod(struct FindjoB *o,
420                              mode_t mode_and, mode_t mode_or, int flag);
421 
422 /* @param flag bit0= recursive
423 */
424 int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
425 
426 int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
427 
428 int Findjob_set_action_found_path(struct FindjoB *o, int flag);
429 
430 int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
431 
432 int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
433                           int flag);
434 
435 int Findjob_get_lba_damage_filter(struct FindjoB *o, int *start_lba,
436                                   int *end_lba, int *damage_filter, int flag);
437 
438 int Findjob_get_commit_filter(struct FindjoB *o, int *commit_filter, int flag);
439 
440 int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag);
441 
442 int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag);
443 
444 int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag);
445 
446 int Findjob_get_filter_filter(struct FindjoB *o, int *value, int flag);
447 
448 int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
449 
450 int Findjob_get_wanted_node(struct FindjoB *o, void **wanted_node, int flag);
451 
452 int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
453 
454 int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
455 
456 int Findjob_get_last_data_file_block(struct FindjoB *o, uint32_t *lba,
457                                      int flag);
458 
459 #endif /* ! Xorriso_findjob_on_expR */
460 
461 
462 #endif /* ! Xorriso_pvt_findjob_includeD */
463 
464