13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * fgetversion.c	- Get 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 fgetversion (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)
47593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o		return -1;
4817dba281a042d3f8122ef7ce6933035a8eae074aTheodore Ts'o	r = ioctl (fd, EXT2_IOC_GETVERSION, &ver);
49593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o	if (r == -1)
50593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o		save_errno = errno;
51cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o	*version = ver;
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=-1, err;
583c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   err = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
593c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   *version = ver;
603c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o   return(err);
613c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o#endif
6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else /* ! HAVE_EXT2_IOCTLS */
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	extern int errno;
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	errno = EOPNOTSUPP;
6550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return -1;
6650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* ! HAVE_EXT2_IOCTLS */
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
68