xref: /minix3/minix/lib/libc/gen/fsversion.c (revision 69eead77ff7b92014d108017d0765cfa7d3ddba7)
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