For loop detection, a history is mandatory. In the process of also adding a flexible struct to recurse, the recurse-definition was moved to fs.h. The motivation behind the struct is to allow easy extensions to the recurse-function without having to change the prototypes of all functions in the process. Adding flags is really simple as well now. Using the recursor-struct, it's also easier to see which defaults apply to a program (for instance, which type of follow, ...). Another change was to add proper stat-lstat-usage in recurse. It was wrong before.
		
			
				
	
	
		
			40 lines
		
	
	
		
			770 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			770 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* See LICENSE file for copyright and license details. */
 | |
| #include <sys/types.h>
 | |
| 
 | |
| struct history {
 | |
|         struct history *prev;
 | |
|         dev_t dev;
 | |
|         ino_t ino;
 | |
| };
 | |
| 
 | |
| struct recursor {
 | |
|         void (*fn)(const char *, void *, struct recursor *);
 | |
|         struct history *hist;
 | |
|         int depth;
 | |
|         int follow;
 | |
|         int flags;
 | |
| };
 | |
| 
 | |
| enum {
 | |
|         SAMEDEV = 1 << 0,
 | |
| };
 | |
| 
 | |
| extern int cp_aflag;
 | |
| extern int cp_fflag;
 | |
| extern int cp_pflag;
 | |
| extern int cp_rflag;
 | |
| extern int cp_vflag;
 | |
| extern int cp_HLPflag;
 | |
| extern int cp_status;
 | |
| 
 | |
| extern int rm_fflag;
 | |
| extern int rm_rflag;
 | |
| extern int rm_status;
 | |
| 
 | |
| extern int recurse_status;
 | |
| 
 | |
| void recurse(const char *, void *, struct recursor *);
 | |
| 
 | |
| int cp(const char *, const char *, int);
 | |
| void rm(const char *, void *, struct recursor *);
 |