1bad58c9cSBen Gras /* This procedure examines a file system and figures out whether it is
2bad58c9cSBen Gras * version 1 or version 2. It returns the result as an int. If the
3bad58c9cSBen Gras * file system is neither, it returns -1. A typical call is:
4bad58c9cSBen Gras *
5bad58c9cSBen Gras * n = fsversion("/dev/hd1", "df");
6bad58c9cSBen Gras *
7bad58c9cSBen Gras * The first argument is the special file for the file system.
8bad58c9cSBen Gras * The second is the program name, which is used in error messages.
9bad58c9cSBen Gras */
10bad58c9cSBen Gras
11bad58c9cSBen Gras #include <sys/types.h>
12bad58c9cSBen Gras #include <minix/config.h>
13bad58c9cSBen Gras #include <minix/const.h>
14bad58c9cSBen Gras #include <minix/minlib.h>
15bad58c9cSBen Gras #include <minix/type.h>
16bad58c9cSBen Gras #include <fcntl.h>
17bad58c9cSBen Gras #include <unistd.h>
18bad58c9cSBen Gras #include <stdio.h>
19bad58c9cSBen Gras #include <string.h>
20bad58c9cSBen Gras
21bad58c9cSBen Gras #include "mfs/const.h"
22bad58c9cSBen Gras
23bad58c9cSBen Gras static char super[SUPER_BLOCK_BYTES];
24bad58c9cSBen Gras
25bad58c9cSBen Gras #define MAGIC_OFFSET_MFS 0x18
26bad58c9cSBen Gras #define MAGIC_OFFSET_EXT 0x38
27*69eead77SJean-Baptiste Boric #define MAGIC_OFFSET_ISO9660 0x8000
28bad58c9cSBen Gras #define MAGIC_VALUE_EXT2 0xef53
29bad58c9cSBen Gras
check_super(off_t offset,unsigned short magic)30bad58c9cSBen Gras static int check_super(off_t offset, unsigned short magic)
31bad58c9cSBen Gras {
32bad58c9cSBen Gras return (memcmp(super + offset, &magic, sizeof(magic)) == 0) ? 1 : 0;
33bad58c9cSBen Gras }
34bad58c9cSBen Gras
fsversion(char * dev,char * prog)35*69eead77SJean-Baptiste Boric int fsversion(char *dev, char *prog)
36bad58c9cSBen Gras {
37*69eead77SJean-Baptiste Boric int result = -1, fd;
38bad58c9cSBen Gras
39bad58c9cSBen Gras if ((fd = open(dev, O_RDONLY)) < 0) {
40bad58c9cSBen Gras std_err(prog);
41bad58c9cSBen Gras std_err(" cannot open ");
42bad58c9cSBen Gras perror(dev);
43bad58c9cSBen Gras return(-1);
44bad58c9cSBen Gras }
45bad58c9cSBen Gras
46bad58c9cSBen Gras lseek(fd, (off_t) SUPER_BLOCK_BYTES, SEEK_SET); /* skip boot block */
47bad58c9cSBen Gras if (read(fd, (char *) &super, sizeof(super)) != sizeof(super)) {
48bad58c9cSBen Gras std_err(prog);
49bad58c9cSBen Gras std_err(" cannot read super block on ");
50bad58c9cSBen Gras perror(dev);
51bad58c9cSBen Gras close(fd);
52bad58c9cSBen Gras return(-1);
53bad58c9cSBen Gras }
54bad58c9cSBen Gras
55bad58c9cSBen Gras /* first check MFS, a valid MFS may look like EXT but not vice versa */
56*69eead77SJean-Baptiste Boric if (check_super(MAGIC_OFFSET_MFS, SUPER_MAGIC)) {
57*69eead77SJean-Baptiste Boric result = FSVERSION_MFS1;
58*69eead77SJean-Baptiste Boric goto done;
59*69eead77SJean-Baptiste Boric }
60*69eead77SJean-Baptiste Boric else if (check_super(MAGIC_OFFSET_MFS, SUPER_V2)) {
61*69eead77SJean-Baptiste Boric result = FSVERSION_MFS2;
62*69eead77SJean-Baptiste Boric goto done;
63*69eead77SJean-Baptiste Boric }
64*69eead77SJean-Baptiste Boric else if (check_super(MAGIC_OFFSET_MFS, SUPER_V3)) {
65*69eead77SJean-Baptiste Boric result = FSVERSION_MFS3;
66*69eead77SJean-Baptiste Boric goto done;
67*69eead77SJean-Baptiste Boric }
68bad58c9cSBen Gras
69*69eead77SJean-Baptiste Boric /* check ext2 */
70*69eead77SJean-Baptiste Boric if (check_super(MAGIC_OFFSET_EXT, MAGIC_VALUE_EXT2)) {
71*69eead77SJean-Baptiste Boric result = FSVERSION_EXT2;
72*69eead77SJean-Baptiste Boric goto done;
73*69eead77SJean-Baptiste Boric }
74*69eead77SJean-Baptiste Boric
75*69eead77SJean-Baptiste Boric /* check ISO 9660 */
76*69eead77SJean-Baptiste Boric lseek(fd, (off_t) MAGIC_OFFSET_ISO9660, SEEK_SET);
77*69eead77SJean-Baptiste Boric if (read(fd, (char *) &super, sizeof(super)) == sizeof(super)) {
78*69eead77SJean-Baptiste Boric if (memcmp(super+1, "CD001", 5) == 0) {
79*69eead77SJean-Baptiste Boric result = FSVERSION_ISO9660;
80*69eead77SJean-Baptiste Boric goto done;
81*69eead77SJean-Baptiste Boric }
82*69eead77SJean-Baptiste Boric }
83*69eead77SJean-Baptiste Boric
84*69eead77SJean-Baptiste Boric done:
85*69eead77SJean-Baptiste Boric close(fd);
86*69eead77SJean-Baptiste Boric return result;
87bad58c9cSBen Gras }
88