diff options
Diffstat (limited to 'lib/lib.c')
-rw-r--r-- | lib/lib.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -1416,3 +1416,26 @@ void loggit(int priority, char *format, ...) va_end(va); closelog(); } + +// Calculate tar packet checksum, with cksum field treated as 8 spaces +unsigned tar_cksum(void *data) +{ + unsigned i, cksum = 8*' '; + + for (i = 0; i<500; i += (i==147) ? 9 : 1) cksum += ((char *)data)[i]; + + return cksum; +} + +// is this a valid tar header? +int is_tar_header(void *pkt) +{ + char *p = pkt; + int i = 0; + + if (p[257] && memcmp("ustar", p+257, 5)) return 0; + if (p[148] != '0') return 0; + sscanf(p+148, "%8o", &i); + + return i && tar_cksum(pkt) == i; +} |