fgetflags.c revision 50e1e10fa0ac12a3e2a9d20a75ee9041873cda96
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 *
83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This file can be redistributed under the terms of the GNU Library General
93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Public License
103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History:
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/30	- Creation
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_ERRNO_H
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <errno.h>
1950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
2050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_UNISTD_H
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_STAT_FLAGS
2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <sys/stat.h>
2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else
2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <fcntl.h>
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h>
2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <linux/ext2_fs.h>
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h"
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint fgetflags (const char * name, unsigned long * flags)
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
3650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_STAT_FLAGS
3750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  struct stat buf;
3850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
3950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  if (stat (name, &buf) == -1)
4050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    return -1;
4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  *flags = 0;
4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_IMMUTABLE
4450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  if (buf.st_flags & UF_IMMUTABLE)
4550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    *flags |= EXT2_IMMUTABLE_FL;
4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_APPEND
4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  if (buf.st_flags & UF_APPEND)
4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    *flags |= EXT2_APPEND_FL;
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef UF_NODUMP
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  if (buf.st_flags & UF_NODUMP)
5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    *flags |= EXT2_NODUMP_FL;
5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o  return 0;
5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else
5850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_EXT2_IOCTLS
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int fd;
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int r;
613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fd = open (name, O_RDONLY);
633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	if (fd == -1)
643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return -1;
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	r = ioctl (fd, EXT2_IOC_GETFLAGS, flags);
6650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	close (fd);
683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return r;
6950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else /* ! HAVE_EXT2_IOCTLS */
7050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	extern int errno;
7150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	errno = EOPNOTSUPP;
7250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return -1;
7350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* ! HAVE_EXT2_IOCTLS */
7450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
76