Ejemplo n.º 1
0
  /**
   * Write an entry's header information to a header buffer. This method can throw an
   * InvalidHeaderException
   *
   * @param outbuf The tar entry header buffer to fill in.
   * @throws InvalidHeaderException If the name will not fit in the header.
   */
  public void writeEntryHeader(byte[] outbuf) throws InvalidHeaderException {
    int offset = 0;

    if (this.isUnixTarFormat()) {
      if (this.header.name.length() > 100) {
        throw new InvalidHeaderException(
            "file path is greater than 100 characters, " + this.header.name);
      }
    }

    offset = TarHeader.getFileNameBytes(this.header.name.toString(), outbuf);

    offset = TarHeader.getOctalBytes(this.header.mode, outbuf, offset, TarHeader.MODELEN);

    offset = TarHeader.getOctalBytes(this.header.userId, outbuf, offset, TarHeader.UIDLEN);

    offset = TarHeader.getOctalBytes(this.header.groupId, outbuf, offset, TarHeader.GIDLEN);

    long size = this.header.size;

    offset = TarHeader.getLongOctalBytes(size, outbuf, offset, TarHeader.SIZELEN);

    offset = TarHeader.getLongOctalBytes(this.header.modTime, outbuf, offset, TarHeader.MODTIMELEN);

    int csOffset = offset;
    for (int c = 0; c < TarHeader.CHKSUMLEN; ++c) {
      outbuf[offset++] = (byte) ' ';
    }

    outbuf[offset++] = this.header.linkFlag;

    offset = TarHeader.getNameBytes(this.header.linkName, outbuf, offset, TarHeader.NAMELEN);

    if (this.unixFormat) {
      for (int i = 0; i < TarHeader.MAGICLEN; ++i) {
        outbuf[offset++] = 0;
      }
    } else {
      offset = TarHeader.getNameBytes(this.header.magic, outbuf, offset, TarHeader.MAGICLEN);
    }

    offset = TarHeader.getNameBytes(this.header.userName, outbuf, offset, TarHeader.UNAMELEN);

    offset = TarHeader.getNameBytes(this.header.groupName, outbuf, offset, TarHeader.GNAMELEN);

    offset = TarHeader.getOctalBytes(this.header.devMajor, outbuf, offset, TarHeader.DEVLEN);

    offset = TarHeader.getOctalBytes(this.header.devMinor, outbuf, offset, TarHeader.DEVLEN);

    for (; offset < outbuf.length; ) {
      outbuf[offset++] = 0;
    }

    long checkSum = this.computeCheckSum(outbuf);

    TarHeader.getCheckSumOctalBytes(checkSum, outbuf, csOffset, TarHeader.CHKSUMLEN);
  }