summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_load_tar.c
diff options
context:
space:
mode:
authorEric Norum <WENorum@lbl.gov>2005-02-08 17:12:54 +0000
committerEric Norum <WENorum@lbl.gov>2005-02-08 17:12:54 +0000
commit624867bc09632b9c98235073f9a1b4f130233c47 (patch)
tree3f2c55aaa075ed371dcc4059d6f673d801240d2a /cpukit/libfs/src/imfs/imfs_load_tar.c
parent2005-02-08 Ralf Corsepius <ralf.corsepius@rtems.org> (diff)
downloadrtems-624867bc09632b9c98235073f9a1b4f130233c47.tar.bz2
Add copy-on-write semantics to rtems_tarfs_load().
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_load_tar.c')
-rw-r--r--cpukit/libfs/src/imfs/imfs_load_tar.c42
1 files changed, 6 insertions, 36 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_load_tar.c b/cpukit/libfs/src/imfs/imfs_load_tar.c
index 8e47881930..b206547fb7 100644
--- a/cpukit/libfs/src/imfs/imfs_load_tar.c
+++ b/cpukit/libfs/src/imfs/imfs_load_tar.c
@@ -25,6 +25,7 @@
#include <rtems/chain.h>
#include <rtems/imfs.h>
#include <rtems/untar.h>
+#include <rtems/tar.h>
/**************************************************************************
* TAR file format:
@@ -141,10 +142,9 @@ rtems_tarfs_load(char *mountpoint,
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
}
/******************************************************************
- * Create a LINEAR_FILE node if no user write permission.
+ * Create a LINEAR_FILE node
*****************************************************************/
- else if ((linkflag == REGTYPE) &&
- ((file_mode & 0200) == 0000))
+ else if (linkflag == REGTYPE)
{
const char *name;
@@ -152,9 +152,9 @@ rtems_tarfs_load(char *mountpoint,
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0)
{
node = IMFS_create_node(&loc,
- IMFS_LINEAR_FILE, (char *)name,
- (S_IRUSR | S_IRGRP | S_IROTH) | S_IFREG,
- NULL);
+ IMFS_LINEAR_FILE, (char *)name,
+ (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
+ NULL);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
}
@@ -162,36 +162,6 @@ rtems_tarfs_load(char *mountpoint,
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
- /******************************************************************
- * Create a regular MEMORY_FILE if write permission exists.
- *****************************************************************/
- else if ((linkflag == REGTYPE) &&
- ((file_mode & 0200) == 0200))
- {
- int fd;
- int n, left, ptr;
-
- strcpy(full_filename, mountpoint);
- if (full_filename[strlen(full_filename)-1] != '/')
- strcat(full_filename, "/");
- strcat(full_filename, filename);
-
- fd = creat(full_filename, S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP);
- if (fd != -1)
- {
- left = file_size;
- ptr = offset;
- while ((n = write(fd, &tar_image[ptr], left)) > 0)
- {
- left -= n;
- ptr += n;
- }
- close(fd);
- }
-
- nblocks = (((file_size) + 511) & ~511) / 512;
- offset += 512 * nblocks;
- }
}
return(status);