| 26 | } |
| 27 | |
| 28 | char *path_join(const tal_t *ctx, const char *base, const char *a) |
| 29 | { |
| 30 | char *ret = NULL; |
| 31 | size_t len; |
| 32 | |
| 33 | if (unlikely(!a) && taken(a)) { |
| 34 | if (taken(base)) |
| 35 | tal_free(base); |
| 36 | return NULL; |
| 37 | } |
| 38 | |
| 39 | if (a[0] == PATH_SEP) { |
| 40 | if (taken(base)) |
| 41 | tal_free(base); |
| 42 | return tal_strdup(ctx, a); |
| 43 | } |
| 44 | |
| 45 | if (unlikely(!base) && taken(base)) |
| 46 | goto out; |
| 47 | |
| 48 | len = strlen(base); |
| 49 | ret = tal_dup_arr(ctx, char, base, len, 1 + strlen(a) + 1); |
| 50 | if (!ret) |
| 51 | goto out; |
| 52 | if (len != 0 && ret[len-1] != PATH_SEP) |
| 53 | ret[len++] = PATH_SEP; |
| 54 | strcpy(ret + len, a); |
| 55 | |
| 56 | out: |
| 57 | if (taken(a)) |
| 58 | tal_free(a); |
| 59 | return ret; |
| 60 | } |
| 61 | |
| 62 | #if HAVE_FCHDIR |
| 63 | struct path_pushd { |