2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-28 04:48:16 +00:00
criu/test/others/libcriu/test_errno.c
Andrew Vagin 88aaae3ace tests: move non-zdtm tests to tests/others/
Signed-off-by: Andrew Vagin <avagin@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
2016-02-24 13:09:17 +03:00

155 lines
2.4 KiB
C

#include "criu.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define PID_MAX "/proc/sys/kernel/pid_max"
static int dir_fd;
static char *service;
static int init(char *argv[])
{
service = argv[1];
dir_fd = open(argv[2], O_DIRECTORY);
if (dir_fd < 0) {
perror("Can't open images dir");
return -1;
}
return 0;
}
static void get_base_req(void)
{
criu_init_opts();
criu_set_service_binary(service);
criu_set_images_dir_fd(dir_fd);
criu_set_log_level(4);
}
static int check_resp(int ret, int expected_ret, int err, int expected_err)
{
if (ret != expected_ret) {
fprintf(stderr, "Unexpected ret %d (%d expected)\n", ret, expected_ret);
return -1;
}
if (err != expected_err) {
fprintf(stderr, "Unexpected errno %d (%d expected)\n", err, expected_err);
return -1;
}
return 0;
}
static int no_process(void)
{
FILE *f = NULL;
size_t len;
ssize_t count;
char *buf = NULL;
int pid, fd, ret;
printf("--- Try to dump unexisting process\n");
f = fopen(PID_MAX, "r");
if (!f) {
perror("Can't open " PID_MAX);
goto err;
}
count = getline(&buf, &len, f);
if (count == -1) {
perror("Can't read " PID_MAX);
goto err;
}
pid = atoi(buf);
if (!kill(pid, 0)) {
fprintf(stderr, "max pid is taken\n");
goto err;
}
get_base_req();
criu_set_pid(pid);
ret = criu_dump();
if (check_resp(ret, -EBADE, errno, ESRCH))
goto err;
printf(" `- Success\n");
return 0;
err:
if (f)
fclose(f);
return -1;
}
static int process_exists(void)
{
int ret;
printf("--- Try to restore process which pid is already taken by other process\n");
get_base_req();
criu_set_leave_running(true);
if (criu_dump()) {
fprintf(stderr, "Self-dump failed");
goto err;
}
get_base_req();
ret = criu_restore();
if (check_resp(ret, -EBADE, errno, EEXIST))
goto err;
printf(" `- Success\n");
return 0;
err:
return -1;
}
static int bad_options(void)
{
int ret;
printf("--- Try to send criu invalid opts\n");
get_base_req();
criu_set_log_file("../file.log");
ret = criu_dump();
if (check_resp(ret, -EBADE, errno, EBADRQC))
goto err;
printf(" `- Success\n");
return 0;
err:
return -1;
}
int main(int argc, char *argv[])
{
int ret = 1;
if (init(argv))
goto out;
if (no_process() || process_exists() || bad_options())
goto out;
ret = 0;
out:
if (dir_fd)
close(dir_fd);
return ret;
}