Looks good. Was there a test case (before or after)?

--joel

On Sun, Jul 31, 2016 at 8:03 PM, Chris Johns <chr...@rtems.org> wrote:

> This patch parses the mode field in the tar header and sets the
> directory or file to the mode value in the header.
>
> Closes #2768.
> ---
>  cpukit/libmisc/untar/untar.c | 47
> ++++++++++++++++++++++++++------------------
>  cpukit/libmisc/untar/untar.h |  7 ++++++-
>  2 files changed, 34 insertions(+), 20 deletions(-)
>
> diff --git a/cpukit/libmisc/untar/untar.c b/cpukit/libmisc/untar/untar.c
> index 9a14f67..ecf1877 100644
> --- a/cpukit/libmisc/untar/untar.c
> +++ b/cpukit/libmisc/untar/untar.c
> @@ -250,6 +250,7 @@ static int
>  Untar_ProcessHeader(
>    const char          *bufr,
>    char                *fname,
> +  unsigned long       *mode,
>    unsigned long       *file_size,
>    unsigned long       *nblocks,
>    unsigned char       *linkflag,
> @@ -286,6 +287,8 @@ Untar_ProcessHeader(
>    strncpy(fname, bufr, MAX_NAME_FIELD_SIZE);
>    fname[MAX_NAME_FIELD_SIZE] = '\0';
>
> +  *mode = strtoul(&bufr[100], NULL, 8);
> +
>    *linkflag   = bufr[156];
>    *file_size = _rtems_octal2ulong(&bufr[124], 12);
>
> @@ -299,7 +302,8 @@ Untar_ProcessHeader(
>      rtems_printf(printer, "untar: symlink: %s -> %s\n", linkname, fname);
>      symlink(linkname, fname);
>    } else if (*linkflag == REGTYPE) {
> -    rtems_printf(printer, "untar: file: %s (%i)\n", fname, (int)
> *file_size);
> +    rtems_printf(printer, "untar: file: %s (s:%i,m:%04o)\n",
> +                 fname, (int) *file_size, (int) *mode);
>      *nblocks = (((*file_size) + 511) & ~511) / 512;
>      if (Make_Path(printer, fname, false) < 0) {
>        retval  = UNTAR_FAIL;
> @@ -318,7 +322,7 @@ Untar_ProcessHeader(
>            if (!S_ISDIR(stat_buf.st_mode)) {
>              r = unlink(fname);
>              if (r == 0) {
> -              r = mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO);
> +              r = mkdir(fname, *mode);
>              }
>            }
>          }
> @@ -362,15 +366,16 @@ Untar_FromMemory_Print(
>    const rtems_printer *printer
>  )
>  {
> -  FILE           *fp;
> +  int            fd;
>    const char     *tar_ptr = (const char *)tar_buf;
>    const char     *bufr;
>    char           fname[100];
>    int            retval = UNTAR_SUCCESSFUL;
>    unsigned long  ptr;
> -  unsigned long  nblocks;
> -  unsigned long  file_size;
> -  unsigned char  linkflag;
> +  unsigned long  nblocks = 0;
> +  unsigned long  file_size = 0;
> +  unsigned long  mode = 0;
> +  unsigned char  linkflag = 0;
>
>    rtems_printf(printer, "untar: memory at %p (%zu)\n", tar_buf, size);
>
> @@ -385,20 +390,21 @@ Untar_FromMemory_Print(
>      bufr = &tar_ptr[ptr];
>      ptr += 512;
>
> -    retval = Untar_ProcessHeader(bufr, fname, &file_size, &nblocks,
> &linkflag, printer);
> +    retval = Untar_ProcessHeader(bufr, fname, &mode, &file_size,
> +                                 &nblocks, &linkflag, printer);
>
>      if (retval != UNTAR_SUCCESSFUL)
>        break;
>
>      if (linkflag == REGTYPE) {
> -      if ((fp = fopen(fname, "w")) == NULL) {
> +      if ((fd = open(fname, O_TRUNC | O_CREAT | O_WRONLY, mode)) == -1) {
>          Print_Error(printer, "open", fname);
>          ptr += 512 * nblocks;
>        } else {
>          unsigned long sizeToGo = file_size;
> -        size_t        len;
> -        size_t        i;
> -        size_t        n;
> +        ssize_t       len;
> +        ssize_t       i;
> +        ssize_t       n;
>
>          /*
>           * Read out the data.  There are nblocks of data where nblocks is
> the
> @@ -406,7 +412,7 @@ Untar_FromMemory_Print(
>           */
>          for (i = 0; i < nblocks; i++) {
>            len = ((sizeToGo < 512L) ? (sizeToGo) : (512L));
> -          n = fwrite(&tar_ptr[ptr], 1, len, fp);
> +          n = write(fd, &tar_ptr[ptr], len);
>            if (n != len) {
>              Print_Error(printer, "write", fname);
>              retval  = UNTAR_FAIL;
> @@ -415,7 +421,7 @@ Untar_FromMemory_Print(
>            ptr += 512;
>            sizeToGo -= n;
>          }
> -        fclose(fp);
> +        close(fd);
>        }
>
>      }
> @@ -485,9 +491,10 @@ Untar_FromFile_Print(
>    char           fname[100];
>    int            retval;
>    unsigned long  i;
> -  unsigned long  nblocks;
> -  unsigned long  file_size;
> -  unsigned char  linkflag;
> +  unsigned long  nblocks = 0;
> +  unsigned long  file_size = 0;
> +  unsigned long  mode = 0;
> +  unsigned char  linkflag = 0;
>
>    retval = UNTAR_SUCCESSFUL;
>
> @@ -508,7 +515,8 @@ Untar_FromFile_Print(
>        break;
>      }
>
> -    retval = Untar_ProcessHeader(bufr, fname, &file_size, &nblocks,
> &linkflag, printer);
> +    retval = Untar_ProcessHeader(bufr, fname, &mode, &file_size,
> +                                 &nblocks, &linkflag, printer);
>
>      if (retval != UNTAR_SUCCESSFUL)
>        break;
> @@ -521,7 +529,7 @@ Untar_FromFile_Print(
>         * is the size rounded to the nearest 512-byte boundary.
>         */
>
> -      if ((out_fd = creat(fname, 0644)) == -1) {
> +      if ((out_fd = creat(fname, mode)) == -1) {
>          (void) lseek(fd, SEEK_CUR, 512UL * nblocks);
>        } else {
>          for (i = 0; i < nblocks; i++) {
> @@ -579,6 +587,7 @@ int Untar_FromChunk_Print(
>            retval = Untar_ProcessHeader(
>              &context->header[0],
>              &context->fname[0],
> +            &context->mode,
>              &context->todo_bytes,
>              &context->todo_blocks,
>              &linkflag,
> @@ -591,7 +600,7 @@ int Untar_FromChunk_Print(
>            }
>
>            if (linkflag == REGTYPE) {
> -            context->out_fd = creat(&context->fname[0], 0644);
> +            context->out_fd = creat(&context->fname[0], context->mode);
>
>              if (context->out_fd >= 0) {
>                context->state = UNTAR_CHUNK_WRITE;
> diff --git a/cpukit/libmisc/untar/untar.h b/cpukit/libmisc/untar/untar.h
> index 4d00d36..3c8bb74 100644
> --- a/cpukit/libmisc/untar/untar.h
> +++ b/cpukit/libmisc/untar/untar.h
> @@ -74,9 +74,14 @@ typedef struct {
>    size_t done_bytes;
>
>    /**
> +   * @brief Mode of the file.
> +   */
> +  unsigned long mode;
> +
> +  /**
>     * @brief Overall amount of bytes to be processed.
>     */
> -  long unsigned todo_bytes;
> +  unsigned long todo_bytes;
>
>    /**
>     * @brief Overall amount of blocks to be processed.
> --
> 2.4.6
>
> _______________________________________________
> devel mailing list
> devel@rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to