54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <stdio.h>
 | |
| #include <ftw.h>
 | |
| #include <unistd.h>
 | |
| #include <string.h>
 | |
| #include <fcntl.h>
 | |
| 
 | |
| 
 | |
| static int remove_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
 | |
|     int rv = 2;
 | |
|     if (S_ISDIR(sb->st_mode)) {
 | |
|         rv = rmdir(fpath);
 | |
|     } else {
 | |
|         rv = remove(fpath);
 | |
|     }
 | |
|     printf("lol %s\n", fpath);
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int utilfuzz_rmrf(char *path) {
 | |
|     return nftw(path, remove_cb, 64, FTW_DEPTH | FTW_PHYS);
 | |
| }
 | |
| 
 | |
| char *globalto;
 | |
| size_t globallen = 0;
 | |
| 
 | |
| #define CP_NAME_MAX_SIZE 512
 | |
| #define CP_BUF_SIZE 4096
 | |
| static int cp_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
 | |
|     char newname[CP_NAME_MAX_SIZE];
 | |
|     char buf[CP_BUF_SIZE];
 | |
|     int rv = 2;
 | |
|     snprintf(newname, CP_NAME_MAX_SIZE-1, "%s%s", globalto, fpath+globallen);
 | |
|     if (FTW_D == typeflag) {
 | |
|         rv = mkdir(newname, sb->st_mode);
 | |
|     } else {
 | |
|         int fdin = open(fpath, O_RDONLY);
 | |
|         int fdout = open(newname, O_WRONLY|O_CREAT, sb->st_mode);
 | |
|         int nb = read(fdin, buf, CP_BUF_SIZE);
 | |
|         while (nb > 0) {
 | |
|             write(fdout, buf, nb);
 | |
|             nb = read(fdin, buf, CP_BUF_SIZE);
 | |
|         }
 | |
|         rv = 0;
 | |
|     }
 | |
|     return rv;
 | |
| }
 | |
| 
 | |
| int utilfuzz_cpr(char *pathfrom, char *pathto) {
 | |
|     globalto = pathto;
 | |
|     globallen = strlen(pathfrom);
 | |
|     return nftw(pathfrom, cp_cb, 64, FTW_PHYS);
 | |
| }
 | |
| 
 |