13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * fsetversion.c - Set a file version on an ext2 file system 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr> 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Laboratoire MASI, Institut Blaise Pascal 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Universite Pierre et Marie Curie (Paris VI) 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header% 9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library 10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2. 11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header% 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History: 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/30 - Creation 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define _LARGEFILE_SOURCE 2066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define _LARGEFILE64_SOURCE 2166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o 2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_ERRNO_H 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <errno.h> 2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_UNISTD_H 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <fcntl.h> 293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h> 303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h" 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3366d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#ifdef O_LARGEFILE 3466d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE) 3566d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#else 3666d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK) 3766d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#endif 3866d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o 393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint fsetversion (const char * name, unsigned long version) 403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_EXT2_IOCTLS 423c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#if !APPLE_DARWIN 43593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o int fd, r, ver, save_errno = 0; 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4566d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o fd = open (name, OPEN_FLAGS); 463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (fd == -1) 473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return -1; 48cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o ver = (int) version; 49cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o r = ioctl (fd, EXT2_IOC_SETVERSION, &ver); 50593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (r == -1) 51593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o save_errno = errno; 523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o close (fd); 53593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (save_errno) 54593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o errno = save_errno; 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return r; 563c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#else 573c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o int ver = (int)version; 583c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o return syscall(SYS_fsctl, name, EXT2_IOC_SETVERSION, &ver, 0); 593c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#endif 6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else /* ! HAVE_EXT2_IOCTLS */ 6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o extern int errno; 6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o errno = EOPNOTSUPP; 6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return -1; 6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* ! HAVE_EXT2_IOCTLS */ 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 66