1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3170268Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5255332Scy *
6255332Scy * See the IPFILTER.LICENCE file for details on licencing.
7255332Scy *
8255332Scy * $Id$
9255332Scy */
10170268Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145547Sdarrenr#include "netinet/ipl.h"
13145510Sdarrenr#include <sys/ioctl.h>
14145510Sdarrenr
15145510Sdarrenrvoid ipf_dotuning(fd, tuneargs, iocfn)
16255332Scy	int fd;
17255332Scy	char *tuneargs;
18255332Scy	ioctlfunc_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) {
34255332Scy					ipf_perror_fd(fd, iocfn,
35255332Scy						      "ioctl(SIOCIPFGETNEXT)");
36145510Sdarrenr					break;
37145510Sdarrenr				}
38145510Sdarrenr				if (tu.ipft_cookie == NULL)
39145510Sdarrenr					break;
40145510Sdarrenr
41145510Sdarrenr				tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
42145510Sdarrenr				printtunable(&tu);
43145510Sdarrenr			}
44145510Sdarrenr		} else if ((t = strchr(s, '=')) != NULL) {
45147547Sdarrenr			tu.ipft_cookie = NULL;
46145510Sdarrenr			*t++ = '\0';
47145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
48145510Sdarrenr			if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
49145510Sdarrenr				if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
50255332Scy					ipf_perror_fd(fd, iocfn,
51255332Scy						      "ioctl(SIOCIPFSET)");
52145510Sdarrenr					return;
53145510Sdarrenr				}
54145510Sdarrenr			} else {
55145510Sdarrenr				fprintf(stderr, "invalid value '%s'\n", s);
56145510Sdarrenr				return;
57145510Sdarrenr			}
58145510Sdarrenr		} else {
59147547Sdarrenr			tu.ipft_cookie = NULL;
60145510Sdarrenr			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
61145510Sdarrenr			if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
62255332Scy				ipf_perror_fd(fd, iocfn, "ioctl(SIOCIPFGET)");
63145510Sdarrenr				return;
64145510Sdarrenr			}
65147547Sdarrenr			if (tu.ipft_cookie == NULL) {
66147547Sdarrenr				fprintf(stderr, "Null cookie for %s\n", s);
67145510Sdarrenr				return;
68147547Sdarrenr			}
69145510Sdarrenr
70145510Sdarrenr			tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
71145510Sdarrenr			printtunable(&tu);
72145510Sdarrenr		}
73145510Sdarrenr	}
74145510Sdarrenr}
75