示例#1
0
/****************************************************************************
Write a tar header to buffer
****************************************************************************/
static void writetarheader(int f,  char *aname, SMB_BIG_UINT size, time_t mtime,
			   char *amode, unsigned char ftype)
{
  union hblock hb;
  int i, chk, l;
  char *jp;

  DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname));

  memset(hb.dummy, 0, sizeof(hb.dummy));
  
  l=strlen(aname);
  if (l >= NAMSIZ) {
	  /* write a GNU tar style long header */
	  char *b;
	  b = (char *)malloc(l+TBLOCK+100);
	  if (!b) {
		  DEBUG(0,("out of memory\n"));
		  exit(1);
	  }
	  writetarheader(f, "/./@LongLink", l+1, 0, "     0 \0", 'L');
	  memset(b, 0, l+TBLOCK+100);
	  fixtarname(b, aname, l);
	  i = strlen(b)+1;
	  DEBUG(5, ("File name in tar file: %s, size=%d, \n", b, (int)strlen(b)));
	  dotarbuf(f, b, TBLOCK*(((i-1)/TBLOCK)+1));
	  free(b);
  }

  /* use l + 1 to do the null too */
  fixtarname(hb.dbuf.name, aname, (l >= NAMSIZ) ? NAMSIZ : l + 1);

  if (lowercase)
    strlower(hb.dbuf.name);

  /* write out a "standard" tar format header */

  hb.dbuf.name[NAMSIZ-1]='\0';
  safe_strcpy(hb.dbuf.mode, amode, strlen(amode));
  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid);
  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid);
  oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size);
  oct_it((SMB_BIG_UINT) mtime, 13, hb.dbuf.mtime);
  memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
  memset(hb.dbuf.linkname, 0, NAMSIZ);
  hb.dbuf.linkflag=ftype;
  
  for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++);

  oct_it((SMB_BIG_UINT) chk, 8, hb.dbuf.chksum);
  hb.dbuf.chksum[6] = '\0';

  (void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
}
示例#2
0
static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t mtime,
			   const char *amode, unsigned char ftype)
{
	union hblock hb;
	int i, chk, l;
	char *jp;

	DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname));

	memset(hb.dummy, 0, sizeof(hb.dummy));
  
	l=strlen(aname);
	/* We will be prepending a '.' in fixtarheader so use +2 to
	 * take care of the . and terminating zero. JRA.
	 */
	if (l+2 >= NAMSIZ) {
		/* write a GNU tar style long header */
		char *b;
		b = (char *)malloc(l+TBLOCK+100);
		if (!b) {
			DEBUG(0,("out of memory\n"));
			exit(1);
		}
		writetarheader(f, "/./@LongLink", l+2, 0, "     0 \0", 'L');
		memset(b, 0, l+TBLOCK+100);
		fixtarname(b, aname, l+2);
		i = strlen(b)+1;
		DEBUG(5, ("File name in tar file: %s, size=%d, \n", b, (int)strlen(b)));
		dotarbuf(f, b, TBLOCK*(((i-1)/TBLOCK)+1));
		SAFE_FREE(b);
	}

	fixtarname(hb.dbuf.name, aname, (l+2 >= NAMSIZ) ? NAMSIZ : l + 2);

	if (lowercase)
		strlower_m(hb.dbuf.name);

	/* write out a "standard" tar format header */

	hb.dbuf.name[NAMSIZ-1]='\0';
	safe_strcpy(hb.dbuf.mode, amode, sizeof(hb.dbuf.mode)-1);
	oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid);
	oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid);
	oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size);
	if (size > (SMB_BIG_UINT)077777777777LL) {    

		/* This is a non-POSIX compatible extention to store files
			greater than 8GB. */

		memset(hb.dbuf.size, 0, 4);
		hb.dbuf.size[0]=128;
		for (i = 8, jp=(char*)&size; i; i--)
			hb.dbuf.size[i+3] = *(jp++);
	}
	oct_it((SMB_BIG_UINT) mtime, 13, hb.dbuf.mtime);
	memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
	memset(hb.dbuf.linkname, 0, NAMSIZ);
	hb.dbuf.linkflag=ftype;
  
	for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;)
		chk+=(0xFF & *jp++);

	oct_it((SMB_BIG_UINT) chk, 8, hb.dbuf.chksum);
	hb.dbuf.chksum[6] = '\0';

	(void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
}