[PATCH v5 1/5] libcsupport: Added futimens() and utimensat()
Gedare Bloom
gedare at rtems.org
Tue May 18 18:23:30 UTC 2021
On Mon, May 17, 2021 at 7:25 AM Ryan Long <ryan.long at oarcorp.com> wrote:
>
> Created futimens.c and utimensat.c to add support for the POSIX
> methods futimens() and utimensat().
>
> utime() and utimes() are considered obsolote by POSIX, but RTEMS
> will continue to support them.
>
> Closes #4396
> ---
> cpukit/Makefile.am | 2 +
> cpukit/include/rtems/libio_.h | 95 +++++++++++--
> cpukit/include/rtems/score/timespec.h | 44 +++++-
> cpukit/libcsupport/src/futimens.c | 87 ++++++++++++
> cpukit/libcsupport/src/utimensat.c | 225 +++++++++++++++++++++++++++++++
> cpukit/score/src/timespecisnonnegative.c | 54 ++++++++
> spec/build/cpukit/librtemscpu.yml | 3 +
> 7 files changed, 495 insertions(+), 15 deletions(-)
> create mode 100644 cpukit/libcsupport/src/futimens.c
> create mode 100644 cpukit/libcsupport/src/utimensat.c
> create mode 100644 cpukit/score/src/timespecisnonnegative.c
>
> diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
> index b0df610..29b4207 100644
> --- a/cpukit/Makefile.am
> +++ b/cpukit/Makefile.am
> @@ -262,6 +262,8 @@ librtemscpu_a_SOURCES += libcsupport/src/unmount.c
> librtemscpu_a_SOURCES += libcsupport/src/__usrenv.c
> librtemscpu_a_SOURCES += libcsupport/src/utime.c
> librtemscpu_a_SOURCES += libcsupport/src/utimes.c
> +librtemscpu_a_SOURCES += libcsupport/src/futimens.c
> +librtemscpu_a_SOURCES += libcsupport/src/utimensat.c
> librtemscpu_a_SOURCES += libcsupport/src/utsname.c
> librtemscpu_a_SOURCES += libcsupport/src/vprintk.c
> librtemscpu_a_SOURCES += libcsupport/src/write.c
> diff --git a/cpukit/include/rtems/libio_.h b/cpukit/include/rtems/libio_.h
> index e9eb462..26d6c1e 100644
> --- a/cpukit/include/rtems/libio_.h
> +++ b/cpukit/include/rtems/libio_.h
> @@ -1,23 +1,42 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> /**
> * @file
> *
> * @brief LibIO Internal Interface
> - *
> + *
> * This file is the libio internal interface.
> */
>
> /*
> - * COPYRIGHT (c) 1989-2011.
> - * On-Line Applications Research Corporation (OAR).
> + * COPYRIGHT (C) 1989, 2021 On-Line Applications Research Corporation (OAR).
> *
> - * Modifications to support reference counting in the file system are
> - * Copyright (c) 2012 embedded brains GmbH.
> + * Modifications to support reference counting in the file system are
> + * Copyright (c) 2012 embedded brains GmbH.
> *
> - * The license and distribution terms for this file may be
> - * found in the file LICENSE in this distribution or at
> - * http://www.rtems.org/license/LICENSE.
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> */
>
> +
@Joel Sherrill delete this extra blank line before push
> #ifndef _RTEMS_RTEMS_LIBIO__H
> #define _RTEMS_RTEMS_LIBIO__H
>
> @@ -30,6 +49,7 @@
> #include <rtems/libio.h>
> #include <rtems/seterr.h>
> #include <rtems/score/assert.h>
> +#include <rtems/score/timespec.h>
>
> #ifdef __cplusplus
> extern "C" {
> @@ -357,6 +377,65 @@ static inline void rtems_filesystem_instance_unlock(
> (*mt_entry->ops->unlock_h)( mt_entry );
> }
>
> +/**
> + * @brief Checks the tv_nsec member of a timespec struct
> + *
> + * This function is used with utimensat() and futimens() only. This ensures
> + * that the value in the tv_nsec member is equal to either UTIME_NOW,
> + * UTIME_OMIT, or a value greater-than or equal to zero and less than a
> + * billion.
> + *
> + * @param[in] time The timespec struct to be validated
> + *
> + * @retval true The tv_nsec member is a valid value.
> + * @retval false The tv_nsec member is not a valid value.
> + */
> +bool rtems_filesystem_utime_tv_nsec_valid( struct timespec time );
> +
> +/**
> + * @brief Checks for errors and if the process has write permissions to the file.
> + *
> + * This function is only used with utimensat() and futimens().It checks for
> + * EACCES and EPERM errors depending on what values are in @a times and if the
> + * process has write permissions to the file.
> + *
> + * @param[in] currentloc The current location to a file
> + * @param[in] times The timespecs used to check for errors. The timespec at
> + * index 0 is the access time, and the timespec at index 1 is
> + * the modification time.
> + *
> + * @retval 0 An error was not found.
> + * @retval -1 An error was found.
> + */
> +int rtems_filesystem_utime_check_permissions(
> + const rtems_filesystem_location_info_t *currentloc,
> + const struct timespec times[2]
> +);
> +
> +/**
> + * @brief Checks @a times and fills @a new_times with the time to be written
> + *
> + * This function is only used with utimensat() and futimens(). @a times contains
> + * the constant values passed into utimensat/futimens. @a new_times contains the
> + * values that will be written to the file. These values depend on @a times. If
> + * @a times is NULL, or either of its elements' tv_nsec members are UTIME_NOW,
> + * the current elapsed time in nanoseconds will be saved in the corresponding
> + * location in @a new_times.
> + *
> + * For each of the arguments, the timespec at index 0 is the access time, and
> + * the timespec at index 1 is the modification time.
> + *
> + * @param[in] times The timespecs to be checked
> + * @param[out] new_times The timespecs containing the time to be written
> + *
> + * @retval 0 @a times is valid.
> + * @retval -1 @a times is not valid.
> + */
> +int rtems_filesystem_utime_update(
> + const struct timespec times[2],
> + struct timespec new_times[2]
> +);
> +
> /*
> * File Descriptor Routine Prototypes
> */
> diff --git a/cpukit/include/rtems/score/timespec.h b/cpukit/include/rtems/score/timespec.h
> index 314d804..2090f19 100644
> --- a/cpukit/include/rtems/score/timespec.h
> +++ b/cpukit/include/rtems/score/timespec.h
> @@ -1,19 +1,37 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> /**
> * @file
> *
> * @ingroup Timespec
> *
> * @brief This header file provides the interfaces of the
> - * @ref RTEMSScoreTimespec.
> + * @ref RTEMSScoreTimespec.
> */
>
> /*
> - * COPYRIGHT (c) 1989-2009.
> - * On-Line Applications Research Corporation (OAR).
> - *
> - * The license and distribution terms for this file may be
> - * found in the file LICENSE in this distribution or at
> - * http://www.rtems.org/license/LICENSE.
> + * COPYRIGHT (C) 1989, 2021 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> */
>
> #ifndef _RTEMS_SCORE_TIMESPEC_H
> @@ -106,6 +124,18 @@ uint64_t _Timespec_Get_as_nanoseconds(
> );
>
> /**
> + * @brief Checks if the values in @a time are non-negative.
> + *
> + * @param[in] time is the timespec instance to validate.
> + *
> + * @retval true If @a time is filled with non-negative values.
> + * @retval false If @a time is not filled with non-negative values.
> + */
> +bool _Timespec_Is_non_negative(
> + const struct timespec *time
> +);
> +
> +/**
> * @brief Checks if timespec is valid.
> *
> * This method determines the validity of a timespec.
> diff --git a/cpukit/libcsupport/src/futimens.c b/cpukit/libcsupport/src/futimens.c
> new file mode 100644
> index 0000000..f82c782
> --- /dev/null
> +++ b/cpukit/libcsupport/src/futimens.c
> @@ -0,0 +1,87 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup libcsupport
> + *
> + * @brief Set file access and modification times based on file descriptor in
> + * nanoseconds.
> + */
> +
> +/*
> + * COPYRIGHT (C) 2021 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <sys/stat.h>
> +#include <rtems/libio_.h>
> +
> +#include <fcntl.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
> +/**
> + * https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/functions/futimens.html
> + *
> + * Set file access and modification times
> + */
> +int futimens(
> + int fd,
> + const struct timespec times[2]
> +)
> +{
> + int rv;
> + rtems_libio_t *iop;
> + struct timespec new_times[2];
> + const rtems_filesystem_location_info_t *currentloc = NULL;
> +
> + LIBIO_GET_IOP_WITH_ACCESS( fd, iop, LIBIO_FLAGS_READ, EBADF );
> +
> + currentloc = &iop->pathinfo;
> +
> + rv = rtems_filesystem_utime_update( times, new_times );
> + if ( rv != 0 ) {
> + rtems_libio_iop_drop( iop );
> + return rv;
> + }
> +
> + rv = rtems_filesystem_utime_check_permissions( currentloc, times );
> + if ( rv != 0 ) {
> + rtems_libio_iop_drop( iop );
> + return rv;
> + }
> +
> + rv = (*currentloc->mt_entry->ops->utime_h)(
> + currentloc,
> + new_times
> + );
> +
> + rtems_libio_iop_drop( iop );
> +
> + return rv;
> +}
> diff --git a/cpukit/libcsupport/src/utimensat.c b/cpukit/libcsupport/src/utimensat.c
> new file mode 100644
> index 0000000..3e91b65
> --- /dev/null
> +++ b/cpukit/libcsupport/src/utimensat.c
> @@ -0,0 +1,225 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup libcsupport
> + *
> + * @brief Set file access and modification times in nanoseconds.
> + */
> +
> +/*
> + * COPYRIGHT (C) 2021 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/libio_.h>
> +#include <rtems/score/todimpl.h>
> +
> +#include <fcntl.h>
> +#include <string.h>
> +
> +/*
> + * Make sure that tv_nsec is either UTIME_NOW, UTIME_OMIT, a value
> + * greater than zero, or a value less-than a billion.
> + *
> + * These guidelines come from the description of the EINVAL errors on
> + * https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html
> + */
> +bool rtems_filesystem_utime_tv_nsec_valid(struct timespec time)
> +{
> + if ( time.tv_nsec == UTIME_NOW ) {
> + return true;
> + }
> +
> + if ( time.tv_nsec == UTIME_OMIT ) {
> + return true;
> + }
> +
> + if ( time.tv_nsec < 0 ) {
> + return false;
> + }
> +
> + if ( time.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
> + return false;
> + }
> +
> + return true;
> +}
> +
> +/* Determine whether the access and modified timestamps can be updated */
> +int rtems_filesystem_utime_check_permissions(
> + const rtems_filesystem_location_info_t * currentloc,
> + const struct timespec times[2]
> +)
> +{
> + struct stat st = {};
> + int rv;
> + bool write_access;
> +
> + rv = (*currentloc->handlers->fstat_h)( currentloc, &st );
> + if ( rv != 0 ) {
> + rtems_set_errno_and_return_minus_one( ENOENT );
> + }
> +
> + write_access = rtems_filesystem_check_access(
> + RTEMS_FS_PERMS_WRITE,
> + st.st_mode,
> + st.st_uid,
> + st.st_gid
> + );
> +
> + /*
> + * The logic for the EACCES error is an inverted subset of the EPERM
> + * conditional according to the POSIX standard.
> + */
> + if ( (times == NULL) ||
> + ( (times[0].tv_nsec == UTIME_NOW) && (times[1].tv_nsec == UTIME_NOW) )) {
> + if ( !write_access ) {
> + rtems_set_errno_and_return_minus_one( EACCES );
> + }
> + } else {
> + if ( times[0].tv_nsec != UTIME_OMIT || times[1].tv_nsec != UTIME_OMIT ) {
> + if ( !write_access ) {
> + rtems_set_errno_and_return_minus_one( EPERM );
> + }
> + }
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Determine if the current time needs to be gotten, and then check
> + * whether the values in times are valid.
> + */
> +int rtems_filesystem_utime_update(
> + const struct timespec times[2],
> + struct timespec new_times[2]
> +)
> +{
> + bool got_time = false;
> + struct timespec now;
> +
> + /*
> + * If times is NULL, it's equivalent to adding UTIME_NOW in both time
> + * elements
> + */
> + if ( times == NULL ) {
> + _Timespec_Set( &new_times[0], 0, UTIME_NOW );
> + _Timespec_Set( &new_times[1], 0, UTIME_NOW );
> + } else {
> + new_times[0] = times[0];
> + new_times[1] = times[1];
> + }
> +
> + if ( new_times[0].tv_nsec == UTIME_NOW ) {
> + clock_gettime( CLOCK_REALTIME, &now );
> + new_times[0] = now;
> + got_time = true;
> + }
> +
> + if ( new_times[1].tv_nsec == UTIME_NOW ) {
> + if ( !got_time ) {
> + clock_gettime( CLOCK_REALTIME, &now );
> + }
> + new_times[1] = now;
> + }
> +
> + if ( !_Timespec_Is_non_negative( &new_times[0] ) ) {
> + rtems_set_errno_and_return_minus_one( EINVAL );
> + }
> +
> + if ( !_Timespec_Is_non_negative( &new_times[1] ) ) {
> + rtems_set_errno_and_return_minus_one( EINVAL );
> + }
> +
> + if ( !rtems_filesystem_utime_tv_nsec_valid( new_times[0] ) ) {
> + rtems_set_errno_and_return_minus_one( EINVAL );
> + }
> +
> + if ( !rtems_filesystem_utime_tv_nsec_valid( new_times[1] ) ) {
> + rtems_set_errno_and_return_minus_one( EINVAL );
> + }
> +
> + return 0;
> +}
> +
> +/**
> + * https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/functions/futimens.html
> + *
> + * Set file access and modification times
> + */
> +int utimensat(
> + int fd,
> + const char *path,
> + const struct timespec times[2],
> + int flag
> +)
> +{
> + int rv = 0;
> + rtems_filesystem_eval_path_context_t ctx;
> + int eval_flags = RTEMS_FS_FOLLOW_LINK;
> + const rtems_filesystem_location_info_t *currentloc = NULL;
> + struct timespec new_times[2];
> +
> + /*
> + * RTEMS does not currently support operating on a real file descriptor
> + */
> + if ( fd != AT_FDCWD ) {
> + rtems_set_errno_and_return_minus_one( ENOSYS );
> + }
> +
> + /*
> + * RTEMS does not currently support AT_SYMLINK_NOFOLLOW
> + */
> + if ( flag != 0 ) {
> + rtems_set_errno_and_return_minus_one( ENOSYS );
> + }
> +
> + rv = rtems_filesystem_utime_update( times, new_times );
> + if ( rv != 0 ) {
> + return rv;
> + }
> +
> + currentloc = rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
> +
> + rv = rtems_filesystem_utime_check_permissions( currentloc, times );
> + if ( rv != 0 ) {
> + rtems_filesystem_eval_path_cleanup( &ctx );
> + return rv;
> + }
> +
> + rv = (*currentloc->mt_entry->ops->utime_h)(
> + currentloc,
> + new_times
> + );
> +
> + rtems_filesystem_eval_path_cleanup( &ctx );
> +
> + return rv;
> +}
> diff --git a/cpukit/score/src/timespecisnonnegative.c b/cpukit/score/src/timespecisnonnegative.c
> new file mode 100644
> index 0000000..2945076
> --- /dev/null
> +++ b/cpukit/score/src/timespecisnonnegative.c
> @@ -0,0 +1,54 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup RTEMSScoreTimespec
> + *
> + * @brief This source file contains the implementation of
> + * _Timespec_Is_non_negative().
> + */
> +
> +/*
> + * COPYRIGHT (C) 2021 On-Line Applications Research Corporation (OAR).
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/score/timespec.h>
> +
> +bool _Timespec_Is_non_negative(
> + const struct timespec *time
> +)
> +{
> + if ( time->tv_sec < 0 )
> + return false;
> +
> + if ( time->tv_nsec < 0 )
> + return false;
> +
> + return true;
> +}
> diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
> index a3a9ee4..7f36ef7 100644
> --- a/spec/build/cpukit/librtemscpu.yml
> +++ b/spec/build/cpukit/librtemscpu.yml
> @@ -761,6 +761,8 @@ source:
> - cpukit/libcsupport/src/unmount.c
> - cpukit/libcsupport/src/utime.c
> - cpukit/libcsupport/src/utimes.c
> +- cpukit/libcsupport/src/futimens.c
> +- cpukit/libcsupport/src/utimensat.c
> - cpukit/libcsupport/src/utsname.c
> - cpukit/libcsupport/src/vprintk.c
> - cpukit/libcsupport/src/write.c
> @@ -1558,6 +1560,7 @@ source:
> - cpukit/score/src/threadyield.c
> - cpukit/score/src/timespecaddto.c
> - cpukit/score/src/timespecdivide.c
> +- cpukit/score/src/timespecisnonnegative.c
> - cpukit/score/src/timespecdividebyinteger.c
> - cpukit/score/src/timespecfromticks.c
> - cpukit/score/src/timespecgetasnanoseconds.c
> --
> 1.8.3.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list