blob: 960f31cb1f1e4d52542d73227151cd2006a509d5 [file] [log] [blame]
#include <parlib/event.h>
#include <parlib/parlib.h>
#include <parlib/uthread.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
static void ev_handler(struct event_msg *msg, unsigned int ev_type, void *data)
{
int rv;
assert(msg != NULL);
assert(ev_type == EV_USER_IPI);
(void)data;
rv = msg->ev_arg1;
exit(rv);
}
int main(int argc, char *argv[], char *envp[])
{
struct event_queue *evq, *triggered;
pid_t pid;
struct event_msg msg;
int wstatus;
register_ev_handler(EV_USER_IPI, ev_handler, 0);
evq = get_eventq(EV_MBOX_UCQ);
evq->ev_flags = EVENT_IPI | EVENT_INDIR | EVENT_SPAM_INDIR |
EVENT_WAKEUP;
register_kevent_q(evq, EV_USER_IPI);
pid = create_child_with_stdfds(argv[1], argc - 1, argv + 1, envp);
if (pid < 0) {
perror("child creation failed");
exit(-1);
}
sys_proc_run(pid);
waitpid(pid, &wstatus, 0);
if (!WIFEXITED(wstatus)) {
fprintf(stderr, "child %s did not exit normally!\n", argv[1]);
return -1;
}
return WEXITSTATUS(wstatus);
}