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