return -ENOMEM;
}
- strncpy(lpi->lpi_pathname, pathname, sizeof(lpi->lpi_pathname));
+ strncpy(lpi->lpi_pathname, pathname, sizeof(lpi->lpi_pathname) - 1);
list_add_tail(&lpi->lpi_list, head);
return 0;
}
-static int project_get_xattr(const char *pathname, struct fsxattr *fsx)
+static const char *mode_to_type(mode_t mode)
+{
+ switch (mode & S_IFMT) {
+ case S_IFDIR: return "dir";
+ case S_IFREG: return "regular";
+ case S_IFLNK: return "symlink";
+ case S_IFCHR: return "char device";
+ case S_IFBLK: return "block device";
+ case S_IFIFO: return "fifo";
+ case S_IFSOCK: return "sock";
+ }
+
+ return "unknown";
+}
+
+static int project_get_xattr(const char *pathname, struct fsxattr *fsx,
+ struct stat *st)
{
int ret, fd;
+ ret = lstat(pathname, st);
+ if (ret) {
+ fprintf(stderr, "%s: failed to stat '%s': %s\n",
+ progname, pathname, strerror(errno));
+ return -errno;
+ }
+
+ /* currently, only file and dir supported */
+ if (!S_ISREG(st->st_mode) && !S_ISDIR(st->st_mode)) {
+ errno = ENOTSUP;
+ fprintf(stderr, "%s: unable to get xattr for %s '%s': %s\n",
+ progname, mode_to_type(st->st_mode), pathname,
+ strerror(errno));
+ return -errno;
+ }
+
fd = open(pathname, O_RDONLY | O_NOCTTY | O_NDELAY);
if (fd < 0) {
fprintf(stderr, "%s: failed to open '%s': %s\n",
return -errno;
}
- ret = ioctl(fd, LL_IOC_FSGETXATTR, fsx);
+ ret = ioctl(fd, FS_IOC_FSGETXATTR, fsx);
if (ret) {
fprintf(stderr, "%s: failed to get xattr for '%s': %s\n",
progname, pathname, strerror(errno));
+ close(fd);
return -errno;
}
return fd;
project_check_one(const char *pathname, struct project_handle_control *phc)
{
struct fsxattr fsx;
- struct stat st;
int ret;
+ struct stat st;
- ret = stat(pathname, &st);
- if (ret) {
- fprintf(stderr, "%s: failed to stat '%s': %s\n",
- progname, pathname, strerror(errno));
- return -errno;
- }
-
- ret = project_get_xattr(pathname, &fsx);
+ ret = project_get_xattr(pathname, &fsx, &st);
if (ret < 0)
return ret;
phc->projid = fsx.fsx_projid;
}
- if (!(fsx.fsx_xflags & LL_PROJINHERIT_FL)) {
+ if (!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT) &&
+ S_ISDIR(st.st_mode)) {
if (!phc->newline) {
printf("%s%c", pathname, '\0');
goto out;
project_list_one(const char *pathname, struct project_handle_control *phc)
{
struct fsxattr fsx;
+ struct stat st;
int ret;
- ret = project_get_xattr(pathname, &fsx);
+ ret = project_get_xattr(pathname, &fsx, &st);
if (ret < 0)
return ret;
printf("%5u %c %s\n", fsx.fsx_projid,
- (fsx.fsx_xflags & LL_PROJINHERIT_FL) ?
+ (fsx.fsx_xflags & FS_XFLAG_PROJINHERIT) ?
'P' : '-', pathname);
close(ret);
project_set_one(const char *pathname, struct project_handle_control *phc)
{
struct fsxattr fsx;
+ struct stat st;
int fd, ret = 0;
- fd = project_get_xattr(pathname, &fsx);
+ fd = project_get_xattr(pathname, &fsx, &st);
if (fd < 0)
return fd;
if ((!phc->set_projid || fsx.fsx_projid == phc->projid) &&
- (!phc->set_inherit || (fsx.fsx_xflags & LL_PROJINHERIT_FL)))
+ (!phc->set_inherit || (fsx.fsx_xflags & FS_XFLAG_PROJINHERIT)))
goto out;
if (phc->set_inherit)
- fsx.fsx_xflags |= LL_PROJINHERIT_FL;
+ fsx.fsx_xflags |= FS_XFLAG_PROJINHERIT;
if (phc->set_projid)
fsx.fsx_projid = phc->projid;
- ret = ioctl(fd, LL_IOC_FSSETXATTR, &fsx);
+ ret = ioctl(fd, FS_IOC_FSSETXATTR, &fsx);
if (ret)
fprintf(stderr, "%s: failed to set xattr for '%s': %s\n",
progname, pathname, strerror(errno));
project_clear_one(const char *pathname, struct project_handle_control *phc)
{
struct fsxattr fsx;
+ struct stat st;
int ret = 0, fd;
- fd = project_get_xattr(pathname, &fsx);
+ fd = project_get_xattr(pathname, &fsx, &st);
if (fd < 0)
return fd;
- if ((!(fsx.fsx_xflags & LL_PROJINHERIT_FL)) &&
+ if ((!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT)) &&
(fsx.fsx_projid == 0 || phc->keep_projid))
goto out;
- fsx.fsx_xflags &= ~LL_PROJINHERIT_FL;
+ fsx.fsx_xflags &= ~FS_XFLAG_PROJINHERIT;
if (!phc->keep_projid)
fsx.fsx_projid = 0;
- ret = ioctl(fd, LL_IOC_FSSETXATTR, &fsx);
+ ret = ioctl(fd, FS_IOC_FSSETXATTR, &fsx);
if (ret)
fprintf(stderr, "%s: failed to set xattr for '%s': %s\n",
progname, pathname, strerror(errno));
}
}
- if (ret)
- fprintf(stderr, "%s: failed to handle dir '%s': %s\n",
- progname, pathname, strerror(errno));
-
closedir(dir);
return ret;
}
while (!list_empty(&head)) {
lpi = list_entry(head.next, struct lfs_project_item, lpi_list);
list_del(&lpi->lpi_list);
- if (rc == 0) {
- rc = lfs_project_handle_dir(&head, lpi->lpi_pathname,
- phc, func);
- if (!ret && rc)
- ret = rc;
- }
+ rc = lfs_project_handle_dir(&head, lpi->lpi_pathname,
+ phc, func);
+ if (!ret && rc)
+ ret = rc;
free(lpi);
}