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 RTEMS Load Tarfs
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/imfs.h>
0042 #include <rtems/untar.h>
0043 
0044 #include <string.h>
0045 
0046 int rtems_tarfs_load(
0047   const char *mountpoint,
0048   const void *tar_image,
0049   size_t      tar_size
0050 )
0051 {
0052   rtems_filesystem_eval_path_context_t  eval_ctx;
0053   int                                   eval_flags;
0054   rtems_filesystem_location_info_t     *loc;
0055   bool                                  is_imfs;
0056   char                                  buf[ 156 + UNTAR_FILE_NAME_SIZE ];
0057   size_t                                len;
0058   Untar_HeaderContext                   ctx;
0059   unsigned long                         ptr;
0060   const uint8_t                        *image;
0061 
0062   len = strlen( mountpoint );
0063   if ( len >= sizeof( buf ) - UNTAR_FILE_NAME_SIZE - 2 ) {
0064     return -1;
0065   }
0066 
0067   eval_flags = RTEMS_FS_FOLLOW_LINK;
0068   loc = rtems_filesystem_eval_path_start( &eval_ctx, mountpoint, eval_flags );
0069   is_imfs = IMFS_is_imfs_instance( loc );
0070   rtems_filesystem_eval_path_cleanup( &eval_ctx );
0071   if ( !is_imfs ) {
0072     return -1;
0073   }
0074 
0075   ctx.printer = NULL;
0076   ctx.file_path = memcpy( buf, mountpoint, len );
0077 
0078   if ( len > 0 && ctx.file_path[ len - 1 ] != '/') {
0079     ctx.file_path[ len ] = '/';
0080     ctx.file_name = ctx.file_path + len + 1;
0081   } else {
0082     ctx.file_name = ctx.file_path + len;
0083   }
0084 
0085   ptr = 0;
0086   image = tar_image;
0087 
0088   while ( ptr + 512 <= tar_size ) {
0089     int retval;
0090 
0091     retval = Untar_ProcessHeader( &ctx, (const char *) &image[ ptr ] );
0092     if ( retval != UNTAR_SUCCESSFUL ) {
0093       return -1;
0094     }
0095 
0096     ptr += 512;
0097 
0098     if ( ctx.linkflag == REGTYPE ) {
0099       retval = IMFS_make_linearfile(
0100         ctx.file_path,
0101         ctx.mode,
0102         &image[ ptr ],
0103         ctx.file_size
0104       );
0105       if ( retval != 0 ) {
0106         return -1;
0107       }
0108 
0109       ptr += 512 * ctx.nblocks;
0110     }
0111   }
0112 
0113   return 0;
0114 }