Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:16

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup LibIOFSOps File System Operations 
0007  *
0008  * @brief RTEMS Default File System reposits the offset of the open file fd
0009  */
0010 
0011 /*
0012  * Copyright (c) 2012 embedded brains GmbH & Co. KG
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions
0016  * are met:
0017  * 1. Redistributions of source code must retain the above copyright
0018  *    notice, this list of conditions and the following disclaimer.
0019  * 2. Redistributions in binary form must reproduce the above copyright
0020  *    notice, this list of conditions and the following disclaimer in the
0021  *    documentation and/or other materials provided with the distribution.
0022  *
0023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0024  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0026  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0027  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0028  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0029  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0030  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0031  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0032  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0033  * POSSIBILITY OF SUCH DAMAGE.
0034  */
0035 
0036 #ifdef HAVE_CONFIG_H
0037 #include "config.h"
0038 #endif
0039 
0040 #include <rtems/libio_.h>
0041 
0042 off_t rtems_filesystem_default_lseek_file(
0043   rtems_libio_t *iop,
0044   off_t offset,
0045   int whence
0046 )
0047 {
0048   off_t rv = 0;
0049   off_t reference_offset;
0050   struct stat st;
0051 
0052   switch ( whence ) {
0053     case SEEK_SET:
0054       reference_offset = 0;
0055       break;
0056     case SEEK_CUR:
0057       reference_offset = iop->offset;
0058       break;
0059     case SEEK_END:
0060       st.st_size = 0;
0061       rv = (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, &st );
0062       reference_offset = st.st_size;
0063       break;
0064     default:
0065       errno = EINVAL;
0066       rv = -1;
0067       break;
0068   }
0069 
0070   if ( rv == 0 ) {
0071     off_t new_offset = reference_offset + offset;
0072 
0073     if (
0074       (offset >= 0 && new_offset >= reference_offset)
0075         || (offset < 0 && new_offset < reference_offset)
0076     ) {
0077       if ( new_offset >= 0 ) {
0078         iop->offset = new_offset;
0079         rv = new_offset;
0080       } else {
0081         errno = EINVAL;
0082         rv = -1;
0083       }
0084     } else {
0085       errno = EOVERFLOW;
0086       rv = -1;
0087     }
0088   }
0089 
0090   return rv;
0091 }