Commit 0f9abfc2 authored by Pavel Emelyanov's avatar Pavel Emelyanov

sigact: Don't write sa_entry from parasite code

Pull the array of rt_sigact_t-s to the crtools instead and fill+write sa_entries there.
This is required to switch to protobuf, since we cannot use pb lib code in parasite for
encoding sa_entries.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 7861d32d
......@@ -48,6 +48,10 @@ struct parasite_dump_pages_args {
unsigned long nrpages_total;
};
struct parasite_dump_sa_args {
rt_sigaction_t sas[SIGMAX];
};
/*
* Misc sfuff, that is too small for separate file, but cannot
* be read w/o using parasite
......
......@@ -453,8 +453,30 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, pid_t pid,
int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
{
return parasite_file_cmd("sigactions", PARASITE_CMD_DUMP_SIGACTS,
CR_FD_SIGACT, ctl, cr_fdset);
struct parasite_dump_sa_args args;
int ret, i, fd;
struct sa_entry se;
ret = parasite_execute(PARASITE_CMD_DUMP_SIGACTS, ctl, &args, sizeof(args));
if (ret < 0)
return ret;
fd = fdset_fd(cr_fdset, CR_FD_SIGACT);
for (i = 1; i < SIGMAX; i++) {
if (i == SIGSTOP || i == SIGKILL)
continue;
ASSIGN_TYPED(se.sigaction, args.sas[i].rt_sa_handler);
ASSIGN_TYPED(se.flags, args.sas[i].rt_sa_flags);
ASSIGN_TYPED(se.restorer, args.sas[i].rt_sa_restorer);
ASSIGN_TYPED(se.mask, args.sas[i].rt_sa_mask.sig[0]);
if (write_img(fd, &se) < 0)
return -1;
}
return 0;
}
int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
......
......@@ -262,40 +262,21 @@ static int dump_pages_fini(void)
return sys_close(fd_pages);
}
static int dump_sigact()
static int dump_sigact(struct parasite_dump_sa_args *da)
{
rt_sigaction_t act;
struct sa_entry e;
int fd, sig;
int ret;
fd = recv_fd(tsock);
if (fd < 0)
return fd;
int sig, ret;
for (sig = 1; sig < SIGMAX; sig++) {
if (sig == SIGKILL || sig == SIGSTOP)
continue;
ret = sys_sigaction(sig, NULL, &act, sizeof(rt_sigset_t));
ret = sys_sigaction(sig, NULL, &da->sas[sig], sizeof(rt_sigset_t));
if (ret < 0) {
sys_write_msg("sys_sigaction failed\n");
goto err_close;
break;
}
ASSIGN_TYPED(e.sigaction, act.rt_sa_handler);
ASSIGN_TYPED(e.flags, act.rt_sa_flags);
ASSIGN_TYPED(e.restorer, act.rt_sa_restorer);
ASSIGN_TYPED(e.mask, act.rt_sa_mask.sig[0]);
ret = sys_write_safe(fd, &e, sizeof(e));
if (ret)
goto err_close;
}
ret = 0;
err_close:
sys_close(fd);
return ret;
}
......@@ -470,7 +451,7 @@ int __used parasite_service(unsigned long cmd, void *args)
case PARASITE_CMD_DUMPPAGES:
return dump_pages((struct parasite_dump_pages_args *)args);
case PARASITE_CMD_DUMP_SIGACTS:
return dump_sigact();
return dump_sigact((struct parasite_dump_sa_args *)args);
case PARASITE_CMD_DUMP_ITIMERS:
return dump_itimers();
case PARASITE_CMD_DUMP_MISC:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment