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