Using tar to access files

Gedare Bloom gedare at gwu.edu
Tue Jul 14 14:42:50 UTC 2015


On Mon, Jul 13, 2015 at 8:06 PM, Chris Johns <chrisj at rtems.org> wrote:
> On 14/07/2015 1:57 am, Gedare Bloom wrote:
>> On Mon, Jul 13, 2015 at 11:26 AM, Pavel Pisa <pisa at cmp.felk.cvut.cz> wrote:
>>> Hello Sujay Raj,
>>>
>>>
>>> On Tuesday 30 of June 2015 06:39:28 Sujay Raj wrote:
>>>> I need to access configurations files the for web server I am porting to
>>>> rtems.
>>>>
>>>> I create a tar archive , that contains the required folders and files ,
>>>> convert it into c source using rtems-bin2c , ( a header file and a c source
>>>> ) and link them with my project.
>>>>
>>>> In the init, I call
>>>>
>>>> sc = Untar_FromMemory((void *)TARFILE_START, (size_t)TARFILE_SIZE);
>>>>
>>>> where TARFILE_START is the macro with the name of the array , TARFILE_SIZE
>>>> is the size of the array.
>>>>
>>>> But when I run the program, I get errors of the form
>>>>
>>>> "Untar: failed to create file <folder>/<filename>"
>>>>
>>>
>>> I have noticed and reported similar problem and workaround some
>>> time ago. Problem is, that Untar_FromMemory() function fails
>>> when it reaches a directory entry in a TAR file and given
>>> directory already exists. It fails even for existing
>>> top level directory which has to exists in RTEMS runing
>>> system and are packed by TAR by default.
>>>
>>> My fix is not ideal. Other (more generic option) is to use
>>> stat(const char *path, struct stat *buf) with check
>>> that target is already existing direcory. But using stat()
>>> in really minimal application can lead to unneeded overhead.
>>> Other option is to ignore directory create errors completelly
>>> but I do not like something like that in RT system.
>>>
>>> There is alternative way to untar file by other RTEMS functions
>>> but we use Untar_FromMemory() in more projects. If there is no
>>> objection or opinion for other solution, I prepare and check
>>> patch with stat().
>>>
>>>
>>> From 4ce027b21cfde5bc6143d51d244345e05dd85cd4 Mon Sep 17 00:00:00 2001
>>> Message-Id: <4ce027b21cfde5bc6143d51d244345e05dd85cd4.1436800331.git.ppisa at pikron.com>
>>> From: Pavel Pisa <ppisa at pikron.com>
>>> Date: Mon, 31 Mar 2014 00:57:12 +0200
>>> Subject: [PATCH] untar: workaround for fail on top level directory existence.
>>> To: rtems-devel at rtems.org
>>>
>>> Signed-off-by: Pavel Pisa <ppisa at pikron.com>
>>> ---
>>>  cpukit/libmisc/untar/untar.c | 2 ++
>>>  1 file changed, 2 insertions(+)
>>>
>>> diff --git a/cpukit/libmisc/untar/untar.c b/cpukit/libmisc/untar/untar.c
>>> index aed8fed..498fa12 100644
>>> --- a/cpukit/libmisc/untar/untar.c
>>> +++ b/cpukit/libmisc/untar/untar.c
>>> @@ -203,6 +203,8 @@ Untar_FromMemory(
>>>        }
>>>      } else if (linkflag == DIRTYPE) {
>>>        if ( mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO) != 0 ) {
>>> +        if ( !strcmp(fname, "/") || !strcmp(fname, "./"))
>>> +          continue;
>> So this just proceeds if the top-level directly already exists? I
>> don't really have a problem with the patch if there is a test case
>> that shows the problem case, but I think the reported failure may be
>> elsewhere since Sujay said the error was "Untar: failed to create
>> file" and not "directory".
>
> Is this related to https://devel.rtems.org/ticket/2207 ?
>
Yes it seems to be.

> Chris
>
>>
>>>          printk("Untar: failed to create directory %s\n", fname);
>>>          retval = UNTAR_FAIL;
>>>          break;
>>> --
>>> 1.9.1
>>> _______________________________________________
>>> devel mailing list
>>> devel at rtems.org
>>> http://lists.rtems.org/mailman/listinfo/devel
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
>>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel



More information about the devel mailing list