119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * setflags.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#if HAVE_ERRNO_H 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h" 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/* 313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * Deal with lame glibc's that define this function without actually 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * implementing it. Can you say "attractive nuisance", boys and girls? 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * I knew you could! 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef __linux__ 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#undef HAVE_CHFLAGS 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint setflags (int fd, unsigned long flags) 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat buf; 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_CHFLAGS 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long bsd_flags = 0; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_IMMUTABLE 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_IMMUTABLE_FL) 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_IMMUTABLE; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_APPEND 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_APPEND_FL) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_APPEND; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef UF_NODUMP 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_NODUMP_FL) 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bsd_flags |= UF_NODUMP; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return fchflags (fd, bsd_flags); 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int f; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!fstat(fd, &buf) && 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) { 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = EOPNOTSUPP; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = (int) flags; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ioctl (fd, EXT2_IOC_SETFLAGS, &f); 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* HAVE_EXT2_IOCTLS */ 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = EOPNOTSUPP; 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 75