#include <stdlib.h>
#include <stdio.h>
#include <strings.h>

struct posix_header
{				/* byte offset */
  char name[100];		/*   0 */
  char mode[8];			/* 100 */
  char uid[8];			/* 108 */
  char gid[8];			/* 116 */
  char size[12];		/* 124 */
  char mtime[12];		/* 136 */
  char chksum[8];		/* 148 */
  char typeflag;		/* 156 */
  char linkname[100];		/* 157 */
  char magic[6];		/* 257 */
  char version[2];		/* 263 */
  char uname[32];		/* 265 */
  char gname[32];		/* 297 */
  char devmajor[8];		/* 329 */
  char devminor[8];		/* 337 */
  char prefix[155];		/* 345 */
				/* 500 */
};

int main(int argc, char **argv)
{
  FILE * f;
  struct posix_header h;
  char b[512];			/* Just a tmp buffer */

  if ( argc != 2 ) {
    fprintf(stderr, "Expect a file path as an argument\n");
    exit(1);
  }

  if ( !(f = fopen(argv[1], "r")) ) {
    fprintf(stderr, "Can't open file \"%s\"\n", argv[1]);
    exit(1);
  }

  /*  printf("struct size %d\n", sizeof(struct posix_header)); */

  while (! feof(f) ) {
    fread(&h, sizeof(struct posix_header),  1,  f);
    fread(&b, 12 + atoi(h.size), 1, f); /* Just move to next record */
    if (h.name[0] == 0 && h.prefix[0] == 0)
      break;

    /*
    printf("size   : %5d\n", atoi(h.size));
    printf("magic  : %s\n", h.magic);
    */
    memset(&b, 0, 512);
    strncpy(b, h.name, 100);
    printf("name   : %5d %s\n", strlen(b), b);
    memset(&b, 0, 512);
    strncpy(b, h.prefix, 155);
    printf("prefix : %5d %s\n", strlen(b), b);
    printf("\n");
  }

  fclose(f);
  return 0;
}
