diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 171 |
1 files changed, 171 insertions, 0 deletions
@@ -0,0 +1,171 @@ +/* + * Copyright (c) 2004,2005 Michael Schroeder (mls@suse.de) + * + * This program is licensed under the BSD license, read LICENSE.BSD + * for further information + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> + +#include "util.h" + +/**************************************************************** + * + * utility functions + * + */ + +void * +xmalloc(size_t len) +{ + void *r = malloc(len ? len : 1); + if (r) + return r; + fprintf(stderr, "Out of memory allocating %zu bytes!\n", len); + exit(1); +} + +void * +xmalloc2(size_t num, size_t len) +{ + if (len && (num * len) / len != num) + { + fprintf(stderr, "Out of memory allocating %zu*%zu bytes!\n", num, len); + exit(1); + } + return xmalloc(num * len); +} + +void * +xrealloc(void *old, size_t len) +{ + if (old == 0) + old = malloc(len ? len : 1); + else + old = realloc(old, len ? len : 1); + if (old) + return old; + fprintf(stderr, "Out of memory reallocating %zu bytes!\n", len); + exit(1); +} + +void * +xrealloc2(void *old, size_t num, size_t len) +{ + if (len && (num * len) / len != num) + { + fprintf(stderr, "Out of memory allocating %zu*%zu bytes!\n", num, len); + exit(1); + } + return xrealloc(old, num * len); +} + +void * +xcalloc(size_t num, size_t len) +{ + void *r = calloc(num, len); + if (r) + return r; + fprintf(stderr, "Out of memory allocating %zu*%zu bytes!\n", num, len); + exit(1); +} + +void * +xfree(void *mem) +{ + if (mem) + free(mem); + return 0; +} + +ssize_t +xread(int fd, void *buf, size_t l) +{ + size_t ol = l; + ssize_t r; + + while (l) + { + r = read(fd, buf, l); + if (r < 0) + { + if (errno == EINTR) + continue; + return r; + } + if (r == 0) + return ol - l; + buf += r; + l -= r; + } + return ol; +} + +int +parsehex(char *s, unsigned char *hex, int len) +{ + int i, r = 0; + + len *= 2; + for (i = 0; ; i++, s++) + { + if (*s == 0 && !(i & 1)) + return i / 2; + if (i == len) + { + fprintf(stderr, "parsehex: string too long\n"); + exit(1); + } + if (*s >= '0' && *s <= '9') + r = (r << 4) | (*s - '0'); + else if (*s >= 'a' && *s <= 'f') + r = (r << 4) | (*s - ('a' - 10)); + else if (*s >= 'A' && *s <= 'F') + r = (r << 4) | (*s - ('a' - 10)); + else + { + fprintf(stderr, "parsehex: bad string\n"); + exit(1); + } + if ((i & 1) != 0) + { + hex[i / 2] = r; + r = 0; + } + } +} + +void +parsemd5(char *s, unsigned char *md5) +{ + if (!*s) + { + memset(md5, 0, 16); + return; + } + if (parsehex(s, md5, 16) != 16) + { + fprintf(stderr, "parsemd5: bad md5\n"); + exit(1); + } +} + +void +parsesha256(char *s, unsigned char *sha256) +{ + if (!*s) + { + memset(sha256, 0, 32); + return; + } + if (parsehex(s, sha256, 32) != 32) + { + fprintf(stderr, "parsesha256: bad sha256\n"); + exit(1); + } +} + |