diff options
author | 2014-08-15 04:14:36 +0000 | |
---|---|---|
committer | 2014-08-15 04:14:36 +0000 | |
commit | b14f942ac6d84b4205b7a3031c1859c82ef887b7 (patch) | |
tree | 1ac5fb2dce5e1ec372096da9f1f1bbb2c7f95078 /lib/libc/stdlib | |
parent | Use O_CLOEXEC wherever we open a file and then call fcntl(F_SETFD, FD_CLOEXEC) (diff) | |
download | wireguard-openbsd-b14f942ac6d84b4205b7a3031c1859c82ef887b7.tar.xz wireguard-openbsd-b14f942ac6d84b4205b7a3031c1859c82ef887b7.zip |
XPG requires insque() and remque() to work with linear lists and not just
circular lists. Amazingly, they managed to extend the requirements to no
longer match the behavior of the VAX instructions they were modeled after,
so the trivial VAX ASM versions have to go. Nice job breaking it, X/Open!
Based on a diff from enh (at) google.com
ok miod@
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r-- | lib/libc/stdlib/Makefile.inc | 15 | ||||
-rw-r--r-- | lib/libc/stdlib/insque.c | 20 | ||||
-rw-r--r-- | lib/libc/stdlib/remque.c | 12 |
3 files changed, 26 insertions, 21 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index 80c3e5f5a1e..0c0b1499f8b 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -1,13 +1,14 @@ -# $OpenBSD: Makefile.inc,v 1.53 2014/05/08 21:43:49 deraadt Exp $ +# $OpenBSD: Makefile.inc,v 1.54 2014/08/15 04:14:36 guenther Exp $ # stdlib sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/stdlib ${LIBCSRCDIR}/stdlib SRCS+= a64l.c abort.c atexit.c atoi.c atof.c atol.c atoll.c bsearch.c \ cfree.c exit.c ecvt.c gcvt.c getenv.c getopt_long.c \ - getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c l64a.c llabs.c \ - lldiv.c lsearch.c malloc.c reallocarray.c merge.c posix_pty.c \ - qsort.c radixsort.c rand.c random.c realpath.c setenv.c strtoimax.c \ + getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c insque.c \ + l64a.c llabs.c lldiv.c lsearch.c malloc.c reallocarray.c \ + merge.c posix_pty.c qsort.c radixsort.c rand.c random.c \ + realpath.c remque.c setenv.c strtoimax.c \ strtol.c strtoll.c strtonum.c strtoul.c strtoull.c strtoumax.c \ system.c tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c \ lcong48.c lrand48.c mrand48.c nrand48.c seed48.c srand48.c qabs.c \ @@ -24,12 +25,6 @@ SRCS+= abs.c div.c labs.c ldiv.c SRCS+= abs.c div.c labs.c ldiv.c .endif -.if (${MACHINE_CPU} == "vax") -SRCS+= insque.S remque.S -.else -SRCS+= insque.c remque.c -.endif - MAN+= a64l.3 abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 atoll.3 \ bsearch.3 div.3 ecvt.3 exit.3 getenv.3 getopt.3 getopt_long.3 \ getsubopt.3 hcreate.3 imaxabs.3 imaxdiv.3 insque.3 labs.3 ldiv.3 \ diff --git a/lib/libc/stdlib/insque.c b/lib/libc/stdlib/insque.c index 8724efec74a..590ff837b82 100644 --- a/lib/libc/stdlib/insque.c +++ b/lib/libc/stdlib/insque.c @@ -1,4 +1,4 @@ -/* $OpenBSD: insque.c,v 1.2 2005/08/08 08:05:36 espie Exp $ */ +/* $OpenBSD: insque.c,v 1.3 2014/08/15 04:14:36 guenther Exp $ */ /* * Copyright (c) 1993 John Brezak @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <stdlib.h> #include <search.h> struct qelem { @@ -38,11 +39,16 @@ struct qelem { void insque(void *entry, void *pred) { - struct qelem *e = (struct qelem *) entry; - struct qelem *p = (struct qelem *) pred; + struct qelem *e = entry; + struct qelem *p = pred; - e->q_forw = p->q_forw; - e->q_back = p; - p->q_forw->q_back = e; - p->q_forw = e; + if (p == NULL) + e->q_forw = e->q_back = NULL; + else { + e->q_forw = p->q_forw; + e->q_back = p; + if (p->q_forw != NULL) + p->q_forw->q_back = e; + p->q_forw = e; + } } diff --git a/lib/libc/stdlib/remque.c b/lib/libc/stdlib/remque.c index ae249ae0538..71b74b2dce0 100644 --- a/lib/libc/stdlib/remque.c +++ b/lib/libc/stdlib/remque.c @@ -1,4 +1,4 @@ -/* $OpenBSD: remque.c,v 1.2 2005/08/08 08:05:37 espie Exp $ */ +/* $OpenBSD: remque.c,v 1.3 2014/08/15 04:14:36 guenther Exp $ */ /* * Copyright (c) 1993 John Brezak @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <stdlib.h> #include <search.h> struct qelem { @@ -38,7 +39,10 @@ struct qelem { void remque(void *element) { - struct qelem *e = (struct qelem *) element; - e->q_forw->q_back = e->q_back; - e->q_back->q_forw = e->q_forw; + struct qelem *e = element; + + if (e->q_forw != NULL) + e->q_forw->q_back = e->q_back; + if (e->q_back != NULL) + e->q_back->q_forw = e->q_forw; } |