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 * 88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %Begin-Header% 98558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library 108558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2. 118558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %End-Header% 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * History: 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 93/10/30 - Creation 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE_SOURCE 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE64_SOURCE 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_ERRNO_H 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h" 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/* 383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * Deal with lame glibc's that define this function without actually 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * implementing it. Can you say "attractive nuisance", boys and girls? 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * I knew you could! 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef __linux__ 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#undef HAVE_CHFLAGS 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef O_LARGEFILE 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint fsetflags (const char * name, unsigned long flags) 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat buf; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_CHFLAGS && !(APPLE_DARWIN && HAVE_EXT2_IOCTLS) 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long bsd_flags = 0; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_IMMUTABLE 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_IMMUTABLE_FL) 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_IMMUTABLE; 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_APPEND 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_APPEND_FL) 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_APPEND; 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_NODUMP 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_NODUMP_FL) 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_NODUMP; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return chflags (name, bsd_flags); 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd, r, f, save_errno = 0; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!lstat(name, &buf) && 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) { 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto notsupp; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !APPLE_DARWIN 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open (name, OPEN_FLAGS); 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd == -1) 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = (int) flags; 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project r = ioctl (fd, EXT2_IOC_SETFLAGS, &f); 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (r == -1) 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project save_errno = errno; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close (fd); 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (save_errno) 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = save_errno; 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = (int) flags; 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return syscall(SYS_fsctl, name, EXT2_IOC_SETFLAGS, &f, 0); 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return r; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* HAVE_EXT2_IOCTLS */ 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnotsupp: 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = EOPNOTSUPP; 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 102