aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/build.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/build.c b/src/build.c
index f5e0dbc..ffeeab2 100644
--- a/src/build.c
+++ b/src/build.c
@@ -80,6 +80,9 @@ static int build_target(dep_info *dep) {
}
char *reltarget = get_relpath(dep->target);
+ if (!reltarget)
+ fatal("redo: failed to get realpath() of %s", reltarget);
+
printf("\033[32mredo \033[1m\033[37m%s\033[0m\n", reltarget);
free(reltarget);
@@ -173,6 +176,9 @@ static int build_target(dep_info *dep) {
.path = get_dep_path(doscripts->chosen),
};
+ if (!dep2.path)
+ fatal("redo: failed to get realpath() of %s", doscripts->chosen);
+
if (!fexists(dep2.path)) {
update_dep_info(&dep2, doscripts->chosen);
write_dep_information(&dep2);
@@ -297,22 +303,24 @@ static char *xrealpath(const char *path) {
char *dirc = xstrdup(path);
char *dname = dirname(dirc);
char *absdir = realpath(dname, NULL);
- if (!absdir)
- return NULL;
- char *abstarget = concat(3, absdir, "/", xbasename(path));
+
+ char *abstarget = NULL;
+ if (absdir)
+ abstarget = concat(3, absdir, "/", xbasename(path));
free(dirc);
free(absdir);
return abstarget;
}
-/* Return the relative path against "REDO_ROOT" of target. */
+/* Return the relative path against "REDO_ROOT" of target. Returns NULL if
+ realpath() fails. */
static char *get_relpath(const char *target) {
char *root = getenv("REDO_ROOT");
char *abstarget = xrealpath(target);
if (!abstarget)
- fatal("redo: failed to get realpath() of %s", target);
+ return NULL;
char *path = xstrdup(relpath(abstarget, root));
free(abstarget);
@@ -322,14 +330,13 @@ static char *get_relpath(const char *target) {
/* Return the dependency record path of target. */
static char *get_dep_path(const char *target) {
char *root = getenv("REDO_ROOT");
- char *reltarget = get_relpath(target);
char *dep_path;
+ char *reltarget = get_relpath(target);
+ if (!reltarget)
+ return NULL;
- if (is_absolute(reltarget)) {
- dep_path = concat(3, root, "/.redo/abs/", reltarget);
- } else {
- dep_path = concat(3, root, "/.redo/rel/", reltarget);
- }
+ char *redodir = is_absolute(reltarget) ? "/.redo/abs/" : "/.redo/rel/";
+ dep_path = concat(3, root, redodir, reltarget);
/* create directory */
mkpath(dep_path, 0755); /* TODO: should probably be somewhere else */
@@ -347,6 +354,9 @@ static char *get_dep_path(const char *target) {
*/
void add_prereq(const char *target, const char *parent, int ident) {
char *base_path = get_dep_path(parent);
+ if (!base_path)
+ fatal("redo: failed to get realpath() of %s", parent);
+
char *dep_path = concat(2, base_path, ".prereq");
int fd = open(dep_path, O_WRONLY | O_APPEND | O_CREAT, 0644);
@@ -378,6 +388,9 @@ void add_prereq(const char *target, const char *parent, int ident) {
*/
void add_prereq_path(const char *target, const char *parent, int ident) {
char *reltarget = get_relpath(target);
+ if (!reltarget)
+ fatal("redo: failed to get realpath() of %s", target);
+
add_prereq(reltarget, parent, ident);
free(reltarget);
}
@@ -424,6 +437,9 @@ int update_target(const char *target, int ident) {
.path = get_dep_path(target),
};
+ if (!dep.path)
+ return 1;
+
int retval = handle_ident(&dep, ident);
free(dep.path);
free(dep.hash);