13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * getflags.c		- Get a file flags on an ext2 file system
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994  Remy Card <card@masi.ibp.fr>
53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *                           Laboratoire MASI, Institut Blaise Pascal
63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *                           Universite Pierre et Marie Curie (Paris VI)
73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header%
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header%
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History:
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/30	- Creation
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_ERRNO_H
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <errno.h>
2150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
22023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include <sys/types.h>
2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <sys/stat.h>
24023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#if HAVE_EXT2_IOCTLS
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h>
2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h"
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint getflags (int fd, unsigned long * flags)
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
32cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	struct stat buf;
33023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#if HAVE_STAT_FLAGS
3450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
35cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (fstat (fd, &buf) == -1)
36cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		return -1;
3750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
38cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	*flags = 0;
3950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_IMMUTABLE
40cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_IMMUTABLE)
41cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_IMMUTABLE_FL;
4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_APPEND
44cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_APPEND)
45cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_APPEND_FL;
4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_NODUMP
48cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_NODUMP)
49cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_NODUMP_FL;
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
52cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	return 0;
5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else
5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_EXT2_IOCTLS
55cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	int r, f;
56efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
57023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o	if (!fstat(fd, &buf) &&
58023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o	    !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode))
59023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o		goto notsupp;
60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	r = ioctl(fd, EXT2_IOC_GETFLAGS, &f);
61cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	*flags = f;
62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
63cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	return r;
64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallnotsupp:
65023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#endif /* HAVE_EXT2_IOCTLS */
66023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#endif
6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	errno = EOPNOTSUPP;
6850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return -1;
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
70