ssize_t ul_path_readlink(struct path_cxt *pc, char *buf, size_t bufsiz, const char *path)
{
int dirfd;
+ ssize_t ssz;
if (!path) {
const char *p = get_absdir(pc);
if (!p)
return -errno;
- return readlink(p, buf, bufsiz);
- }
+ ssz = readlink(p, buf, bufsiz - 1);
+ } else {
+ dirfd = ul_path_get_dirfd(pc);
+ if (dirfd < 0)
+ return dirfd;
- dirfd = ul_path_get_dirfd(pc);
- if (dirfd < 0)
- return dirfd;
+ if (*path == '/')
+ path++;
- if (*path == '/')
- path++;
+ ssz = readlinkat(dirfd, path, buf, bufsiz - 1);
+ }
- return readlinkat(dirfd, path, buf, bufsiz);
+ if (ssz >= 0)
+ buf[ssz] = '\0';
+ return ssz;
}
/*
ssize_t sz;
/* read /sys/dev/block/<maj:min> link */
- sz = ul_path_readlink(pc, link, sizeof(link) - 1, NULL);
+ sz = ul_path_readlink(pc, link, sizeof(link), NULL);
if (sz < 0)
return NULL;
- link[sz] = '\0';
name = strrchr(link, '/');
if (!name)
if (sz <= 0 || sz + sizeof(_PATH_SYS_DEVBLOCK "/") > bufsz)
return NULL;
- buf[sz++] = '\0';
+ sz++;
prefix = ul_path_get_prefix(pc);
if (prefix)
psz = strlen(prefix);
char *name;
ssize_t linklen;
- linklen = ul_path_readlink(pc, linkpath, sizeof(linkpath) - 1, NULL);
+ linklen = ul_path_readlink(pc, linkpath, sizeof(linkpath), NULL);
if (linklen < 0)
goto err;
- linkpath[linklen] = '\0';
stripoff_last_component(linkpath); /* dirname */
name = stripoff_last_component(linkpath); /* basename */
goto done;
blk->hctl_error = 1;
- len = ul_path_readlink(pc, buf, sizeof(buf) - 1, "device");
+ len = ul_path_readlink(pc, buf, sizeof(buf), "device");
if (len < 0)
return len;
- buf[len] = '\0';
hctl = strrchr(buf, '/');
if (!hctl)
return -1;