| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
| |
* lib/nstrftime.c (widen) [COMPILE_WIDE]: Remove.
(__strftime_internal) [COMPILE_WIDE): Instead of converting the
multibyte time zone abbreviation into a potentially unbounded
alloca buffer, convert it directly into the output buffer.
Although this code is not used in Gnulib, this can help the glibc
developers avoid the problem on the glibc side.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* doc/strings.texi: New file.
* doc/gnulib.texi (POSIXURL): New variable.
(posixheader, posixfunc, func): New macros, from GNU libunistring's
documentation.
Include strings.texi.
(Particular Modules): Don't include c-locale.texi here.
* doc/c-locale.texi: Sections become subsections, subsections become
subsubsections.
* doc/posix-functions/isalnum.texi: Mention c32isalnum.
* doc/posix-functions/isalpha.texi: Mention c32isalpha.
* doc/posix-functions/isblank.texi: Mention c32isblank.
* doc/posix-functions/iscntrl.texi: Mention c32iscntrl.
* doc/posix-functions/isdigit.texi: Mention c32isdigit.
* doc/posix-functions/isgraph.texi: Mention c32isgraph.
* doc/posix-functions/islower.texi: Mention c32islower.
* doc/posix-functions/isprint.texi: Mention c32isprint.
* doc/posix-functions/ispunct.texi: Mention c32ispunct.
* doc/posix-functions/isspace.texi: Mention c32isspace.
* doc/posix-functions/isupper.texi: Mention c32isupper.
* doc/posix-functions/isxdigit.texi: Mention c32isxdigit.
* doc/posix-functions/tolower.texi: Mention alternative APIs.
* doc/posix-functions/toupper.texi: Likewise.
* doc/posix-functions/towlower.texi: Mention c32tolower.
* doc/posix-functions/towupper.texi: Mention c32toupper.
* doc/posix-functions/wcswidth.texi: Mention c32swidth.
* doc/posix-functions/wcwidth.texi: Mention c32width.
|
|
|
|
|
|
| |
Based on explanations by Sergey Bugaev <bugaevc@gmail.com>.
* lib/sigsegv.c: Update from libsigsegv/src/fault-hurd-i386-old.h.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Problem reported by Ondrej Valousek in:
https://lists.gnu.org/r/bug-gnulib/2023-05/msg00078.html
* lib/file-has-acl.c: Include minmax.h.
[USE_ACL && HAVE_LINUX_XATTR_H && HAVE_LISTXATTR]: Include stdckdint.h.
(file_has_acl) [USE_ACL && HAVE_LINUX_XATTR_H && HAVE_LISTXATTR]:
If the file has NFSv4 ACLs, ignore any POSIX ACLs, for Fedora 39.
Return a bit faster when listxattr returns 0.
Don’t loop forever if an attacker is fiddling with ACLs.
* modules/file-has-acl (Depends-on): Add minmax, stdckdint.
|
|
|
|
|
|
|
|
| |
Reported by Pádraig Brady <P@draigBrady.com> in
<https://lists.gnu.org/archive/html/bug-gnulib/2023-05/msg00077.html>.
* m4/gnulib-common.m4 (gl_CC_GNULIB_WARNINGS): Add
-Wno-missing-field-initializers for GCC < 11.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/gettimeofday.c (gettimeofday): List the initializers of both
tv_sec and tv_usec.
* lib/glthread/thread.c (gl_thread_self): List the initializers of both
tv_sec and tv_nsec.
* lib/pthread-cond.c (pthread_cond_wait): Likewise.
* lib/thrd.c (rpl_thrd_current): Likewise.
* lib/pthread-rwlock.c (MIN): New macro.
(pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock): List the
initializers of both tv_sec and tv_nsec. Don't modify the duration after
having initialized it.
* lib/pthread_mutex_timedlock.c (MIN): New macro.
(pthread_mutex_timedlock): List the initializers of both tv_sec and
tv_nsec. Don't modify the duration after having initialized it.
|
|
|
|
| |
* lib/select.c (rpl_select): Revert last change.
|
|
|
|
| |
* lib/poll.c (poll): Remove semicolon inside braces.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This problem was found when compiling GNU Emacs with
--enable-gcc-warnings on a platform where tv_sec is 64 bits and
tv_nsec is 32 bits, and struct timespec has padding. GCC
-Wuse-of-uninitialized-value complained when a struct timespec
initialized only via assigning to tv_sec and tv_nsec was copied
via assignment (this was in lib/timespec.h’s make_timespec).
Although behavior is well-defined on this platform, the warning is
annoying and the behavior might not be well-defined on theoretical
platforms where struct timespec has other members. To work around
this, initialize all the struct’s members.
* lib/getsockopt.c (rpl_getsockopt):
* lib/gettime.c (gettime):
* lib/gettimeofday.c (gettimeofday):
* lib/glthread/thread.c (gl_thread_self):
* lib/nanosleep.c (nanosleep):
* lib/parse-datetime.y (digits_to_date_time, set_hhmmss)
(signed_seconds, unsigned_seconds, yylex, parse_datetime_body):
* lib/poll.c (poll):
* lib/pselect.c (pselect):
* lib/pthread-cond.c (endlessly, pthread_cond_timedwait):
* lib/pthread-rwlock.c (pthread_rwlock_timedrdlock)
(pthread_rwlock_timedwrlock):
* lib/pthread_mutex_timedlock.c (pthread_mutex_timedlock):
* lib/select.c (rpl_select):
* lib/settime.c (settime):
* lib/stat-time.h (get_stat_atime, get_stat_ctime)
(get_stat_mtime, get_stat_birthtime):
* lib/thrd.c (rpl_thrd_current):
* lib/timespec.h (make_timespec):
* lib/timespec_getres.c (timespec_getres):
* lib/utimecmp.c (utimecmpat):
* lib/utimens.c (fdutimens):
When filling in a struct timespec or similar time-related structure
that might be copied elsewhere, also assign to any storage other
than tv_sec and tv_nsec, to avoid undefined behavior on (likely
theoretical) platforms where struct timespec has other members,
and also to avoid warnings from GCC and/or valgrind.
|
|
|
|
| |
* m4/largefile.m4 (AC_SYS_YEAR2038_RECOMMENDED): Sync from Autoconf.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/stdio.in.h (fdopen, fopen, popen, tmpfile): Declare with
_GL_ATTRIBUTE_MALLOC, for consistency with glibc, and so that
building the fopen module with ‘gcc -O2 -Wsuggest-attribute=malloc
-Wsystem-headers -Werror’ does not fail with “stdio.h: In function
‘rpl_fopen’: stdio.h:970:1: error: function might be candidate for
attribute ‘malloc’ [-Werror=suggest-attribute=malloc]”, a problem
I noticed on both Fedora 38 and Ubuntu 23.04.
sigsegv: Add tentative support for Hurd/x86_64. Reported by
Samuel Thibault <samuel.thibault@ens-lyon.org>.
|
|
|
|
|
|
| |
Reported by Samuel Thibault <samuel.thibault@ens-lyon.org>.
* lib/sigsegv.c: Update from libsigsegv/src/fault-hurd-i386.h.
|
|
|
|
|
| |
Fix typo in previous patch, by not accessing freed storage
in the unusual case where the statck buffer is not large enough.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fedora 39 getxattr with XATTR_NAME_POSIX_ACL_ACCESS either
succeeds or fails with ENODATA, so it is no longer possible to
detect from its failure that the filesystem might support NFSv4 ACLs.
Problem reported by Ondrej Valousek in:
https://lists.gnu.org/r/bug-gnulib/2023-04/msg00228.html
Instead, use listxattr to determine whether NFSv4 ACLs are in play.
This typically saves syscalls anyway.
* lib/file-has-acl.c: In #if, use (HAVE_LINUX_XATTR_H &&
HAVE_LISTXATTR) instead of GETXATTR_WITH_POSIX_ACLS.
The following changes apply when (USE_ACL && HAVE_LINUX_XATTR_H &&
HAVE_LISTXATTR):
Include minmax.h.
(have_xattr): New function.
(file_has_acl): Try listxattr first; typically this means we need
to do no other syscall. Call getxattr only if there are NFSv4
ACLs but not POSIX ACLs.
* m4/acl.m4 (gl_FILE_HAS_ACL): Simplify by merely testing for
linux/xattr.h and listxattr. All uses changed.
|
|
|
|
| |
* build-aux/bootstrap: As above.
|
|
|
|
|
| |
* doc/parse-datetime.texi (Specifying time zone rules):
Warn against TZ="UTC=5".
|
|
|
|
|
| |
* tests/test-dirfd.c: New file.
* modules/dirfd-tests: New file.
|
|
|
|
|
|
|
| |
Reported by Bjarni Ingi Gislason <bjarniig@simnet.is> in
<https://lists.gnu.org/archive/html/bug-gnulib/2023-05/msg00040.html>.
* m4/dirfd.m4 (gl_FUNC_DIRFD): Fix mistake in last change.
|
|
|
|
|
| |
* tests/test-c32swidth.c: New file, based on tests/test-c32width.c.
* modules/c32swidth-tests: New file.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/uchar.in.h (c32swidth): New declaration.
* lib/wcswidth-impl.h: Use macros FUNC, UNIT, CHARACTER_WIDTH.
* lib/wcswidth.c: Define FUNC, UNIT, CHARACTER_WIDTH before including
wcswidth-impl.h.
* lib/c32swidth.c: New file.
* modules/c32swidth: New file.
* m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize
GNULIB_C32SWIDTH.
* modules/uchar (Makefile.am): Substitute GNULIB_C32SWIDTH.
|
|
|
|
|
| |
* lib/wcswidth-impl.h (wcswidth): Continue searching for a non-printing
wide character after the total width has become > INT_MAX.
|
|
|
|
|
|
| |
* modules/wcswidth (License): Change to LGPLv2+.
* lib/wcswidth.c: Update license notice.
* lib/wcswidth-impl.h: Likewise.
|
|
|
|
|
| |
* modules/c32width (License): Change to LGPLv2+.
* lib/c32width.c: Update license notice.
|
|
|
|
|
|
|
|
| |
* modules/c32tolower (License): Change to LGPLv2+.
* modules/c32toupper (License): Likewise.
* lib/c32tolower.c: Update license notice.
* lib/c32toupper.c: Likewise.
* lib/c32to-impl.h: Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/gen-uni-tables.c (output_simple_mapping): Bump copyright year. For
unicase/tolower.h and unicase/toupper.h, use the LGPLv2+.
* lib/unicase/tolower.h: Regenerated.
* lib/unicase/toupper.h: Likewise.
* lib/unicase/simple-mapping.h: Update license notice.
* lib/unicase/tolower.c: Likewise.
* lib/unicase/toupper.c: Likewise.
* modules/unicase/tolower (License): Change to LGPLv2+.
* modules/unicase/toupper (License): Likewise.
|
|
|
|
|
| |
* modules/unicase/base (License): Change to LGPLv2+.
* lib/unicase.in.h: Update license notice.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* modules/c32isalnum (License): Change to LGPLv2+.
* modules/c32isalpha (License): Likewise.
* modules/c32isblank (License): Likewise.
* modules/c32iscntrl (License): Likewise.
* modules/c32isdigit (License): Likewise.
* modules/c32isgraph (License): Likewise.
* modules/c32islower (License): Likewise.
* modules/c32isprint (License): Likewise.
* modules/c32ispunct (License): Likewise.
* modules/c32isspace (License): Likewise.
* modules/c32isupper (License): Likewise.
* modules/c32isxdigit (License): Likewise.
* lib/c32isalnum.c: Update license notice.
* lib/c32isalpha.c: Likewise.
* lib/c32isblank.c: Likewise.
* lib/c32iscntrl.c: Likewise.
* lib/c32isdigit.c: Likewise.
* lib/c32isgraph.c: Likewise.
* lib/c32islower.c: Likewise.
* lib/c32isprint.c: Likewise.
* lib/c32ispunct.c: Likewise.
* lib/c32isspace.c: Likewise.
* lib/c32isupper.c: Likewise.
* lib/c32isxdigit.c: Likewise.
* lib/c32is-impl.h: Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/gen-uni-tables.c (output_predicate): Bump copyright year. For
unictype/ctype_*, use the LGPLv2+.
* lib/unictype/ctype_*.h: Regenerated.
* lib/unictype/ctype_*.c: Update license notice.
* modules/unictype/ctype-alnum (License): Change to LGPLv2+.
* modules/unictype/ctype-alpha (License): Likewise.
* modules/unictype/ctype-blank (License): Likewise.
* modules/unictype/ctype-cntrl (License): Likewise.
* modules/unictype/ctype-digit (License): Likewise.
* modules/unictype/ctype-graph (License): Likewise.
* modules/unictype/ctype-lower (License): Likewise.
* modules/unictype/ctype-print (License): Likewise.
* modules/unictype/ctype-punct (License): Likewise.
* modules/unictype/ctype-space (License): Likewise.
* modules/unictype/ctype-upper (License): Likewise.
* modules/unictype/ctype-xdigit (License): Likewise.
|
|
|
|
|
| |
* tests/test-c32width.c: New file, based on tests/test-wcwidth.c.
* modules/c32width-tests: New file.
|
|
|
|
|
|
|
|
|
| |
* lib/uchar.in.h (c32width): New declaration.
* lib/c32width.c: New file, based on lib/c32is-impl.h.
* modules/c32width: New file.
* m4/uchar_h.m4 (gl_UCHAR_H_REQUIRE_DEFAULTS): Initialize
GNULIB_C32WIDTH.
* modules/uchar (Makefile.am): Substitute GNULIB_C32WIDTH.
|
|
|
|
|
| |
* m4/wcwidth.m4 (gl_FUNC_WCWIDTH): Mention macOS bugs.
* doc/posix-functions/wcwidth.texi: Update regarding macOS.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/vasnprintf.c (VASNPRINTF): When doing the padding ourselves,
ignore the '0' flag if a precision is specified and the conversion is
one of d, i, o, u, x, X, b, B.
* tests/test-vasnprintf-posix.c (test_function): Update expected results
accordingly.
* tests/test-vasprintf-posix.c (test_function): Likewise.
* tests/test-snprintf-posix.h (test_function): Likewise.
* tests/test-sprintf-posix.h (test_function): Likewise.
* tests/test-vasnwprintf-posix.c (test_function): Likewise.
|
|
|
|
|
|
| |
* lib/mktime.c: Include <intprops.h> again,
fixing a typo noted by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2023-05/msg00014.html
|
|
|
|
| |
* lib/fopen.c (rpl_fopen): Mark open_direction as used.
|
|
|
|
|
|
| |
* m4/extern-inline.m4 (gl_EXTERN_INLINE): Port to pcc
1.2.0.DEVEL 20220331, which doesn’t support extern inline
even though it claims to be GCC 4.3 and to support C11.
|
|
|
|
|
|
|
| |
* lib/regex_internal.h: Include stdckdint.h.
* lib/regexec.c (re_search_2_stub):
* modules/regex (Depends-on): Add stdckdint.
Prefer stdckdint.h to intprops.h macros.
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/malloc/dynarray_emplace_enlarge.c, lib/malloc/dynarray_resize.c:
Include stdckdint.h, not intprops.h.
* lib/malloc/dynarray_emplace_enlarge.c:
(__libc_dynarray_emplace_enlarge):
* lib/malloc/dynarray_resize.c (__libc_dynarray_resize):
Prefer stdckdint.h to intprops.h macros.
* modules/glibc-internal/dynarray (Depends-on):
Depend on stdckdint, not intprops.
|
|
|
|
|
|
|
|
|
| |
Prefer stdckdint.h macros to intprops.h macros where either will do,
as this is the C23 standard. Also, it ports around a pcc bug.
* config/srclist.txt: Comment out mktime.c.
* lib/mktime.c: Include stdckdint.h, not intprops.h.
(__mktime_internal): Prefer stdckdint.h to intprops.h macros.
* modules/mktime (Depends-on): Add stdckdint.
|
|
|
|
|
|
|
| |
* doc/posix-headers/limits.texi: Document the issue.
* lib/limits.in.h (MB_LEN_MAX): New macro, if not already defined.
* m4/limits-h.m4 (gl_LIMITS_H): Test for MB_LEN_MAX.
* tests/test-limits-h.c: Check that it’s positive.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Remove year2038-required and largefile-required, replacing
the former with year2038-recommended and simply removing
the latter. This syncs with Autoconf master.
* MODULES.html.sh, NEWS, doc/largefile.texi:
* all-modules (exclude): Exclude year2038-recommended, not -required.
* doc/posix-headers/sys_types.texi, doc/posix-headers/time.texi:
* doc/year2038.texi: Mention this.
* m4/largefile.m4: Sync from Autoconf. Override existing macros
if AC_SYS_YEAR2038_RECOMMENDED is not defined, rather than if
AC_SYS_LARGEFILE_REQUIRED is not defined.
* modules/largefile-required, modules/year2038-required: Removed.
* modules/year2038: Do not depend on largefile; simply
use m4/largefile.m4, since we shouldn’t need the extra goodies
largefile supplies.
* modules/year2038-recommended: New module.
|
|
|
|
|
|
|
|
| |
* m4/stdio_h.m4 (gl_STDIO_H_EARLY): New macro, extracted from
gl_STDIO_H.
(gl_STDIO_H): Move the code that sets __USE_MINGW_ANSI_STDIO to
gl_STDIO_H_EARLY.
* modules/stdio (configure.ac-early): New section.
|
|
|
|
| |
* tests/test-stdbool.c (WORKING_BOOL): Set to 0 on Sun C.
|
|
|
|
| |
* tests/test-hamt.c (main): Finish with exit code 0.
|
|
|
|
|
|
|
|
|
|
| |
* m4/localeconv.m4 (gl_FUNC_LOCALECONV): Test whether fields of type
'char' are filled correctly.
(gl_PREREQ_LOCALECONV): Test whether 'struct lconv' has the int_{p,n}_*
members.
* lib/localeconv.c (FIX_CHAR_VALUE): New macro.
(localeconv): Replace negative field values with CHAR_MAX.
* doc/posix-functions/localeconv.texi: Mention the mingw bug.
|
| |
|
|
|
|
|
|
|
| |
Reported by Pierre Labastie <pierre.labastie@neuf.fr> in
<https://lists.gnu.org/archive/html/bug-gnulib/2023-04/msg00220.html>.
* m4/stdlib_h.m4 (gl_STDLIB_H): Provide a 4th argument to AC_RUN_IFELSE.
|
|
|
|
| |
* lib/freopen-safer.c: Ignore -Wanalyzer-fd-leak.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/dirent-private.h: On mingw, define 'struct gl_directory' as a
wrapper around the original DIR. On MSVC, add an 'fd_to_close' field to
'struct gl_directory'.
* lib/dirent.in.h (DIR): Define when DIR_HAS_FD_MEMBER is 0, i.e. on
both mingw and MSVC.
(GNULIB_defined_DIR): New macro.
(opendir): Avoid incompatible redeclaration.
(readdir): Consider REPLACE_READDIR.
(rewinddir): Consider REPLACE_REWINDDIR.
* m4/dirent_h.m4 (gl_DIRENT_DIR): New macro.
(gl_DIRENT_H): Invoke it.
(gl_DIRENT_H_DEFAULTS): Initialize REPLACE_READDIR, REPLACE_REWINDDIR.
* modules/dirent (Makefile.am): Substitute DIR_HAS_FD_MEMBER,
REPLACE_READDIR, REPLACE_REWINDDIR.
--
* lib/dirfd.c (dirfd): If GNULIB_defined_DIR, just use the
'fd_to_close' field.
* m4/dirfd.m4 (gl_FUNC_DIRFD): Set HAVE_DIRFD. Don't set REPLACE_DIRFD
to 1 if HAVE_DIRFD is 0. If DIR_HAS_FD_MEMBER is 0, ensure dirfd.c gets
compiled.
* modules/dirfd (Files): Add lib/dirent-private.h.
(Depends-on, configure.ac): Simplify conditions.
--
* lib/closedir.c: Include <stdlib.h> always, for free().
(closedir): If GNULIB_defined_DIR, arrange to call close(dirfd(dirp)) at
the end. On mingw, call free() of dirp. Prefer testing HAVE_DIRENT_H,
for consistency with dirent.h.
* m4/closedir.m4 (gl_FUNC_CLOSEDIR): Don't set REPLACE_CLOSEDIR to 1 if
HAVE_CLOSEDIR is 0. If DIR_HAS_FD_MEMBER is 0, ensure closedir.c gets
compiled.
--
* lib/opendir.c: Include <stdlib.h> always. Include <string.h>.
(opendir): On mingw, allocate the 'struct gl_directory' through malloc.
If GNULIB_defined_DIR, set the 'fd_to_close' field to -1. Prefer
testing HAVE_DIRENT_H, for consistency with dirent.h.
* m4/opendir.m4 (gl_FUNC_OPENDIR): Don't set REPLACE_OPENDIR to 1 if
HAVE_OPENDIR is 0. If DIR_HAS_FD_MEMBER is 0, ensure opendir.c gets
compiled.
--
* lib/fdopendir.c (fdopendir): If GNULIB_defined_DIR, use a simple
implementation based on opendir and the fchdir module. If __KLIBC__,
don't define unused auxiliary functions.
* modules/fdopendir (Files): Add lib/dirent-private.h.
--
* lib/readdir.c (readdir): On mingw, redirect to the original readdir
function. Prefer testing HAVE_DIRENT_H, for consistency with dirent.h.
* m4/readdir.m4 (gl_FUNC_READDIR): If DIR_HAS_FD_MEMBER is 0, ensure
readdir.c gets compiled.
* modules/readdir (configure.ac): Consider REPLACE_READDIR.
--
* lib/rewinddir.c (rewinddir): On mingw, redirect to the original
rewinddir function. Prefer testing HAVE_DIRENT_H, for consistency with
dirent.h.
* m4/rewinddir.m4 (gl_FUNC_REWINDDIR): If DIR_HAS_FD_MEMBER is 0, ensure
rewinddir.c gets compiled.
* modules/rewinddir (configure.ac): Consider REPLACE_REWINDDIR.
--
* lib/fchdir.c (dir_info_t): Remove a FIXME.
|
|
|
|
| |
* modules/fchdir-tests (Depends-on): Add dup.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* m4/fclose.m4 (gl_FUNC_FCLOSE): Define through AC_DEFUN_ONCE. Don't
modify REPLACE_FOPEN.
* modules/fclose (Depends-on): Add comment.
(configure.ac): Don't modify REPLACE_FOPEN. Don't duplicate actions of
module 'fopen'.
* m4/fopen.m4 (gl_FUNC_FOPEN_ITSELF): Renamed from gl_FUNC_FOPEN.
(gl_FUNC_FOPEN): New macro.
* modules/fopen (Files): Add m4/fclose.m4, m4/fflush.m4.
* m4/close.m4 (gl_FUNC_CLOSE): Define through AC_DEFUN_ONCE.
|