13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * fgetflags.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
1966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define _LARGEFILE_SOURCE
2066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define _LARGEFILE64_SOURCE
2166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_ERRNO_H
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <errno.h>
2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_UNISTD_H
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
28023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include <sys/types.h>
2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <sys/stat.h>
30023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#if HAVE_EXT2_IOCTLS
3150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <fcntl.h>
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h>
3350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h"
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3766d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#ifdef O_LARGEFILE
3866d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
3966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#else
4066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
4166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#endif
4266d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint fgetflags (const char * name, unsigned long * flags)
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
45cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	struct stat buf;
463c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#if HAVE_STAT_FLAGS && !(APPLE_DARWIN && HAVE_EXT2_IOCTLS)
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
48cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (stat (name, &buf) == -1)
49cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		return -1;
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
51cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	*flags = 0;
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_IMMUTABLE
53cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_IMMUTABLE)
54cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_IMMUTABLE_FL;
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_APPEND
57cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_APPEND)
58cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_APPEND_FL;
5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_NODUMP
61cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	if (buf.st_flags & UF_NODUMP)
62cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o		*flags |= EXT2_NODUMP_FL;
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
65cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	return 0;
66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else /* !HAVE_STAT_FLAGS || (APPLE_DARWIN && HAVE_EXT2_IOCTLS) */
6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_EXT2_IOCTLS
68a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o	int fd, r, f, save_errno = 0;
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
701a4ce9df5884405a7152855b868c3a7bfbeec385Theodore Ts'o	if (!lstat(name, &buf) &&
71023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o	    !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
72023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o		goto notsupp;
73023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o	}
743c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#if !APPLE_DARWIN
7566d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o	fd = open (name, OPEN_FLAGS);
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (fd == -1)
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return -1;
78cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);
79a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o	if (r == -1)
80a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o		save_errno = errno;
81cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	*flags = f;
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	close (fd);
83a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o	if (save_errno)
84a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o		errno = save_errno;
853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return r;
86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else /* APPLE_DARWIN */
873c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   f = -1;
883c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   save_errno = syscall(SYS_fsctl, name, EXT2_IOC_GETFLAGS, &f, 0);
893c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   *flags = f;
903c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   return (save_errno);
91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif /* !APPLE_DARWIN */
92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallnotsupp:
93023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#endif /* HAVE_EXT2_IOCTLS */
94023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#endif
9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	errno = EOPNOTSUPP;
9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return -1;
973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
98