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