diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index c0d719371fc8..76a21975f1ac 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -47,6 +47,7 @@ SRCS+= __getosreldate.c \ err.c \ errlst.c \ errno.c \ + eventfd.c \ exec.c \ exect.c \ fdevname.c \ diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map index 2fb8e080de6a..c89eb63caada 100644 --- a/lib/libc/gen/Symbol.map +++ b/lib/libc/gen/Symbol.map @@ -422,6 +422,9 @@ FBSD_1.5 { }; FBSD_1.6 { + eventfd; + eventfd_read; + eventfd_write; getlogin_r; memalign; scandir_b; diff --git a/lib/libc/gen/eventfd.c b/lib/libc/gen/eventfd.c new file mode 100644 index 000000000000..b757f82029a9 --- /dev/null +++ b/lib/libc/gen/eventfd.c @@ -0,0 +1,54 @@ +/*- + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2005-2020 Rich Felker, et al. + * Copyright (c) 2020 Greg V + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "namespace.h" +#include +#include +#include +#include "un-namespace.h" +#include "libc_private.h" + +int eventfd(unsigned int initval, int flags) +{ + struct specialfd_eventfd args; + + args.initval = initval; + args.flags = flags; + return (__sys___specialfd(SPECIALFD_EVENTFD, &args, sizeof(args))); +} + +int eventfd_read(int fd, eventfd_t *value) +{ + return (sizeof(*value) == _read(fd, value, sizeof(*value)) ? 0 : -1); +} + +int eventfd_write(int fd, eventfd_t value) +{ + return (sizeof(value) == _write(fd, &value, sizeof(value)) ? 0 : -1); +} diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h index 21f5b1762eb4..d26c78c21c07 100644 --- a/lib/libc/include/libc_private.h +++ b/lib/libc/include/libc_private.h @@ -382,6 +382,7 @@ int __sys_sigtimedwait(const __sigset_t *, struct __siginfo *, const struct timespec *); int __sys_sigwait(const __sigset_t *, int *); int __sys_sigwaitinfo(const __sigset_t *, struct __siginfo *); +int __sys___specialfd(int, const void *, __size_t); int __sys_statfs(const char *, struct statfs *); int __sys_swapcontext(struct __ucontext *, const struct __ucontext *); diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc index 38156ccf507d..d43a59719563 100644 --- a/lib/libc/sys/Makefile.inc +++ b/lib/libc/sys/Makefile.inc @@ -178,6 +178,7 @@ MAN+= abort2.2 \ cpuset_getaffinity.2 \ cpuset_getdomain.2 \ dup.2 \ + eventfd.2 \ execve.2 \ _exit.2 \ extattr_get_file.2 \ @@ -379,6 +380,8 @@ MLINKS+=cpuset.2 cpuset_getid.2 \ MLINKS+=cpuset_getaffinity.2 cpuset_setaffinity.2 MLINKS+=cpuset_getdomain.2 cpuset_setdomain.2 MLINKS+=dup.2 dup2.2 +MLINKS+=eventfd.2 eventfd_read.3 \ + eventfd.2 eventfd_write.3 MLINKS+=execve.2 fexecve.2 MLINKS+=extattr_get_file.2 extattr.2 \ extattr_get_file.2 extattr_delete_fd.2 \