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