diff options
author | mvs <mvs@cvs.openbsd.org> | 2021-06-01 13:13:11 +0000 |
---|---|---|
committer | mvs <mvs@cvs.openbsd.org> | 2021-06-01 13:13:11 +0000 |
commit | efe495cd2f62224a632c9c5ace1021323b93e716 (patch) | |
tree | 2ace0d94fd4ba87a0d84a4d7de7a1eb094b1ffbf /regress/sys | |
parent | a3ba0bad5e641277de8ecdcfd9e8a3b899aeaf2c (diff) |
Introduce the new test which enforces unp_gc() run and close
unreferenced descriptors.
ok bluhm@
Diffstat (limited to 'regress/sys')
-rw-r--r-- | regress/sys/kern/ungc/Makefile | 10 | ||||
-rw-r--r-- | regress/sys/kern/ungc/ungc.c | 93 |
2 files changed, 103 insertions, 0 deletions
diff --git a/regress/sys/kern/ungc/Makefile b/regress/sys/kern/ungc/Makefile new file mode 100644 index 00000000000..bbeff6f31e2 --- /dev/null +++ b/regress/sys/kern/ungc/Makefile @@ -0,0 +1,10 @@ +# $OpenBSD: Makefile,v 1.1 2021/06/01 13:13:10 mvs Exp $ + +# +# This test enforces unp_gc() to run and close unreferenced +# file descriptors. +# + +PROG= ungc + +.include <bsd.regress.mk> diff --git a/regress/sys/kern/ungc/ungc.c b/regress/sys/kern/ungc/ungc.c new file mode 100644 index 00000000000..e582abeae0b --- /dev/null +++ b/regress/sys/kern/ungc/ungc.c @@ -0,0 +1,93 @@ +/* $OpenBSD: ungc.c,v 1.1 2021/06/01 13:13:10 mvs Exp $ */ + +/* + * Copyright (c) 2021 Vitaliy Makkoveev <mvs@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/un.h> +#include <stdio.h> +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <time.h> +#include <unistd.h> + +union msg_control{ + struct cmsghdr cmsgh; + char control[CMSG_SPACE(sizeof(int)*2)]; +}; + +int main(int argc, char *argv[]) +{ + struct timespec ts_start, ts_now, ts_time; + union msg_control msg_control; + int iov_buf; + struct iovec iov; + struct msghdr msgh; + struct cmsghdr *cmsgh; + int s[2]; + int infinite = 0; + + if (argc > 1 && !strcmp(argv[1], "--infinite")) + infinite = 1; + + if (!infinite) + if (clock_gettime(CLOCK_BOOTTIME, &ts_start) <0) + err(1, "clock_gettime"); + + while (1) { + if (socketpair(AF_UNIX, SOCK_STREAM|O_NONBLOCK, 0, s) < 0) + err(1, "socketpair"); + + iov_buf = 0; + iov.iov_base = &iov_buf; + iov.iov_len = sizeof(iov_buf); + msgh.msg_control = msg_control.control; + msgh.msg_controllen = sizeof(msg_control.control); + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + msgh.msg_name = NULL; + msgh.msg_namelen = 0; + cmsgh = CMSG_FIRSTHDR(&msgh); + cmsgh->cmsg_len = CMSG_LEN(sizeof(int) * 2); + cmsgh->cmsg_level = SOL_SOCKET; + cmsgh->cmsg_type = SCM_RIGHTS; + *((int *)CMSG_DATA(cmsgh) + 0) = s[0]; + *((int *)CMSG_DATA(cmsgh) + 1) = s[1]; + + if (sendmsg(s[0], &msgh, 0) < 0) { + if (errno != EMFILE) + err(1, "sendmsg"); + } + + close(s[0]); + close(s[1]); + + if (!infinite) { + if (clock_gettime(CLOCK_BOOTTIME, &ts_now) <0) + err(1, "clock_gettime"); + + timespecsub(&ts_now, &ts_start, &ts_time); + if (ts_time.tv_sec >= 20) + break; + } + } + + return 0; +} |