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