Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup IMFS
0007  *
0008  * @brief IMFS Rename
0009  */
0010 
0011 /*
0012  *  COPYRIGHT (c) 1989-2010.
0013  *  On-Line Applications Research Corporation (OAR).
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #ifdef HAVE_CONFIG_H
0038 #include "config.h"
0039 #endif
0040 
0041 #include <rtems/imfsimpl.h>
0042 
0043 #include <string.h>
0044 #include <stdlib.h>
0045 
0046 typedef struct {
0047   IMFS_node_control Base;
0048   const IMFS_node_control *replaced;
0049   char name[ RTEMS_ZERO_LENGTH_ARRAY ];
0050 } IMFS_renamed_control;
0051 
0052 static void IMFS_restore_replaced_control( IMFS_jnode_t *node )
0053 {
0054   const IMFS_node_control *base;
0055   IMFS_renamed_control    *control;
0056 
0057   base = RTEMS_DECONST( IMFS_node_control *, node->control );
0058   control = (IMFS_renamed_control *) base;
0059   node->control = control->replaced;
0060   free( control );
0061 }
0062 
0063 static void IMFS_renamed_destroy( IMFS_jnode_t *node )
0064 {
0065   IMFS_restore_replaced_control( node );
0066   ( *node->control->node_destroy )( node );
0067 }
0068 
0069 int IMFS_rename(
0070   const rtems_filesystem_location_info_t *oldparentloc,
0071   const rtems_filesystem_location_info_t *oldloc,
0072   const rtems_filesystem_location_info_t *newparentloc,
0073   const char *name,
0074   size_t namelen
0075 )
0076 {
0077   IMFS_jnode_t         *node;
0078   IMFS_jnode_t         *new_parent;
0079   IMFS_renamed_control *control;
0080 
0081   /*
0082    * FIXME: Due to insufficient checks we can create inaccessible nodes with
0083    * this operation.
0084    */
0085 
0086   node = oldloc->node_access;
0087   new_parent = newparentloc->node_access;
0088 
0089   if ( node->Parent == NULL ) {
0090     rtems_set_errno_and_return_minus_one( EINVAL );
0091   }
0092 
0093   if ( namelen >= IMFS_NAME_MAX ) {
0094     rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
0095   }
0096 
0097   control = malloc( sizeof( *control ) + namelen );
0098   if ( control == NULL ) {
0099     rtems_set_errno_and_return_minus_one( ENOMEM );
0100   }
0101 
0102   memcpy( control->name, name, namelen );
0103 
0104   if ( node->control->node_destroy == IMFS_renamed_destroy ) {
0105     IMFS_restore_replaced_control( node );
0106   }
0107 
0108   control->Base = *node->control;
0109   control->Base.node_destroy = IMFS_renamed_destroy;
0110   control->replaced = node->control;
0111   node->control = &control->Base;
0112   node->name = control->name;
0113   node->namelen = namelen;
0114 
0115   IMFS_remove_from_directory( node );
0116   IMFS_add_to_directory( new_parent, node );
0117   IMFS_update_ctime( node );
0118 
0119   return 0;
0120 }