X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Futils.c;h=b0e8274f2a0dde220ca3058c3f6b5064ada32047;hb=850059f6637354d31129f303151f9f7d30514c9e;hp=1a9093d88140752ec5f4b2a08eb77a80e9467e48;hpb=2abb9a7cfb0930e27062088734d306e7d78e4cc2;p=mmh diff --git a/sbr/utils.c b/sbr/utils.c index 1a9093d..b0e8274 100644 --- a/sbr/utils.c +++ b/sbr/utils.c @@ -13,6 +13,7 @@ #include #include #include +#include /* ** We allocate space for messages (msgs array) @@ -29,11 +30,11 @@ mh_xmalloc(size_t size) void *memory; if (size == 0) - adios(NULL, "Tried to malloc 0 bytes"); + adios(EX_SOFTWARE, NULL, "Tried to malloc 0 bytes"); memory = malloc(size); if (!memory) - adios(NULL, "Malloc failed"); + adios(EX_OSERR, NULL, "Malloc failed"); return memory; } @@ -48,27 +49,45 @@ mh_xrealloc(void *ptr, size_t size) /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */ if (!ptr) { - return mh_xmalloc(size); + return mh_xcalloc((size_t) 1, size); } if (size == 0) - adios(NULL, "Tried to realloc 0 bytes"); + adios(EX_SOFTWARE, NULL, "Tried to realloc 0 bytes"); memory = realloc(ptr, size); if (!memory) - adios(NULL, "Realloc failed"); + adios(EX_OSERR, NULL, "Realloc failed"); return memory; } /* + * Safely call calloc + */ +void * +mh_xcalloc(size_t nmemb, size_t size) +{ + void *memory; + + if (nmemb == 0 || size == 0) + adios(EX_SOFTWARE, NULL, "Tried to calloc 0 bytes"); + + if ((memory = calloc(nmemb, size))) { + return memory; + } else { + adios(EX_OSERR, NULL, "calloc failed"); + } +} + +/* ** Return the present working directory, if the current directory does not ** exist, or is too long, make / the pwd. */ char * pwd(void) { - register char *cp; + char *cp; static char curwd[PATH_MAX]; if (!getcwd(curwd, PATH_MAX)) { @@ -141,19 +160,19 @@ create_folder(char *folder, int autocreate, void (*done_callback)(int)) if (stat(folder, &st) == -1) { if (errno != ENOENT) - adios(folder, "error on folder"); + adios(EX_IOERR, folder, "error on folder"); if (autocreate == 0) { /* ask before creating folder */ cp = concat("Create folder \"", folder, "\"? ", NULL); if (!getanswer(cp)) - done_callback(1); + done_callback(EX_CANTCREAT); free(cp); } else if (autocreate == -1) { /* do not create, so exit */ - done_callback(1); + done_callback(EX_CANTCREAT); } if (!makedir(folder)) - adios(NULL, "unable to create folder %s", folder); + adios(EX_CANTCREAT, NULL, "unable to create folder %s", folder); } } @@ -168,7 +187,7 @@ num_digits(int n) /* Sanity check */ if (n < 0) - adios(NULL, "oops, num_digits called with negative value"); + adios(EX_SOFTWARE, NULL, "oops, num_digits called with negative value"); if (n == 0) return 1;