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