setflags.c revision 65f0aab98b20b5994a726ab90d355248bcddfffd
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/* 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * setflags.c - Set a file flags on an ext2 file system 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr> 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Laboratoire MASI, Institut Blaise Pascal 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Universite Pierre et Marie Curie (Paris VI) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * %Begin-Header% 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Library 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * General Public License, version 2. 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * %End-Header% 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/* 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * History: 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 93/10/30 - Creation 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if HAVE_ERRNO_H 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <errno.h> 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <sys/types.h> 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <sys/stat.h> 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if HAVE_EXT2_IOCTLS 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <sys/ioctl.h> 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "e2p.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/* 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Deal with lame glibc's that define this function without actually 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * implementing it. Can you say "attractive nuisance", boys and girls? 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * I knew you could! 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef __linux__ 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#undef HAVE_CHFLAGS 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int setflags (int fd, unsigned long flags) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct stat buf; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if HAVE_CHFLAGS 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsigned long bsd_flags = 0; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef UF_IMMUTABLE 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (flags & EXT2_IMMUTABLE_FL) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bsd_flags |= UF_IMMUTABLE; 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef UF_APPEND 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (flags & EXT2_APPEND_FL) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bsd_flags |= UF_APPEND; 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef UF_NODUMP 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (flags & EXT2_NODUMP_FL) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bsd_flags |= UF_NODUMP; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return fchflags (fd, bsd_flags); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if HAVE_EXT2_IOCTLS 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int f; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!fstat(fd, &buf) && 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) { 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) errno = EOPNOTSUPP; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) f = (int) flags; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return ioctl (fd, EXT2_IOC_SETFLAGS, &f); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif /* HAVE_EXT2_IOCTLS */ 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) errno = EOPNOTSUPP; 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 75