busybox/archival/chksum_and_xwrite_tar_header.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2021 Denys Vlasenko <vda.linux@googlemail.com>
   3 *
   4 * Licensed under GPLv2, see file LICENSE in this source tree.
   5 */
   6//kbuild:lib-$(CONFIG_FEATURE_TAR_CREATE) += chksum_and_xwrite_tar_header.o
   7//kbuild:lib-$(CONFIG_SMEMCAP) += chksum_and_xwrite_tar_header.o
   8
   9#include "libbb.h"
  10#include "bb_archive.h"
  11
  12void FAST_FUNC chksum_and_xwrite_tar_header(int fd, struct tar_header_t *hp)
  13{
  14        /* POSIX says that checksum is done on unsigned bytes
  15         * (Sun and HP-UX gets it wrong... more details in
  16         * GNU tar source) */
  17        const unsigned char *cp;
  18        unsigned int chksum, size;
  19
  20        strcpy(hp->magic, "ustar  ");
  21
  22        /* Calculate and store the checksum (the sum of all of the bytes of
  23         * the header).  The checksum field must be filled with blanks for the
  24         * calculation.  The checksum field is formatted differently from the
  25         * other fields: it has 6 digits, a NUL, then a space -- rather than
  26         * digits, followed by a NUL like the other fields... */
  27        memset(hp->chksum, ' ', sizeof(hp->chksum));
  28        cp = (const unsigned char *) hp;
  29        chksum = 0;
  30        size = sizeof(*hp);
  31        do { chksum += *cp++; } while (--size);
  32        sprintf(hp->chksum, "%06o", chksum);
  33
  34        xwrite(fd, hp, sizeof(*hp));
  35}
  36