Esempio 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);
  }
Esempio n. 2
0
 /**
  * Parse the checksum octal integer from a header buffer.
  *
  * @param header The header buffer from which to parse.
  * @param offset The offset into the buffer from which to parse.
  * @param length The number of header bytes to parse.
  * @return The integer value of the entry's checksum.
  */
 public static int getCheckSumOctalBytes(long value, byte[] buf, int offset, int length) {
   TarHeader.getOctalBytes(value, buf, offset, length);
   buf[offset + length - 1] = (byte) ' ';
   buf[offset + length - 2] = 0;
   return offset + length;
 }
Esempio n. 3
0
 /**
  * Parse an octal long integer from a header buffer.
  *
  * @param header The header buffer from which to parse.
  * @param offset The offset into the buffer from which to parse.
  * @param length The number of header bytes to parse.
  * @return The long value of the octal bytes.
  */
 public static int getLongOctalBytes(long value, byte[] buf, int offset, int length) {
   byte[] temp = new byte[length + 1];
   TarHeader.getOctalBytes(value, temp, 0, length + 1);
   System.arraycopy(temp, 0, buf, offset, length);
   return offset + length;
 }