mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 10:16:41 +00:00
The plugin provides basic features as string copying, syscalls, printing. Not used on its own by now but will be shipping by default with other plugins. With great help from Dmitry Safonov. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
89 lines
1.5 KiB
C
89 lines
1.5 KiB
C
#include <sys/types.h>
|
|
|
|
#include "uapi/int.h"
|
|
#include "uapi/plugins.h"
|
|
#include "uapi/plugin-std.h"
|
|
|
|
extern int main(void *arg_p, unsigned int arg_s);
|
|
|
|
static struct prologue_init_args *init_args;
|
|
static int ctl_socket = -1;
|
|
|
|
int std_ctl_sock(void)
|
|
{
|
|
return ctl_socket;
|
|
}
|
|
|
|
static int init_socket(struct prologue_init_args *args)
|
|
{
|
|
int ret;
|
|
|
|
ctl_socket = sys_socket(PF_UNIX, SOCK_SEQPACKET, 0);
|
|
if (ctl_socket < 0)
|
|
return ctl_socket;
|
|
|
|
ret = sys_connect(ctl_socket, (struct sockaddr *)&args->ctl_sock_addr, args->ctl_sock_addr_len);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int fini_socket(void)
|
|
{
|
|
char buf[32];
|
|
int ret = 0;
|
|
|
|
ret = sys_shutdown(ctl_socket, SHUT_WR);
|
|
if (ret)
|
|
goto err;
|
|
|
|
ret = sys_recvfrom(ctl_socket, buf, sizeof(buf), MSG_WAITALL, 0, 0);
|
|
if (ret)
|
|
goto err;
|
|
err:
|
|
sys_close(ctl_socket);
|
|
ctl_socket = -1;
|
|
return ret;
|
|
}
|
|
|
|
#define plugin_init_count(size) ((size) / (sizeof(plugin_init_t *)))
|
|
|
|
int __export_std_compel_start(struct prologue_init_args *args,
|
|
const plugin_init_t * const *init_array,
|
|
size_t init_size)
|
|
{
|
|
unsigned int i;
|
|
int ret = 0;
|
|
|
|
init_args = args;
|
|
|
|
ret = init_socket(args);
|
|
if (ret)
|
|
return ret;
|
|
|
|
for (i = 0; i < plugin_init_count(init_size); i++) {
|
|
const plugin_init_t *d = init_array[i];
|
|
|
|
if (d && d->init) {
|
|
ret = d->init();
|
|
if (ret)
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!ret)
|
|
ret = main(args->arg_p, args->arg_s);
|
|
|
|
for (; i > 0; i--) {
|
|
const plugin_init_t *d = init_array[i - 1];
|
|
|
|
if (d && d->exit)
|
|
d->exit();
|
|
}
|
|
|
|
fini_socket();
|
|
return ret;
|
|
}
|
|
|
|
PLUGIN_REGISTER_DUMMY(std)
|