criu/test/libcriu/test_notify.c
Pavel Emelyanov 43e5d05134 libcriu: Ability to fetch arguments from notifications
After a bit more thinking I found a way to fetch arguments
from notifications -- pass opaque value into callback and
provide a set of calls for exploring one.

With this we can

a) provide more data if service supplies additional fields
   in the future
b) not check the action name to decide whether or not the
   requested argument is available

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2014-06-27 14:28:55 +04:00

93 lines
1.5 KiB
C

#include "criu.h"
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>
#include "lib.h"
#define SUCC_ECODE 42
static int actions_called = 0;
static int notify(char *action, criu_notify_arg_t na)
{
printf("ACTION: %s\n", action);
actions_called++;
return 0;
}
int main(int argc, char **argv)
{
int pid, ret, fd, p[2];
printf("--- Start loop ---\n");
pipe(p);
pid = fork();
if (pid < 0) {
perror("Can't");
return -1;
}
if (!pid) {
printf(" `- loop: initializing\n");
if (setsid() < 0)
exit(1);
close(0);
close(1);
close(2);
close(p[0]);
ret = SUCC_ECODE;
write(p[1], &ret, sizeof(ret));
close(p[1]);
while (1)
sleep(1);
exit(SUCC_ECODE);
}
close(p[1]);
/* Wait for kid to start */
ret = -1;
read(p[0], &ret, sizeof(ret));
if (ret != SUCC_ECODE) {
printf("Error starting loop\n");
goto err;
}
/* Wait for pipe to get closed, then dump */
read(p[0], &ret, 1);
close(p[0]);
printf("--- Dump loop ---\n");
criu_init_opts();
criu_set_service_address(argv[1]);
criu_set_pid(pid);
criu_set_log_file("dump.log");
criu_set_log_level(4);
criu_set_notify_cb(notify);
fd = open(argv[2], O_DIRECTORY);
criu_set_images_dir_fd(fd);
ret = criu_dump();
if (ret < 0) {
what_err_ret_mean(ret);
kill(pid, SIGKILL);
goto err;
}
printf(" `- Dump succeeded\n");
ret = 0;
err:
waitpid(pid, NULL, 0);
if (ret || !actions_called) {
printf("FAIL (%d/%d)\n", ret, actions_called);
return 1;
}
printf(" `- Success (%d actions)\n", actions_called);
return 0;
}