diff options
author | Nick Withers <nick.withers@anu.edu.au> | 2014-03-07 14:23:30 +1100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-12-11 08:12:13 +0100 |
commit | 9d9c42601ac54a316a5a8656ebc083c401da07e2 (patch) | |
tree | 54101eaf191266ea430cf27b7eae75e954271906 | |
parent | 71d97c92e55953bd29b0e4f1dc186916a93ce509 (diff) |
Teach rtems_tarfs_load() about symlinks
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_load_tar.c | 17 | ||||
-rw-r--r-- | testsuites/libtests/tar02/init.c | 2 | ||||
-rw-r--r-- | testsuites/libtests/tar02/tar02.scn | 10 |
3 files changed, 25 insertions, 4 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_load_tar.c b/cpukit/libfs/src/imfs/imfs_load_tar.c index 5b6f545f4c..1ef0e0b6d4 100644 --- a/cpukit/libfs/src/imfs/imfs_load_tar.c +++ b/cpukit/libfs/src/imfs/imfs_load_tar.c @@ -24,6 +24,7 @@ #include <sys/stat.h> #include <string.h> #include <tar.h> +#include <unistd.h> #include <rtems/untar.h> @@ -96,6 +97,7 @@ int rtems_tarfs_load( * Generate an IMFS node depending on the file type. * - For directories, just create directories as usual. IMFS * will take care of the rest. + * - For symbolic links, create as usual * - For files, create a file node with special tarfs properties. */ if (linkflag == DIRTYPE) { @@ -136,6 +138,21 @@ int rtems_tarfs_load( nblocks = (((file_size) + 511) & ~511) / 512; offset += 512 * nblocks; } + /* + * Create a symbolic link + */ + else if (linkflag == SYMTYPE) { + const char *linkto = hdr_ptr + 157; + int len; + + strncpy(full_filename, mountpoint, 255); + if (full_filename[(len=strlen(full_filename))-1] != '/') + strcat(full_filename, "/"); + ++len; + strncat(full_filename, filename, 256-len-1); + + rv = symlink(linkto, full_filename); + } } rtems_filesystem_location_free( &rootloc ); diff --git a/testsuites/libtests/tar02/init.c b/testsuites/libtests/tar02/init.c index cfeda1b3bb..29bc529579 100644 --- a/testsuites/libtests/tar02/init.c +++ b/testsuites/libtests/tar02/init.c @@ -57,10 +57,8 @@ void test_tarfs_load(void) test_cat( "/home/test_file", 0, 0 ); /******************/ -#if 0 printf( "========= /symlink =========\n" ); test_cat( "/symlink", 0, 0 ); -#endif } rtems_task Init( diff --git a/testsuites/libtests/tar02/tar02.scn b/testsuites/libtests/tar02/tar02.scn index 3b4d1bc2b0..f4ba9ce0f2 100644 --- a/testsuites/libtests/tar02/tar02.scn +++ b/testsuites/libtests/tar02/tar02.scn @@ -4,12 +4,18 @@ Loading tarfs image ... successful (0)This is a test of loading an RTEMS filesystem from an initial tar image. -*** Skipping symlink -- NOT CURRENTLY SUPPORTED *** +========= /symlink ========= +(0)This is a test of loading an RTEMS filesystem from an +initial tar image. + *************** Dump of Entire IMFS *************** / ....dev/ +........ttyS0 (device 0, 0) ........console (device 0, 0) +........ttyS1 (device 0, 1) ....home/ -........test_file (file 73 0x12022c) +........test_file (file 73 0x390f8) +....symlink links not printed *************** End of Dump *************** *** END OF TAR02 TEST *** |