ipf_dotuning.c revision 147547
1145519Sdarrenr/*	$FreeBSD: head/contrib/ipfilter/lib/ipf_dotuning.c 147547 2005-06-23 14:19:02Z darrenr $	*/
2145510Sdarrenr
3145510Sdarrenr#include "ipf.h"
4145547Sdarrenr#include "netinet/ipl.h"
5145510Sdarrenr#include <sys/ioctl.h>
6145510Sdarrenr
7145510Sdarrenrvoid ipf_dotuning(fd, tuneargs, iocfn)
8145510Sdarrenrint fd;
9145510Sdarrenrchar *tuneargs;
10145510Sdarrenrioctlfunc_t iocfn;
11145510Sdarrenr{
12145510Sdarrenr	ipfobj_t obj;
13145510Sdarrenr	ipftune_t tu;
14145510Sdarrenr	char *s, *t;
15145510Sdarrenr
16145510Sdarrenr	bzero((char *)&tu, sizeof(tu));
17145510Sdarrenr	obj.ipfo_rev = IPFILTER_VERSION;
18145510Sdarrenr	obj.ipfo_size = sizeof(tu);;
19145510Sdarrenr	obj.ipfo_ptr = (void *)&tu;
20145510Sdarrenr	obj.ipfo_type = IPFOBJ_TUNEABLE;
21145510Sdarrenr
22145510Sdarrenr	for (s = strtok(tuneargs, ","); s != NULL; s = strtok(NULL, ",")) {
23145510Sdarrenr		if (!strcmp(s, "list")) {
24145510Sdarrenr			while (1) {
25145510Sdarrenr				if ((*iocfn)(fd, SIOCIPFGETNEXT, &obj) == -1) {
26145510Sdarrenr					perror("ioctl(SIOCIPFGETNEXT)");
27145510Sdarrenr					break;
28145510Sdarrenr				}
29145510Sdarrenr				if (tu.ipft_cookie == NULL)
30145510Sdarrenr					break;
31145510Sdarrenr
32145510Sdarrenr				tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
33145510Sdarrenr				printtunable(&tu);
34145510Sdarrenr			}
35145510Sdarrenr		} else if ((t = strchr(s, '=')) != NULL) {
36147547Sdarrenr			tu.ipft_cookie = NULL;
37145510Sdarrenr			*t++ = '\0';
38145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
39145510Sdarrenr			if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
40145510Sdarrenr				if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
41145510Sdarrenr					perror("ioctl(SIOCIPFSET)");
42145510Sdarrenr					return;
43145510Sdarrenr				}
44145510Sdarrenr			} else {
45145510Sdarrenr				fprintf(stderr, "invalid value '%s'\n", s);
46145510Sdarrenr				return;
47145510Sdarrenr			}
48145510Sdarrenr		} else {
49147547Sdarrenr			tu.ipft_cookie = NULL;
50145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
51145510Sdarrenr			if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
52145510Sdarrenr				perror("ioctl(SIOCIPFGET)");
53145510Sdarrenr				return;
54145510Sdarrenr			}
55147547Sdarrenr			if (tu.ipft_cookie == NULL) {
56147547Sdarrenr				fprintf(stderr, "Null cookie for %s\n", s);
57145510Sdarrenr				return;
58147547Sdarrenr			}
59145510Sdarrenr
60145510Sdarrenr			tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
61145510Sdarrenr			printtunable(&tu);
62145510Sdarrenr		}
63145510Sdarrenr	}
64145510Sdarrenr}
65