Fix invalid memory de-reference issue
[libtar.git] / lib / util.c
blob11438ef9f12011b2d49fb6234bd72effb0ca9107
1 /*
2 ** Copyright 1998-2003 University of Illinois Board of Trustees
3 ** Copyright 1998-2003 Mark D. Roth
4 ** All rights reserved.
5 **
6 ** util.c - miscellaneous utility code for libtar
7 **
8 ** Mark D. Roth <roth@uiuc.edu>
9 ** Campus Information Technologies and Educational Services
10 ** University of Illinois at Urbana-Champaign
13 #include <internal.h>
15 #include <stdio.h>
16 #include <sys/param.h>
17 #include <errno.h>
19 #ifdef STDC_HEADERS
20 # include <string.h>
21 #endif
24 /* hashing function for pathnames */
25 int
26 path_hashfunc(char *key, int numbuckets)
28 char buf[MAXPATHLEN];
29 char *p;
31 strcpy(buf, key);
32 p = basename(buf);
34 return (((unsigned int)p[0]) % numbuckets);
38 /* matching function for dev_t's */
39 int
40 dev_match(dev_t *dev1, dev_t *dev2)
42 return !memcmp(dev1, dev2, sizeof(dev_t));
46 /* matching function for ino_t's */
47 int
48 ino_match(ino_t *ino1, ino_t *ino2)
50 return !memcmp(ino1, ino2, sizeof(ino_t));
54 /* hashing function for dev_t's */
55 int
56 dev_hash(dev_t *dev)
58 return *dev % 16;
62 /* hashing function for ino_t's */
63 int
64 ino_hash(ino_t *inode)
66 return *inode % 256;
71 ** mkdirhier() - create all directories in a given path
72 ** returns:
73 ** 0 success
74 ** 1 all directories already exist
75 ** -1 (and sets errno) error
77 int
78 mkdirhier(char *path)
80 char src[MAXPATHLEN], dst[MAXPATHLEN] = "";
81 char *dirp, *nextp = src;
82 int retval = 1;
84 if (strlcpy(src, path, sizeof(src)) > sizeof(src))
86 errno = ENAMETOOLONG;
87 return -1;
90 if (path[0] == '/')
91 strcpy(dst, "/");
93 while ((dirp = strsep(&nextp, "/")) != NULL)
95 if (*dirp == '\0')
96 continue;
98 if (dst[0] != '\0')
99 strcat(dst, "/");
100 strcat(dst, dirp);
102 if (mkdir(dst, 0777) == -1)
104 if (errno != EEXIST)
105 return -1;
107 else
108 retval = 0;
111 return retval;
115 /* calculate header checksum */
117 th_crc_calc(TAR *t)
119 int i, sum = 0;
121 for (i = 0; i < T_BLOCKSIZE; i++)
122 sum += ((unsigned char *)(&(t->th_buf)))[i];
123 for (i = 0; i < 8; i++)
124 sum += (' ' - (unsigned char)t->th_buf.chksum[i]);
126 return sum;
130 /* calculate a signed header checksum */
132 th_signed_crc_calc(TAR *t)
134 int i, sum = 0;
136 for (i = 0; i < T_BLOCKSIZE; i++)
137 sum += ((signed char *)(&(t->th_buf)))[i];
138 for (i = 0; i < 8; i++)
139 sum += (' ' - (signed char)t->th_buf.chksum[i]);
141 return sum;
145 /* string-octal to integer conversion */
147 oct_to_int(char *oct)
149 int i;
151 return sscanf(oct, "%o", &i) == 1 ? i : 0;
155 /* integer to string-octal conversion, no NULL */
156 void
157 int_to_oct_nonull(int num, char *oct, size_t octlen)
159 snprintf(oct, octlen, "%*lo", octlen - 1, (unsigned long)num);
160 oct[octlen - 1] = ' ';