diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/build.c | 39 | ||||
| -rw-r--r-- | src/dbg.h | 7 | ||||
| -rw-r--r-- | src/util.c | 25 | ||||
| -rw-r--r-- | src/util.h | 11 | 
4 files changed, 54 insertions, 28 deletions
diff --git a/src/build.c b/src/build.c index 89417fa..dc67b0f 100644 --- a/src/build.c +++ b/src/build.c @@ -35,7 +35,7 @@ int build_target(const char *target) {              /* TODO: write dependencies */              goto exit;          } -        fprintf(stderr, "%s couldn't be built because no " +        log_err("%s couldn't be built because no "                  "suitable do-file exists\n", target);          retval = 1;          goto exit; @@ -66,9 +66,7 @@ int build_target(const char *target) {          char *btemp_output = xbasename(temp_output);          /* read and parse shebang */ -        FILE *fp = fopen(bdo_file, "rb+"); -        if (!fp) -            fatal("redo: failed to open %s", bdo_file); +        FILE *fp = safe_fopen(bdo_file, "rb+");          const size_t bufsize = 1024;          char buf[bufsize]; @@ -84,7 +82,7 @@ int build_target(const char *target) {          if (buf[0] == '#' && buf[1] == '!') {              argv = parsecmd(&buf[2], &i, 5);          } else { -            argv = ec_malloc(7 * sizeof(char*)); +            argv = safe_malloc(7 * sizeof(char*));              argv[i++] = "/bin/sh";              argv[i++] = "-e";          } @@ -108,16 +106,16 @@ int build_target(const char *target) {      }      /* parent */ -    int returncode; -    waitpid(pid, &returncode, 0); +    int status; +    waitpid(pid, &status, 0);      bool remove_temp = true; -    if (WIFEXITED(returncode)) { -        if (0 != returncode) { -            fprintf(stderr, "redo: invoked do-file %s failed with %d\n", -                    do_file, WEXITSTATUS(returncode)); +    if (WIFEXITED(status)) { +        if (WEXITSTATUS(status)) { // TODO: check that +            log_err("redo: invoked do-file %s failed: %d\n", +                    do_file, WEXITSTATUS(status));          } else { -            /* successfull */ +            /* successful */              /* if the file is 0 bytes long we delete it */              off_t f_size = fsize(temp_output); @@ -129,7 +127,7 @@ int build_target(const char *target) {          }      } else {          /* something very wrong happened with the child */ -        fprintf(stderr, "redo: invoked do-file did not terminate correctly\n"); +        log_err("redo: invoked do-file did not terminate correctly\n");      }      if (remove_temp) { @@ -164,7 +162,7 @@ char *get_do_file(const char *target) {      free(temp);      /* Redofile */ -    temp = strdup("Redofile"); +    temp = strdup("Redofile"); /* TODO: */      if (file_exists(temp))          return temp;      free(temp); @@ -208,7 +206,7 @@ char *remove_ext(const char *str) {      if (dot) /* recalculate length to only reach just before the last dot */          len = dot - str; -    ret = ec_malloc(len+1); +    ret = safe_malloc(len+1);      memcpy(ret, str, len);      ret[len] = '\0'; @@ -221,7 +219,7 @@ char *remove_ext(const char *str) {  char **parsecmd(char *cmd, size_t *i, size_t keep_free) {      assert(cmd);      size_t argv_len = 16; -    char **argv = ec_malloc(argv_len * sizeof(char*)); +    char **argv = safe_malloc(argv_len * sizeof(char*));      size_t j = 0;      bool prev_space = true;      for (;; ++j) { @@ -241,13 +239,8 @@ char **parsecmd(char *cmd, size_t *i, size_t keep_free) {              /* check if we have enough space */              while (*i+keep_free >= argv_len) {                  argv_len *= 2; -                debug("Reallocating memory (now %zu)\n", argv_len); -                /* TODO: replace realloc? */ -                char **new_ptr = realloc(argv, argv_len * sizeof(char*)); -                if (!new_ptr) -                    fatal("redo: couldn't realloc %zu bytes", -                          argv_len * sizeof(char*)); -                argv = new_ptr; +                debug("Reallocating memory (now %zu elements)\n", argv_len); +                argv = safe_realloc(argv, argv_len * sizeof(char*));              }              prev_space = false; @@ -15,6 +15,8 @@  #define STRINGIFY(x) #x  #define LOG_HELPER(f,l,...) fprintf(stderr, "("f":"STRINGIFY(l)"): "__VA_ARGS__)  #define FATAL_HELPER(M, ...) log_err(M ": %s\n", __VA_ARGS__) +#define FATAL_HELPER_(f,l,M,...) \ +    fprintf(stderr, "(%s:%u): " M ": %s\n", f, l, __VA_ARGS__)  #ifdef NDEBUG  #define debug(...) @@ -23,6 +25,9 @@  #endif  #define log_err(...) LOG_HELPER(__FILENAME__, __LINE__, __VA_ARGS__) -#define fatal(...) {FATAL_HELPER(__VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);} +#define fatal(...) \ +    {FATAL_HELPER(__VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);} +#define fatal_(f,l,...) \ +    {FATAL_HELPER_(f, l, __VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);}  #endif @@ -11,14 +11,32 @@  #include "../config.h"  /* A safe malloc wrapper. */ -void *ec_malloc(size_t size) { +void *safe_malloc_(size_t size, const char *file, unsigned int line) {      void *ptr = malloc(size); +      if (!ptr) -        fatal("redo: cannot allocate %zu bytes", size); +        fatal_(file, line, "redo: cannot allocate %zu bytes", size);      return ptr;  } +void *safe_realloc_(void *ptr, size_t size, const char *file, unsigned int line) { +    void *ptr2 = realloc(ptr, size); +    if (!ptr2) +        fatal_(file, line, "redo: cannot reallocate %zu bytes", size); + +    return ptr2; +} + +FILE *safe_fopen_(const char *path, const char *mode, const char *file, +                  unsigned int line) { +    FILE *temp = fopen(path, mode); +    if (!temp) +        fatal_(file, line, "redo: failed to open %s", path); + +    return temp; +} +  /* For concating multiple strings into a single larger one. */  char *concat(size_t count, ...) {      assert(count > 0); @@ -31,7 +49,7 @@ char *concat(size_t count, ...) {          size += args_len[i];      }      size++; -    char *result = ec_malloc(size); +    char *result = safe_malloc(size);      /* debug("Allocated %zu bytes at %p\n", size, result); */      uintptr_t offset = 0;      for (i = 0; i < count; ++i) { @@ -49,6 +67,7 @@ char *xbasename(const char *path) {      return ptr? ptr+1 : (char*) path;  } +/* TODO: REIMPLEMENT */  char *ec_strdup(const char* str) {      assert(str);      size_t len = strlen(str) + 1; @@ -1,11 +1,20 @@  #ifndef __RUTIL_H__  #define __RUTIL_H__ +#include <stdio.h>  #include <stdlib.h> +#include <stddef.h>  #include "../config.h" +#define safe_malloc(size) safe_malloc_(size, __FILENAME__, __LINE__) +#define safe_realloc(ptr, size) safe_realloc_(ptr, size, __FILENAME__, __LINE__) +#define safe_fopen(path, mode) safe_fopen_(path, mode, __FILENAME__, __LINE__) + +extern void *safe_malloc_(size_t size, const char *file, unsigned int line); +extern void *safe_realloc_(void *ptr, size_t size, const char *file, unsigned int line); +extern FILE *safe_fopen_(const char *path, const char *mode, +                         const char *file, unsigned int line);  extern char *concat(size_t count, ...); -extern void *ec_malloc(size_t size);  extern char *ec_strdup(const char* str);  extern char *strdup(const char *str);  extern char *xbasename(const char *path);  | 
