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