xref: /freebsd/sbin/ipf/libipf/checkrev.c (revision 2e4311906d8c8dc7a7c726345268253bca6d4acc)
1 /*	$FreeBSD$	*/
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id$
9  */
10 
11 #include <sys/ioctl.h>
12 #include <fcntl.h>
13 
14 #include "ipf.h"
15 #include "netinet/ipl.h"
16 
17 int
18 checkrev(char *ipfname)
19 {
20 	static int vfd = -1;
21 	struct friostat fio;
22 	ipfobj_t obj;
23 
24 	bzero((caddr_t)&obj, sizeof(obj));
25 	obj.ipfo_rev = IPFILTER_VERSION;
26 	obj.ipfo_size = sizeof(fio);
27 	obj.ipfo_ptr = (void *)&fio;
28 	obj.ipfo_type = IPFOBJ_IPFSTAT;
29 
30 	if ((vfd == -1) && ((vfd = open(ipfname, O_RDONLY)) == -1)) {
31 		perror("open device");
32 		return (-1);
33 	}
34 
35 	if (ioctl(vfd, SIOCGETFS, &obj)) {
36 		ipferror(vfd, "ioctl(SIOCGETFS)");
37 		close(vfd);
38 		vfd = -1;
39 		return (-1);
40 	}
41 
42 	if (strncmp(IPL_VERSION, fio.f_version, sizeof(fio.f_version))) {
43 		return (-1);
44 	}
45 	return (0);
46 }
47