Blame lib/util.c

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