2016-09-21 23:54:20 +03:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
2017-03-04 21:42:50 -08:00
|
|
|
#include <compel/plugins.h>
|
2017-03-04 21:42:51 -08:00
|
|
|
#include <compel/plugins/std.h>
|
2016-09-21 23:54:20 +03:00
|
|
|
|
2016-09-21 23:54:24 +03:00
|
|
|
#include "asm/prologue.h"
|
|
|
|
|
2016-09-21 23:54:20 +03:00
|
|
|
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;
|
|
|
|
|
2016-09-21 23:54:27 +03:00
|
|
|
ret = sys_recv(ctl_socket, buf, sizeof(buf), MSG_WAITALL);
|
2016-09-21 23:54:20 +03:00
|
|
|
if (ret)
|
|
|
|
goto err;
|
|
|
|
err:
|
|
|
|
sys_close(ctl_socket);
|
|
|
|
ctl_socket = -1;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-07-19 07:28:38 +00:00
|
|
|
#define plugin_init_count(size) ((size) / (sizeof(plugin_init_t *)))
|
2016-09-21 23:54:20 +03:00
|
|
|
|
2021-07-19 07:28:38 +00:00
|
|
|
int __export_std_compel_start(struct prologue_init_args *args, const plugin_init_t *const *init_array, size_t init_size)
|
2016-09-21 23:54:20 +03:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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)
|