aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTharre <tharre3@gmail.com>2014-04-16 22:13:05 +0200
committerTharre <tharre3@gmail.com>2014-04-16 22:13:05 +0200
commit9e5c74c5711557b120945b5a2c0d6723d3427c20 (patch)
treedc366a6c93ce71c30209b74cf7f4e4184f450790
parent3fbeb8a37f74bda763c7de2da63ae358fc0b1b0e (diff)
downloadredo-9e5c74c5711557b120945b5a2c0d6723d3427c20.tar.gz
redo-9e5c74c5711557b120945b5a2c0d6723d3427c20.tar.xz
redo-9e5c74c5711557b120945b5a2c0d6723d3427c20.zip
Rewrote malloc() and other wrappers
-rw-r--r--src/build.c39
-rw-r--r--src/dbg.h7
-rw-r--r--src/util.c25
-rw-r--r--src/util.h11
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;
diff --git a/src/dbg.h b/src/dbg.h
index 014c358..41bebb9 100644
--- a/src/dbg.h
+++ b/src/dbg.h
@@ -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
diff --git a/src/util.c b/src/util.c
index 80734c5..a0e05f5 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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;
diff --git a/src/util.h b/src/util.h
index 40780d8..abfb666 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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);