summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
6d9b54d)
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
static pid_t (*plibc_func)(void) = NULL;
sigset_t sigset;
pid_t retval;
static pid_t (*plibc_func)(void) = NULL;
sigset_t sigset;
pid_t retval;
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "fork");
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "fork");
ust_before_fork(&sigset);
/* Do the real fork */
retval = plibc_func();
ust_before_fork(&sigset);
/* Do the real fork */
retval = plibc_func();
if (retval == 0) {
/* child */
ust_after_fork_child(&sigset);
} else {
ust_after_fork_parent(&sigset);
}
if (retval == 0) {
/* child */
ust_after_fork_child(&sigset);
} else {
ust_after_fork_parent(&sigset);
}
static int (*plibc_func)(int nochdir, int noclose) = NULL;
sigset_t sigset;
int retval;
static int (*plibc_func)(int nochdir, int noclose) = NULL;
sigset_t sigset;
int retval;
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "daemon");
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "daemon");
ust_before_fork(&sigset);
/* Do the real daemon call */
retval = plibc_func(nochdir, noclose);
ust_before_fork(&sigset);
/* Do the real daemon call */
retval = plibc_func(nochdir, noclose);
if (retval == 0) {
/* child, parent called _exit() directly */
ust_after_fork_child(&sigset);
if (retval == 0) {
/* child, parent called _exit() directly */
ust_after_fork_child(&sigset);
/* on error in the parent */
ust_after_fork_parent(&sigset);
}
/* on error in the parent */
ust_after_fork_parent(&sigset);
}
/* end of var args */
va_list ap;
int retval;
/* end of var args */
va_list ap;
int retval;
va_start(ap, arg);
ptid = va_arg(ap, pid_t *);
va_start(ap, arg);
ptid = va_arg(ap, pid_t *);
*/
retval = plibc_func(fn, child_stack, flags, arg, ptid,
tls, ctid);
*/
retval = plibc_func(fn, child_stack, flags, arg, ptid,
tls, ctid);
} else {
/* Creating a real process, we need to intervene. */
struct ustfork_clone_info info = { .fn = fn, .arg = arg };
} else {
/* Creating a real process, we need to intervene. */
struct ustfork_clone_info info = { .fn = fn, .arg = arg };
ust_before_fork(&info.sigset);
retval = plibc_func(clone_fn, child_stack, flags, &info,
ptid, tls, ctid);
ust_before_fork(&info.sigset);
retval = plibc_func(clone_fn, child_stack, flags, &info,
ptid, tls, ctid);
/* The child doesn't get here. */
ust_after_fork_parent(&info.sigset);
}
/* The child doesn't get here. */
ust_after_fork_parent(&info.sigset);
}
static pid_t (*plibc_func)(void) = NULL;
sigset_t sigset;
pid_t retval;
static pid_t (*plibc_func)(void) = NULL;
sigset_t sigset;
pid_t retval;
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "rfork");
if (plibc_func == NULL) {
plibc_func = dlsym(RTLD_NEXT, "rfork");
ust_before_fork(&sigset);
/* Do the real rfork */
retval = plibc_func();
ust_before_fork(&sigset);
/* Do the real rfork */
retval = plibc_func();
if (retval == 0) {
/* child */
ust_after_fork_child(&sigset);
} else {
ust_after_fork_parent(&sigset);
}
if (retval == 0) {
/* child */
ust_after_fork_child(&sigset);
} else {
ust_after_fork_parent(&sigset);
}