+ ust_after_fork_parent(&info.sigset);
+ }
+ return retval;
+}
+
+#elif defined (__FreeBSD__)
+
+pid_t rfork(int flags)
+{
+ 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) {
+ fprintf(stderr, "libustfork: unable to find \"rfork\" symbol\n");
+ return -1;
+ }
+ }
+
+ 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);