1ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o/*
2ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * fgetproject.c --- get project id
3ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o *
4ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * Copyright (C) 1999  Theodore Ts'o <tytso@mit.edu>
5ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o *
6ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * %Begin-Header%
7ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
8ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * General Public License, version 2.
9ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o * %End-Header%
10ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o */
11ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
12ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#ifndef _LARGEFILE_SOURCE
13ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#define _LARGEFILE_SOURCE
14ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
15ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#ifndef _LARGEFILE64_SOURCE
16ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#define _LARGEFILE64_SOURCE
17ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
18ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
19ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include "config.h"
20ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#if HAVE_ERRNO_H
21ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <errno.h>
22ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
23ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#if HAVE_UNISTD_H
24ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <unistd.h>
25ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
26ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <sys/types.h>
27ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <sys/stat.h>
28ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#if HAVE_EXT2_IOCTLS
29ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <fcntl.h>
30ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include <sys/ioctl.h>
31ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include "project.h"
32ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
33ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
34ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#include "e2p.h"
35ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
36ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#ifdef O_LARGEFILE
37ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
38ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#else
39ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
40ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
41ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
42ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'oint fsetproject(const char *name, unsigned long project)
43ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o{
44ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#ifndef FS_IOC_FSGETXATTR
45ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	errno = EOPNOTSUPP;
46ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	return -1;
47ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#else
48ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	int fd, r, save_errno = 0;
49ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	struct fsxattr fsx;
50ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o
51ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	fd = open (name, OPEN_FLAGS);
52ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	if (fd == -1)
53ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o		return -1;
54ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	r = ioctl (fd, FS_IOC_FSGETXATTR, &fsx);
55ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	if (r == -1) {
56ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o		save_errno = errno;
57ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o		goto errout;
58ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	}
59ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	fsx.fsx_projid = project;
60ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	r = ioctl (fd, FS_IOC_FSSETXATTR, &fsx);
61ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	if (r == -1)
62ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o		save_errno = errno;
63ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'oerrout:
64ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	close (fd);
65ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	if (save_errno)
66ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o		errno = save_errno;
67ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o	return r;
68ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o#endif
69ccf028f2e766e1364bbebff36f8274d72749de43Theodore Ts'o}
70