|
Packit |
3c676e |
/*
|
|
Packit |
3c676e |
** Copyright 1998-2003 University of Illinois Board of Trustees
|
|
Packit |
3c676e |
** Copyright 1998-2003 Mark D. Roth
|
|
Packit |
3c676e |
** All rights reserved.
|
|
Packit |
3c676e |
**
|
|
Packit |
3c676e |
** util.c - miscellaneous utility code for libtar
|
|
Packit |
3c676e |
**
|
|
Packit |
3c676e |
** Mark D. Roth <roth@uiuc.edu>
|
|
Packit |
3c676e |
** Campus Information Technologies and Educational Services
|
|
Packit |
3c676e |
** University of Illinois at Urbana-Champaign
|
|
Packit |
3c676e |
*/
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
#include <internal.h>
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
#include <stdio.h>
|
|
Packit |
3c676e |
#include <sys/param.h>
|
|
Packit |
3c676e |
#include <errno.h>
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
#ifdef STDC_HEADERS
|
|
Packit |
3c676e |
# include <string.h>
|
|
Packit |
3c676e |
#endif
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* hashing function for pathnames */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
path_hashfunc(char *key, int numbuckets)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
char buf[MAXPATHLEN];
|
|
Packit |
3c676e |
char *p;
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
strcpy(buf, key);
|
|
Packit |
3c676e |
p = basename(buf);
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
return (((unsigned int)p[0]) % numbuckets);
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* matching function for dev_t's */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
dev_match(dev_t *dev1, dev_t *dev2)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
return !memcmp(dev1, dev2, sizeof(dev_t));
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* matching function for ino_t's */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
ino_match(ino_t *ino1, ino_t *ino2)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
return !memcmp(ino1, ino2, sizeof(ino_t));
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* hashing function for dev_t's */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
dev_hash(dev_t *dev)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
return *dev % 16;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* hashing function for ino_t's */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
ino_hash(ino_t *inode)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
return *inode % 256;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/*
|
|
Packit |
3c676e |
** mkdirhier() - create all directories in a given path
|
|
Packit |
3c676e |
** returns:
|
|
Packit |
3c676e |
** 0 success
|
|
Packit |
3c676e |
** 1 all directories already exist
|
|
Packit |
3c676e |
** -1 (and sets errno) error
|
|
Packit |
3c676e |
*/
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
mkdirhier(char *path)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
char src[MAXPATHLEN], dst[MAXPATHLEN] = "";
|
|
Packit |
3c676e |
char *dirp, *nextp = src;
|
|
Packit |
3c676e |
int retval = 1;
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
if (strlcpy(src, path, sizeof(src)) > sizeof(src))
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
errno = ENAMETOOLONG;
|
|
Packit |
3c676e |
return -1;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
if (path[0] == '/')
|
|
Packit |
3c676e |
strcpy(dst, "/");
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
while ((dirp = strsep(&nextp, "/")) != NULL)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
if (*dirp == '\0')
|
|
Packit |
3c676e |
continue;
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
if (dst[0] != '\0')
|
|
Packit |
3c676e |
strcat(dst, "/");
|
|
Packit |
3c676e |
strcat(dst, dirp);
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
if (mkdir(dst, 0777) == -1)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
if (errno != EEXIST)
|
|
Packit |
3c676e |
return -1;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
else
|
|
Packit |
3c676e |
retval = 0;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
return retval;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* calculate header checksum */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
th_crc_calc(TAR *t)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
int i, sum = 0;
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
for (i = 0; i < T_BLOCKSIZE; i++)
|
|
Packit |
3c676e |
sum += ((unsigned char *)(&(t->th_buf)))[i];
|
|
Packit |
3c676e |
for (i = 0; i < 8; i++)
|
|
Packit |
3c676e |
sum += (' ' - (unsigned char)t->th_buf.chksum[i]);
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
return sum;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* calculate a signed header checksum */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
th_signed_crc_calc(TAR *t)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
int i, sum = 0;
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
for (i = 0; i < T_BLOCKSIZE; i++)
|
|
Packit |
3c676e |
sum += ((signed char *)(&(t->th_buf)))[i];
|
|
Packit |
3c676e |
for (i = 0; i < 8; i++)
|
|
Packit |
3c676e |
sum += (' ' - (signed char)t->th_buf.chksum[i]);
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
return sum;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* string-octal to integer conversion */
|
|
Packit |
3c676e |
int
|
|
Packit |
3c676e |
oct_to_int(char *oct)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
int i;
|
|
Packit |
3c676e |
|
|
Packit Service |
d6d91f |
sscanf(oct, "%o", &i);
|
|
Packit Service |
d6d91f |
|
|
Packit Service |
d6d91f |
return i;
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
/* integer to string-octal conversion, no NULL */
|
|
Packit |
3c676e |
void
|
|
Packit |
3c676e |
int_to_oct_nonull(int num, char *oct, size_t octlen)
|
|
Packit |
3c676e |
{
|
|
Packit |
3c676e |
snprintf(oct, octlen, "%*lo", octlen - 1, (unsigned long)num);
|
|
Packit |
3c676e |
oct[octlen - 1] = ' ';
|
|
Packit |
3c676e |
}
|
|
Packit |
3c676e |
|
|
Packit |
3c676e |
|