summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorgrehan <grehan@FreeBSD.org>2011-07-18 22:00:21 +0000
committergrehan <grehan@FreeBSD.org>2011-07-18 22:00:21 +0000
commit1823067d93fba5ecf7990fee39428954fa5cbf1b (patch)
tree02a0ea02eab1c6db10baf7c805a29a81132bbe98 /lib/libc
parentcba736c8eee565e8ba803c9ef7c7f06aefb162ed (diff)
parent9a6ff5ad378cfaaa99c5162e2b0f6e4cb6a3c796 (diff)
downloadFreeBSD-src-1823067d93fba5ecf7990fee39428954fa5cbf1b.zip
FreeBSD-src-1823067d93fba5ecf7990fee39428954fa5cbf1b.tar.gz
IFC @ r224187
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/gen/posix_spawn.c5
-rw-r--r--lib/libc/sys/rfork.216
-rw-r--r--lib/libc/xdr/Makefile.inc4
-rw-r--r--lib/libc/xdr/Symbol.map5
-rw-r--r--lib/libc/xdr/xdr.318
-rw-r--r--lib/libc/xdr/xdr_sizeof.c4
6 files changed, 45 insertions, 7 deletions
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
index e4ceb20..e3124b2 100644
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/queue.h>
+#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
@@ -216,7 +217,9 @@ do_posix_spawn(pid_t *pid, const char *path,
error = errno;
_exit(127);
default:
- if (pid != NULL)
+ if (error != 0)
+ _waitpid(p, NULL, WNOHANG);
+ else if (pid != NULL)
*pid = p;
return (error);
}
diff --git a/lib/libc/sys/rfork.2 b/lib/libc/sys/rfork.2
index f1ae14b..222bac4 100644
--- a/lib/libc/sys/rfork.2
+++ b/lib/libc/sys/rfork.2
@@ -5,7 +5,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 15, 2011
+.Dd July 12, 2011
.Dt RFORK 2
.Os
.Sh NAME
@@ -84,8 +84,18 @@ Note that a lot of code will not run correctly in such an environment.
.It Dv RFSIGSHARE
If set, the kernel will force sharing the sigacts structure between the
child and the parent.
+.It Dv RFTSIGZMB
+If set, the kernel will deliver a specified signal to the parent
+upon the child exit, instead of default SIGCHLD.
+The signal number
+.Dv signum
+is specified by oring the
+.Dv RFTSIGFLAGS(signum)
+expression into
+.Fa flags .
+Specifying signal number 0 disables signal delivery upon the child exit.
.It Dv RFLINUXTHPN
-If set, the kernel will return SIGUSR1 instead of SIGCHILD upon thread
+If set, the kernel will deliver SIGUSR1 instead of SIGCHLD upon thread
exit for the child.
This is intended to mimic certain Linux clone behaviour.
.El
@@ -164,6 +174,8 @@ would be exceeded (see
Both the RFFDG and the RFCFDG flags were specified.
.It Bq Er EINVAL
Any flags not listed above were specified.
+.It Bq Er EINVAL
+An invalid signal number was specified.
.It Bq Er ENOMEM
There is insufficient swap space for the new process.
.El
diff --git a/lib/libc/xdr/Makefile.inc b/lib/libc/xdr/Makefile.inc
index 2d360ac..d1bb208 100644
--- a/lib/libc/xdr/Makefile.inc
+++ b/lib/libc/xdr/Makefile.inc
@@ -3,7 +3,8 @@
.PATH: ${.CURDIR}/xdr ${.CURDIR}/.
SRCS+= xdr.c xdr_array.c xdr_float.c xdr_mem.c \
- xdr_rec.c xdr_reference.c xdr_stdio.c
+ xdr_rec.c xdr_reference.c xdr_sizeof.c \
+ xdr_stdio.c
SYM_MAPS+= ${.CURDIR}/xdr/Symbol.map
@@ -39,6 +40,7 @@ MLINKS+= rpc_xdr.3 xdr_accepted_reply.3 \
xdr.3 xdr_reference.3 \
xdr.3 xdr_setpos.3 \
xdr.3 xdr_short.3 \
+ xdr.3 xdr_sizeof.3 \
xdr.3 xdrstdio_create.3 \
xdr.3 xdr_string.3 \
xdr.3 xdr_u_char.3 \
diff --git a/lib/libc/xdr/Symbol.map b/lib/libc/xdr/Symbol.map
index 0739b7b..a8eb3a1 100644
--- a/lib/libc/xdr/Symbol.map
+++ b/lib/libc/xdr/Symbol.map
@@ -42,7 +42,6 @@ FBSD_1.0 {
xdrrec_endofrecord;
xdr_reference;
xdr_pointer;
- /* xdr_sizeof; */ /* Why is xdr_sizeof.c not included in Makefileinc? */
xdrstdio_create;
};
@@ -51,3 +50,7 @@ FBSD_1.1 {
xdr_uint32_t;
xdr_uint64_t;
};
+
+FBSD_1.2 {
+ xdr_sizeof;
+};
diff --git a/lib/libc/xdr/xdr.3 b/lib/libc/xdr/xdr.3
index 19c7e57..69f2544 100644
--- a/lib/libc/xdr/xdr.3
+++ b/lib/libc/xdr/xdr.3
@@ -31,6 +31,7 @@
.Nm xdr_reference ,
.Nm xdr_setpos ,
.Nm xdr_short ,
+.Nm xdr_sizeof,
.Nm xdrstdio_create ,
.Nm xdr_string ,
.Nm xdr_u_char ,
@@ -561,6 +562,18 @@ A filter primitive that translates between C
integers and their external representations.
This routine returns one if it succeeds, zero otherwise.
.Pp
+.It Xo
+.Ft unsigned long
+.Xc
+.It Xo
+.Fn xdr_sizeof "xdrproc_t func" "void *data"
+.Xc
+.Pp
+This routine returns the amount of memory required to encode
+.Fa data
+using filter
+.Fa func .
+.Pp
.It Li "#ifdef _STDIO_H_"
.It Li "/* XDR using stdio library */"
.It Xo
@@ -827,3 +840,8 @@ Returns one if it succeeds, zero otherwise.
.%O RFC1014
.%Q "Sun Microsystems, Inc., USC\-ISI"
.Re
+.Sh HISTORY
+The
+.Nm xdr_sizeof
+function first appeared in
+.Fx 9.0 .
diff --git a/lib/libc/xdr/xdr_sizeof.c b/lib/libc/xdr/xdr_sizeof.c
index 20f1c3a..f33c613 100644
--- a/lib/libc/xdr/xdr_sizeof.c
+++ b/lib/libc/xdr/xdr_sizeof.c
@@ -94,7 +94,7 @@ x_inline(xdrs, len)
if (xdrs->x_op != XDR_ENCODE) {
return (NULL);
}
- if (len < (u_int)xdrs->x_base) {
+ if (len < (u_int)(uintptr_t)xdrs->x_base) {
/* x_private was already allocated */
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
@@ -106,7 +106,7 @@ x_inline(xdrs, len)
xdrs->x_base = 0;
return (NULL);
}
- xdrs->x_base = (caddr_t) len;
+ xdrs->x_base = (caddr_t)(uintptr_t)len;
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
}
OpenPOWER on IntegriCloud