fsetflags.c revision 19dacda2b02bb08c0ffb649f84526b249c749279
119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * fsetflags.c - Set a file flags on an ext2 file system 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr> 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Laboratoire MASI, Institut Blaise Pascal 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Universite Pierre et Marie Curie (Paris VI) 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file can be redistributed under the terms of the GNU Library General 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Public License 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * History: 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 93/10/30 - Creation 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE_SOURCE 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE64_SOURCE 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_ERRNO_H 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h" 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Deal with lame glibc's that define this function without actually 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * implementing it. Can you say "attractive nuisance", boys and girls? 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * I knew you could! 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef __linux__ 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#undef HAVE_CHFLAGS 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef O_LARGEFILE 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint fsetflags (const char * name, unsigned long flags) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat buf; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_CHFLAGS && !(APPLE_DARWIN && HAVE_EXT2_IOCTLS) 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long bsd_flags = 0; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_IMMUTABLE 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_IMMUTABLE_FL) 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_IMMUTABLE; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_APPEND 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_APPEND_FL) 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_APPEND; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_NODUMP 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_NODUMP_FL) 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_NODUMP; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return chflags (name, bsd_flags); 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd, r, f, save_errno = 0; 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!stat(name, &buf) && 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) { 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto notsupp; 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !APPLE_DARWIN 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open (name, OPEN_FLAGS); 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd == -1) 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = (int) flags; 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project r = ioctl (fd, EXT2_IOC_SETFLAGS, &f); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (r == -1) 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project save_errno = errno; 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close (fd); 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (save_errno) 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = save_errno; 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = (int) flags; 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return syscall(SYS_fsctl, name, EXT2_IOC_SETFLAGS, &f, 0); 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return r; 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* HAVE_EXT2_IOCTLS */ 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnotsupp: 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = EOPNOTSUPP; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 100