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:
committed by
Andrei Vagin
parent
6085c37ba2
commit
0db135ac4f
@@ -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"
|
||||
|
||||
|
40
criu/util.c
40
criu/util.c
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user