ipf_dotuning.c revision 170268
1283514Sarybchik/*	$FreeBSD: head/contrib/ipfilter/lib/ipf_dotuning.c 170268 2007-06-04 02:54:36Z darrenr $	*/
2300607Sarybchik
3283514Sarybchik/*
4283514Sarybchik * Copyright (C) 2003-2005 by Darren Reed.
5283514Sarybchik *
6283514Sarybchik * See the IPFILTER.LICENCE file for details on licencing.
7283514Sarybchik *
8283514Sarybchik * $Id: ipf_dotuning.c,v 1.2.4.3 2006/06/16 17:21:02 darrenr Exp $
9283514Sarybchik */
10283514Sarybchik
11283514Sarybchik#include "ipf.h"
12283514Sarybchik#include "netinet/ipl.h"
13283514Sarybchik#include <sys/ioctl.h>
14283514Sarybchik
15283514Sarybchikvoid ipf_dotuning(fd, tuneargs, iocfn)
16283514Sarybchikint fd;
17283514Sarybchikchar *tuneargs;
18283514Sarybchikioctlfunc_t iocfn;
19283514Sarybchik{
20283514Sarybchik	ipfobj_t obj;
21283514Sarybchik	ipftune_t tu;
22283514Sarybchik	char *s, *t;
23283514Sarybchik
24283514Sarybchik	bzero((char *)&tu, sizeof(tu));
25283514Sarybchik	obj.ipfo_rev = IPFILTER_VERSION;
26283514Sarybchik	obj.ipfo_size = sizeof(tu);;
27283514Sarybchik	obj.ipfo_ptr = (void *)&tu;
28283514Sarybchik	obj.ipfo_type = IPFOBJ_TUNEABLE;
29283514Sarybchik
30283514Sarybchik	for (s = strtok(tuneargs, ","); s != NULL; s = strtok(NULL, ",")) {
31283514Sarybchik		if (!strcmp(s, "list")) {
32283514Sarybchik			while (1) {
33283514Sarybchik				if ((*iocfn)(fd, SIOCIPFGETNEXT, &obj) == -1) {
34283514Sarybchik					perror("ioctl(SIOCIPFGETNEXT)");
35283514Sarybchik					break;
36283514Sarybchik				}
37283514Sarybchik				if (tu.ipft_cookie == NULL)
38283514Sarybchik					break;
39283514Sarybchik
40283514Sarybchik				tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
41283514Sarybchik				printtunable(&tu);
42283514Sarybchik			}
43283514Sarybchik		} else if ((t = strchr(s, '=')) != NULL) {
44283514Sarybchik			tu.ipft_cookie = NULL;
45283514Sarybchik			*t++ = '\0';
46291436Sarybchik			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
47283514Sarybchik			if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
48283514Sarybchik				if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
49283514Sarybchik					perror("ioctl(SIOCIPFSET)");
50283514Sarybchik					return;
51283514Sarybchik				}
52283514Sarybchik			} else {
53283514Sarybchik				fprintf(stderr, "invalid value '%s'\n", s);
54283514Sarybchik				return;
55291436Sarybchik			}
56283514Sarybchik		} else {
57283514Sarybchik			tu.ipft_cookie = NULL;
58283514Sarybchik			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
59283514Sarybchik			if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
60283514Sarybchik				perror("ioctl(SIOCIPFGET)");
61283514Sarybchik				return;
62291436Sarybchik			}
63283514Sarybchik			if (tu.ipft_cookie == NULL) {
64283514Sarybchik				fprintf(stderr, "Null cookie for %s\n", s);
65283514Sarybchik				return;
66291395Sarybchik			}
67283514Sarybchik
68283514Sarybchik			tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
69283514Sarybchik			printtunable(&tu);
70283514Sarybchik		}
71283514Sarybchik	}
72283514Sarybchik}
73283514Sarybchik