2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-09-01 14:55:39 +00:00

util: add rm -rf function

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Tycho Andersen
2021-04-09 11:36:38 +02:00
committed by Andrei Vagin
parent 6085c37ba2
commit 0db135ac4f
2 changed files with 43 additions and 0 deletions

View File

@@ -284,6 +284,9 @@ int setup_tcp_server(char *type, char *addr, unsigned short *port);
int run_tcp_server(bool daemon_mode, int *ask, int cfd, int sk);
int setup_tcp_client(char *hostname);
/* *dir should be writable and at least PATH_MAX long */
int rm_rf(char *dir);
#define LAST_PID_PATH "sys/kernel/ns_last_pid"
#define PID_MAX_PATH "sys/kernel/pid_max"

View File

@@ -1611,3 +1611,43 @@ ssize_t write_all(int fd, const void *buf, size_t size)
}
return n;
}
int rm_rf(char *target)
{
int offset = strlen(target);
DIR *dir = NULL;
struct dirent *de;
int ret = -1;
dir = opendir(target);
if (!dir) {
pr_perror("unable to open %s", target);
return -1;
}
while ((de = readdir(dir))) {
int n;
if (dir_dots(de))
continue;
n = snprintf(target + offset, PATH_MAX - offset, "/%s", de->d_name);
if (n < 0 || n >= PATH_MAX) {
pr_err("snprintf failed\n");
goto out;
}
if (de->d_type == DT_DIR && rm_rf(target))
goto out;
if (remove(target) < 0) {
pr_perror("unable to remove %s", target);
goto out;
}
}
ret = 0;
out:
target[offset] = 0;
return ret;
}