{
char sym[PATH_MAX];
ssize_t sz;
+ int isrel = 0;
sz = readlink(path, sym, sizeof(sym));
if (sz < 1)
if (*sym != '/') {
char *p = strrchr(path, '/');
- nm->relstart = p ? p - path : 0;
- if (nm->relstart)
+ if (p) {
+ isrel = 1;
+ nm->relstart = p ? p - path : 0;
sz += nm->relstart + 1;
+ }
}
nm->abslink = xmalloc(sz + 1);
- if (*sym != '/' && nm->relstart) {
+ if (*sym != '/' && isrel) {
/* create the absolute path from the relative symlink */
memcpy(nm->abslink, path, nm->relstart);
*(nm->abslink + nm->relstart) = '/';
nm->relstart++;
memcpy(nm->abslink + nm->relstart, sym, sz - nm->relstart);
} else
+ /* - absolute link (foo -> /path/bar)
+ * - or link without any subdir (foo -> bar)
+ */
memcpy(nm->abslink, sym, sz);
+
nm->abslink[sz] = '\0';
}