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