/* * fgetproject.c --- get project id * * Copyright (C) 1999 Theodore Ts'o * * %Begin-Header% * This file may be redistributed under the terms of the GNU Library * General Public License, version 2. * %End-Header% */ #ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE #endif #ifndef _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE #endif #include "config.h" #if HAVE_ERRNO_H #include #endif #if HAVE_UNISTD_H #include #endif #include #include #if HAVE_EXT2_IOCTLS #include #include #include "project.h" #endif #include "e2p.h" #ifdef O_LARGEFILE #define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) #else #define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) #endif int fsetproject(const char *name, unsigned long project) { #ifndef FS_IOC_FSGETXATTR errno = EOPNOTSUPP; return -1; #else int fd, r, save_errno = 0; struct fsxattr fsx; fd = open (name, OPEN_FLAGS); if (fd == -1) return -1; r = ioctl (fd, FS_IOC_FSGETXATTR, &fsx); if (r == -1) { save_errno = errno; goto errout; } fsx.fsx_projid = project; r = ioctl (fd, FS_IOC_FSSETXATTR, &fsx); if (r == -1) save_errno = errno; errout: close (fd); if (save_errno) errno = save_errno; return r; #endif }