| 137 | #endif /* !HAVE_FCHDIR */ |
| 138 | |
| 139 | char *path_canon(const tal_t *ctx, const char *a) |
| 140 | { |
| 141 | #if 0 |
| 142 | char *oldcwd, *path, *p; |
| 143 | void *tmpctx; |
| 144 | size_t len; |
| 145 | struct path_pushd *olddir; |
| 146 | |
| 147 | /* A good guess as to size. */ |
| 148 | len = strlen(a) + 1; |
| 149 | if (a[0] != PATH_SEP) { |
| 150 | tmpctx = oldcwd = path_cwd(ctx); |
| 151 | if (!oldcwd) |
| 152 | return NULL; |
| 153 | len += strlen(oldcwd) + strlen(PATH_SEP_STR); |
| 154 | |
| 155 | path = tal_array(tmpctx, char, len); |
| 156 | if (!path) |
| 157 | goto out; |
| 158 | |
| 159 | len = strlen(oldcwd); |
| 160 | memcpy(path, oldcwd, len); |
| 161 | path[len++] = PATH_SEP; |
| 162 | } else { |
| 163 | tmpctx = path = tal_array(ctx, char, len); |
| 164 | if (!path) |
| 165 | return NULL; |
| 166 | len = 0; |
| 167 | } |
| 168 | strcpy(path + len, a); |
| 169 | |
| 170 | p = strrchr(path, PATH_SEP); |
| 171 | *p = '\0'; |
| 172 | |
| 173 | olddir = path_pushd(tmpctx, path); |
| 174 | if (!olddir) |
| 175 | goto out; |
| 176 | |
| 177 | /* Make OS canonicalize path for us. */ |
| 178 | path = path_cwd(tmpctx); |
| 179 | if (!path) |
| 180 | goto out; |
| 181 | |
| 182 | /* Append rest of old path. */ |
| 183 | len = strlen(p+1); |
| 184 | if (len) { |
| 185 | size_t oldlen = tal_array_length(path); |
| 186 | if (path[oldlen-1] != PATH_SEP) { |
| 187 | /* Include / to append. */ |
| 188 | *p = PATH_SEP; |
| 189 | p--; |
| 190 | len++; |
| 191 | } |
| 192 | path = tal_realloc(NULL, path, char, oldlen+len+1); |
| 193 | if (!path) |
| 194 | goto out; |
| 195 | memcpy(path + oldlen, p, len+1); |
| 196 | } |