9fd4a745f8
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 *);
|