119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * fsetversion.c - Set a file version 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 <fcntl.h> 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h" 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef O_LARGEFILE 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint fsetversion (const char * name, unsigned long version) 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !APPLE_DARWIN 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd, r, ver, save_errno = 0; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open (name, OPEN_FLAGS); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd == -1) 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ver = (int) version; 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project r = ioctl (fd, EXT2_IOC_SETVERSION, &ver); 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (r == -1) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project save_errno = errno; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close (fd); 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (save_errno) 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = save_errno; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return r; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int ver = (int)version; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return syscall(SYS_fsctl, name, EXT2_IOC_SETVERSION, &ver, 0); 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else /* ! HAVE_EXT2_IOCTLS */ 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project extern int errno; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errno = EOPNOTSUPP; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* ! HAVE_EXT2_IOCTLS */ 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 66