mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-02 07:15:31 +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 run_tcp_server(bool daemon_mode, int *ask, int cfd, int sk);
|
||||||
int setup_tcp_client(char *hostname);
|
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 LAST_PID_PATH "sys/kernel/ns_last_pid"
|
||||||
#define PID_MAX_PATH "sys/kernel/pid_max"
|
#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;
|
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