blob: e6cee8bf2bad3ab68b2dc04b63e0b588420f5371 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*
2 * fgetversion.c - Get a file version on an ext2 file system
3 *
4 * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr>
5 * Laboratoire MASI, Institut Blaise Pascal
6 * Universite Pierre et Marie Curie (Paris VI)
7 *
8 * %Begin-Header%
9 * This file may be redistributed under the terms of the GNU Library
10 * General Public License, version 2.
11 * %End-Header%
12 */
13
14/*
15 * History:
16 * 93/10/30 - Creation
17 */
18
19#define _LARGEFILE_SOURCE
20#define _LARGEFILE64_SOURCE
21
22#include "config.h"
23#if HAVE_ERRNO_H
24#include <errno.h>
25#endif
26#if HAVE_UNISTD_H
27#include <unistd.h>
28#endif
29#include <fcntl.h>
30#include <sys/ioctl.h>
31
32#include "e2p.h"
33
34#ifdef O_LARGEFILE
35#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
36#else
37#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
38#endif
39
40int fgetversion (const char * name, unsigned long * version)
41{
42#if HAVE_EXT2_IOCTLS
43#if !APPLE_DARWIN
44 int fd, r, ver, save_errno = 0;
45
46 fd = open (name, OPEN_FLAGS);
47 if (fd == -1)
48 return -1;
49 r = ioctl (fd, EXT2_IOC_GETVERSION, &ver);
50 if (r == -1)
51 save_errno = errno;
52 *version = ver;
53 close (fd);
54 if (save_errno)
55 errno = save_errno;
56 return r;
57#else
58 int ver=-1, err;
59 err = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
60 *version = ver;
61 return(err);
62#endif
63#else /* ! HAVE_EXT2_IOCTLS */
64 extern int errno;
65 errno = EOPNOTSUPP;
66 return -1;
67#endif /* ! HAVE_EXT2_IOCTLS */
68}