checkrev.c revision 255332
1228753Smm/*	$FreeBSD: head/contrib/ipfilter/lib/checkrev.c 255332 2013-09-06 23:11:19Z cy $	*/
2228753Smm
3228753Smm/*
4228753Smm * Copyright (C) 2012 by Darren Reed.
5228753Smm *
6228753Smm * See the IPFILTER.LICENCE file for details on licencing.
7228753Smm *
8228753Smm * $Id$
9228753Smm */
10228753Smm
11228753Smm#include <sys/ioctl.h>
12228753Smm#include <fcntl.h>
13228753Smm
14228753Smm#include "ipf.h"
15228753Smm#include "netinet/ipl.h"
16228753Smm
17228753Smmint checkrev(ipfname)
18228753Smm	char *ipfname;
19228753Smm{
20228753Smm	static int vfd = -1;
21228753Smm	struct friostat fio;
22228753Smm	ipfobj_t obj;
23228753Smm
24228753Smm	bzero((caddr_t)&obj, sizeof(obj));
25228753Smm	obj.ipfo_rev = IPFILTER_VERSION;
26228753Smm	obj.ipfo_size = sizeof(fio);
27228763Smm	obj.ipfo_ptr = (void *)&fio;
28228753Smm	obj.ipfo_type = IPFOBJ_IPFSTAT;
29248616Smm
30228753Smm	if ((vfd == -1) && ((vfd = open(ipfname, O_RDONLY)) == -1)) {
31228753Smm		perror("open device");
32228753Smm		return -1;
33248616Smm	}
34248616Smm
35248616Smm	if (ioctl(vfd, SIOCGETFS, &obj)) {
36228753Smm		ipferror(vfd, "ioctl(SIOCGETFS)");
37248616Smm		close(vfd);
38228753Smm		vfd = -1;
39228753Smm		return -1;
40228753Smm	}
41228753Smm
42228753Smm	if (strncmp(IPL_VERSION, fio.f_version, sizeof(fio.f_version))) {
43228753Smm		return -1;
44228753Smm	}
45228753Smm	return 0;
46228753Smm}
47228753Smm