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 { ...@@ -48,6 +48,10 @@ struct parasite_dump_pages_args {
unsigned long nrpages_total; 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 * Misc sfuff, that is too small for separate file, but cannot
* be read w/o using parasite * be read w/o using parasite
......
...@@ -453,8 +453,30 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, pid_t pid, ...@@ -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) int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
{ {
return parasite_file_cmd("sigactions", PARASITE_CMD_DUMP_SIGACTS, struct parasite_dump_sa_args args;
CR_FD_SIGACT, ctl, cr_fdset); 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) int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
......
...@@ -262,40 +262,21 @@ static int dump_pages_fini(void) ...@@ -262,40 +262,21 @@ static int dump_pages_fini(void)
return sys_close(fd_pages); return sys_close(fd_pages);
} }
static int dump_sigact() static int dump_sigact(struct parasite_dump_sa_args *da)
{ {
rt_sigaction_t act; int sig, ret;
struct sa_entry e;
int fd, sig;
int ret;
fd = recv_fd(tsock);
if (fd < 0)
return fd;
for (sig = 1; sig < SIGMAX; sig++) { for (sig = 1; sig < SIGMAX; sig++) {
if (sig == SIGKILL || sig == SIGSTOP) if (sig == SIGKILL || sig == SIGSTOP)
continue; 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) { if (ret < 0) {
sys_write_msg("sys_sigaction failed\n"); 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; return ret;
} }
...@@ -470,7 +451,7 @@ int __used parasite_service(unsigned long cmd, void *args) ...@@ -470,7 +451,7 @@ int __used parasite_service(unsigned long cmd, void *args)
case PARASITE_CMD_DUMPPAGES: case PARASITE_CMD_DUMPPAGES:
return dump_pages((struct parasite_dump_pages_args *)args); return dump_pages((struct parasite_dump_pages_args *)args);
case PARASITE_CMD_DUMP_SIGACTS: case PARASITE_CMD_DUMP_SIGACTS:
return dump_sigact(); return dump_sigact((struct parasite_dump_sa_args *)args);
case PARASITE_CMD_DUMP_ITIMERS: case PARASITE_CMD_DUMP_ITIMERS:
return dump_itimers(); return dump_itimers();
case PARASITE_CMD_DUMP_MISC: 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