ipf_dotuning.c revision 170268
1145519Sdarrenr/*	$FreeBSD: head/contrib/ipfilter/lib/ipf_dotuning.c 170268 2007-06-04 02:54:36Z darrenr $	*/
2145510Sdarrenr
3170268Sdarrenr/*
4170268Sdarrenr * Copyright (C) 2003-2005 by Darren Reed.
5170268Sdarrenr *
6170268Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7170268Sdarrenr *
8170268Sdarrenr * $Id: ipf_dotuning.c,v 1.2.4.3 2006/06/16 17:21:02 darrenr Exp $
9170268Sdarrenr */
10170268Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145547Sdarrenr#include "netinet/ipl.h"
13145510Sdarrenr#include <sys/ioctl.h>
14145510Sdarrenr
15145510Sdarrenrvoid ipf_dotuning(fd, tuneargs, iocfn)
16145510Sdarrenrint fd;
17145510Sdarrenrchar *tuneargs;
18145510Sdarrenrioctlfunc_t iocfn;
19145510Sdarrenr{
20145510Sdarrenr	ipfobj_t obj;
21145510Sdarrenr	ipftune_t tu;
22145510Sdarrenr	char *s, *t;
23145510Sdarrenr
24145510Sdarrenr	bzero((char *)&tu, sizeof(tu));
25145510Sdarrenr	obj.ipfo_rev = IPFILTER_VERSION;
26145510Sdarrenr	obj.ipfo_size = sizeof(tu);;
27145510Sdarrenr	obj.ipfo_ptr = (void *)&tu;
28145510Sdarrenr	obj.ipfo_type = IPFOBJ_TUNEABLE;
29145510Sdarrenr
30145510Sdarrenr	for (s = strtok(tuneargs, ","); s != NULL; s = strtok(NULL, ",")) {
31145510Sdarrenr		if (!strcmp(s, "list")) {
32145510Sdarrenr			while (1) {
33145510Sdarrenr				if ((*iocfn)(fd, SIOCIPFGETNEXT, &obj) == -1) {
34145510Sdarrenr					perror("ioctl(SIOCIPFGETNEXT)");
35145510Sdarrenr					break;
36145510Sdarrenr				}
37145510Sdarrenr				if (tu.ipft_cookie == NULL)
38145510Sdarrenr					break;
39145510Sdarrenr
40145510Sdarrenr				tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
41145510Sdarrenr				printtunable(&tu);
42145510Sdarrenr			}
43145510Sdarrenr		} else if ((t = strchr(s, '=')) != NULL) {
44147547Sdarrenr			tu.ipft_cookie = NULL;
45145510Sdarrenr			*t++ = '\0';
46145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
47145510Sdarrenr			if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
48145510Sdarrenr				if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
49145510Sdarrenr					perror("ioctl(SIOCIPFSET)");
50145510Sdarrenr					return;
51145510Sdarrenr				}
52145510Sdarrenr			} else {
53145510Sdarrenr				fprintf(stderr, "invalid value '%s'\n", s);
54145510Sdarrenr				return;
55145510Sdarrenr			}
56145510Sdarrenr		} else {
57147547Sdarrenr			tu.ipft_cookie = NULL;
58145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
59145510Sdarrenr			if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
60145510Sdarrenr				perror("ioctl(SIOCIPFGET)");
61145510Sdarrenr				return;
62145510Sdarrenr			}
63147547Sdarrenr			if (tu.ipft_cookie == NULL) {
64147547Sdarrenr				fprintf(stderr, "Null cookie for %s\n", s);
65145510Sdarrenr				return;
66147547Sdarrenr			}
67145510Sdarrenr
68145510Sdarrenr			tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
69145510Sdarrenr			printtunable(&tu);
70145510Sdarrenr		}
71145510Sdarrenr	}
72145510Sdarrenr}
73