1/*
2 * Copyright (C) 1993-2005  by Darren Reed.
3 * See the IPFILTER.LICENCE file for details on licencing.
4 */
5
6#include "ipf.h"
7#include "netinet/ipl.h"
8#include <sys/ioctl.h>
9
10void ipf_dotuning(fd, tuneargs, iocfn)
11int fd;
12char *tuneargs;
13ioctlfunc_t iocfn;
14{
15	ipfobj_t obj;
16	ipftune_t tu;
17	char *s, *t;
18
19	bzero((char *)&tu, sizeof(tu));
20	obj.ipfo_rev = IPFILTER_VERSION;
21	obj.ipfo_size = sizeof(tu);;
22	obj.ipfo_ptr = (void *)&tu;
23	obj.ipfo_type = IPFOBJ_TUNEABLE;
24
25	for (s = strtok(tuneargs, ","); s != NULL; s = strtok(NULL, ",")) {
26		if (!strcmp(s, "list")) {
27			while (1) {
28				if ((*iocfn)(fd, SIOCIPFGETNEXT, &obj) == -1) {
29					perror("ioctl(SIOCIPFGETNEXT)");
30					break;
31				}
32				if (tu.ipft_cookie == NULL)
33					break;
34
35				tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
36				printtunable(&tu);
37			}
38		} else if ((t = strchr(s, '=')) != NULL) {
39			tu.ipft_cookie = NULL;
40			*t++ = '\0';
41			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
42			if (sscanf(t, "%lu", &tu.ipft_vlong) == 1) {
43				if ((*iocfn)(fd, SIOCIPFSET, &obj) == -1) {
44					perror("ioctl(SIOCIPFSET)");
45					return;
46				}
47			} else {
48				fprintf(stderr, "invalid value '%s'\n", s);
49				return;
50			}
51		} else {
52			tu.ipft_cookie = NULL;
53			strncpy(tu.ipft_name, s, sizeof(tu.ipft_name));
54			if ((*iocfn)(fd, SIOCIPFGET, &obj) == -1) {
55				perror("ioctl(SIOCIPFGET)");
56				return;
57			}
58			if (tu.ipft_cookie == NULL) {
59				fprintf(stderr, "Null cookie for %s\n", s);
60				return;
61			}
62
63			tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
64			printtunable(&tu);
65		}
66	}
67}
68