[Netadm-devel] gwc/gwclib confproc.c,1.8,1.9
Status: Beta
Brought to you by:
linuxpark
From: linuxpark <lin...@us...> - 2006-03-01 03:20:28
|
Update of /cvsroot/netadm/gwc/gwclib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23465/gwclib Modified Files: confproc.c Log Message: ADD: complete add_fc_pol, del_fc_pol Index: confproc.c =================================================================== RCS file: /cvsroot/netadm/gwc/gwclib/confproc.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** confproc.c 28 Feb 2006 23:41:50 -0000 1.8 --- confproc.c 1 Mar 2006 03:20:20 -0000 1.9 *************** *** 120,124 **** }; ! sys_strmap_t map_fc_polrule [] = { { "fc", FC_PR_CONTROL }, { "mh", FC_PR_MOD_HEADER }, --- 120,124 ---- }; ! sys_strmap_t map_fc_rule [] = { { "fc", FC_PR_CONTROL }, { "mh", FC_PR_MOD_HEADER }, *************** *** 2783,2787 **** n += 1 + sprintf(&fr->p[n], "%s", csm->fc_pol[i].fw); n += 1 + sprintf(&fr->p[n], "%s", ! mapidtostr(map_fc_polrule, csm->fc_pol[i].rule)); } --- 2783,2787 ---- n += 1 + sprintf(&fr->p[n], "%s", csm->fc_pol[i].fw); n += 1 + sprintf(&fr->p[n], "%s", ! mapidtostr(map_fc_rule, csm->fc_pol[i].rule)); } *************** *** 2793,2879 **** add_fc_pol(int argc, char *argv[], int modify, frp_t fr) { ! fc_net_t fwcnet; ! fc_net_t *net; int slot = -1; int i; ! if (argc == 5) { ! if (csm->fc_net_cnt < MAXSHM_FC_NET) { ! net = &fwcnet; } else { frerr(fr, RET_EINTERNAL, ! "FC Network buffer full, Max network is limited to %d\n",MAXSHM_FC_NET); return; } if (!str_nospace(argv[0])) ! frerr(fr, RET_EUSAGE,"[FC/Network name] cannot contain spaces\n"); else if (strlen(argv[0]) == 0) ! frerr(fr, RET_EUSAGE, "You must enter [Network name]\n"); ! else if (strlen(argv[0]) >= sizeof(net->name)) ! frerr(fr, RET_EUSAGE, "Max Length of the [Network name] is %d\n", ! sizeof(net->name) - 1); else ! strcpy(net->name, argv[0]); ! for (i = 0; i < csm->fc_net_cnt; i++) { ! if (!strcmp(csm->fc_net[i].name, argv[0])) { ! frerr(fr, RET_ENOTUNIQ, ! "[FC/Network name] \"%s\" already exists\n", argv[0]); ! } ! } ! if ((net->type = mapstrtoid(map_nettype, argv[1])) == -1) ! frerrmap(fr, RET_EUSAGE, "Type", map_nettype); ! if (!str_inetaddr(argv[2], ! (net->type == SYS_NT_HOST) ? TRUE : FALSE)) ! frerr(fr, RET_EUSAGE, ! "Invalid [IP address] \"%s\" entered\n", argv[2]); ! else if ((net->net.addr.s_addr = inet_addr(argv[2])) == (in_addr_t)(-1)) { ! frerr(fr, RET_EUSAGE, "Invalid [IP address] \"%s\" entered\n", argv[2]); ! } ! if (!str_isdigit(argv[3])) { ! frerr(fr, RET_EUSAGE, ! "[Netmask] must be valid number between 0 and 32\n"); ! } ! else { ! net->net.mask = atoi(argv[3]); ! if (net->type == SYS_NT_HOST && net->net.mask != 32) ! frerr(fr, RET_EUSAGE, "[Netmask] must be 32 with host type\n"); ! if (net->net.mask > 32 ) ! frerr(fr, RET_EUSAGE, "[Netmask] must be between 0 and 32\n"); ! } if (!str_nospace(argv[4])) ! frerr(fr, RET_EUSAGE, "[Interface name] cannot contain spaces\n"); ! else if (strlen(argv[4]) >= sizeof(net->net_if)) ! frerr(fr, RET_EUSAGE, ! "Max Length of the [Interface name] is %d\n", ! sizeof(net->net_if) - 1); else ! strcpy(net->net_if,argv[4]); if (fr->ret != RET_OK) return; ! for (i = 0; i < csm->fc_net_cnt; i++) { if (i == slot) continue; ! if (net->net.addr.s_addr != csm->fc_net[i].net.addr.s_addr) continue; ! if (net->net.mask != csm->fc_net[i].net.mask) continue; ! if (strcmp(net->net_if, csm->fc_net[i].net_if)) continue; frerr(fr, RET_ENOTUNIQ, ! "%s: Same Host/Network already defined as %s\n", ! net->name, csm->fc_net[i].name); } ! for (slot = 0, i = 0; i < csm->fc_net_cnt; i++) { ! if (strcasecmp(csm->fc_net[i].name, net->name) < 0) { slot = i + 1; } --- 2793,2944 ---- add_fc_pol(int argc, char *argv[], int modify, frp_t fr) { ! fc_pol_t fwcpol; ! fc_pol_t *pol; int slot = -1; int i; ! if (argc == 8) { ! if (csm->fc_pol_cnt < MAXSHM_FC_POL) { ! pol = &fwcpol; } else { frerr(fr, RET_EINTERNAL, ! "FC policy buffer full, Max policy is limited to %d\n",MAXSHM_FC_POL); return; } + if (!str_nospace(argv[0])) ! frerr(fr, RET_EUSAGE,"[FC/policy name] cannot contain spaces\n"); else if (strlen(argv[0]) == 0) ! frerr(fr, RET_EUSAGE, "You must enter [FC/policy name]\n"); ! else if (strlen(argv[0]) >= sizeof(pol->name)) ! frerr(fr, RET_EUSAGE, "Max Length of the [FC/policy name] is %d\n", ! sizeof(pol->name) - 1); else ! strcpy(pol->name, argv[0]); ! if ( !sys_ucmd_msg (_CMD_GET_FC_POL, argv[0], strlen(argv[0]))) ! frerr(fr, RET_ENOTUNIQ, ! "[FC/Network name] \"%s\" does not exists\n", argv[0]); ! if ((pol->enable = mapstrtoid(map_truefalse, argv[1])) == -1) ! frerrmap(fr, RET_EUSAGE, "Enable", map_truefalse); ! /* snet */ ! if (!str_nospace(argv[2])) ! frerr(fr, RET_EUSAGE,"[FC/source network name] cannot contain spaces\n"); ! else if (strlen(argv[2]) == 0) ! frerr(fr, RET_EUSAGE, "You must enter [FC/source network name]\n"); ! else if (strlen(argv[2]) >= sizeof(pol->snet)) ! frerr(fr, RET_EUSAGE, "Max Length of the [FC/source network name] is %d\n", ! sizeof(pol->snet) - 1); ! else ! strcpy(pol->snet, argv[2]); ! if ( !sys_ucmd_msg (_CMD_GET_FC_NET, argv[2], strlen(argv[2]))) ! frerr(fr, RET_ENOTUNIQ, ! "[FC/source network name] \"%s\" does not exists\n", argv[2]); + /* ssvc */ + if (!str_nospace(argv[3])) + frerr(fr, RET_EUSAGE,"[FC/source service protocol name] cannot contain spaces\n"); + else if (strlen(argv[3]) == 0) + frerr(fr, RET_EUSAGE, "You must enter [FC/source service protocol name]\n"); + else if (strlen(argv[3]) >= sizeof(pol->ssvc)) + frerr(fr, RET_EUSAGE, "Max Length of the [FC/source service protocol name] is " + "%d\n", sizeof(pol->ssvc) - 1); + else + strcpy(pol->ssvc, argv[3]); + + if ( !sys_ucmd_msg (_CMD_GET_FC_SVC, argv[3], strlen(argv[3]))) + frerr(fr, RET_ENOTUNIQ, + "[FC/source service protocol name] \"%s\" does not exists\n", argv[3]); + + /* dnet */ if (!str_nospace(argv[4])) ! frerr(fr, RET_EUSAGE,"[FC/destination network name] cannot contain spaces\n"); ! else if (strlen(argv[4]) == 0) ! frerr(fr, RET_EUSAGE, "You must enter [FC/destination network name]\n"); ! else if (strlen(argv[4]) >= sizeof(pol->dnet)) ! frerr(fr, RET_EUSAGE, "Max Length of the [FC/destination network name] is %d\n", ! sizeof(pol->dnet) - 1); ! else ! strcpy(pol->dnet, argv[4]); + if ( !sys_ucmd_msg (_CMD_GET_FC_NET, argv[4], strlen(argv[4]))) + frerr(fr, RET_ENOTUNIQ, + "[FC/destination network name] \"%s\" does not exists\n", argv[4]); + + /* dsvc */ + if (!str_nospace(argv[5])) + frerr(fr, RET_EUSAGE,"[FC/destination service protocol name] cannot contain spaces\n"); + else if (strlen(argv[5]) == 0) + frerr(fr, RET_EUSAGE, "You must enter [FC/destination service protocol name]\n"); + else if (strlen(argv[5]) >= sizeof(pol->ssvc)) + frerr(fr, RET_EUSAGE, "Max Length of the [FC/destination service protocol name]" + "is %d\n", sizeof(pol->dsvc) - 1); else ! strcpy(pol->dsvc, argv[5]); ! ! if ( !sys_ucmd_msg (_CMD_GET_FC_SVC, argv[5], strlen(argv[5]))) ! frerr(fr, RET_ENOTUNIQ, ! "[FC/destination service protocol name] \"%s\" does not exists\n",argv[5]); + /* fw */ + if (!str_nospace(argv[6])) + frerr(fr, RET_EUSAGE,"[FC/flow control name] cannot contain spaces\n"); + else if (strlen(argv[6]) == 0) + frerr(fr, RET_EUSAGE, "You must enter [FC/flow control name]\n"); + else if (strlen(argv[6]) >= sizeof(pol->fw)) + frerr(fr, RET_EUSAGE, "Max Length of the [FC/flow control name] is %d\n", + sizeof(pol->fw) - 1); + else + strcpy(pol->fw, argv[6]); + + if ( !sys_ucmd_msg (_CMD_GET_FC_FW, argv[6], strlen(argv[6]))) + frerr(fr, RET_ENOTUNIQ, + "[FC/flow control name] \"%s\" does not exists\n", argv[6]); + + if ((pol->rule = mapstrtoid(map_fc_rule, argv[7])) == -1) + frerrmap(fr, RET_EUSAGE, "Rule", map_fc_rule); + + if (fr->ret != RET_OK) return; ! for (i = 0; i < csm->fc_pol_cnt; i++) { if (i == slot) continue; ! ! if (strcmp(pol->snet, csm->fc_pol[i].snet)) continue; ! if (strcmp(pol->ssvc, csm->fc_pol[i].ssvc)) continue; ! if (strcmp(pol->dnet, csm->fc_pol[i].dnet)) continue; + if (strcmp(pol->dsvc, csm->fc_pol[i].dsvc)) + continue; + /* + * FIXME: if only fw is different in a policy, we have to decide more low + * whether in pf or fc_apply + */ + if (strcmp(pol->fw, csm->fc_pol[i].fw)) + continue; + #if 0 + /* + * FIXME: if only rule is different in a policy, we have to decide more low + * whether in pf or fc_apply + * or ignore + */ + if (strcmp(pol->rule, csm->fc_pol[i].rule)) + continue; + #endif frerr(fr, RET_ENOTUNIQ, ! "%s: Same FC/policy already defined as %s\n", ! pol->name, csm->fc_pol[i].name); } ! for (slot = 0, i = 0; i < csm->fc_pol_cnt; i++) { ! if (strcasecmp(csm->fc_pol[i].name, pol->name) < 0) { slot = i + 1; } *************** *** 2883,2893 **** } ! if (slot < csm->fc_net_cnt) { ! memmove(&csm->fc_net[slot + 1], ! &csm->fc_net[slot], ! sizeof(fc_net_t) * (csm->fc_net_cnt - slot)); } ! memcpy(&csm->fc_net[slot], net, sizeof(fc_net_t)); ! csm->fc_net_cnt++; if (modify != CBFROM_SYSTEM) { --- 2948,2958 ---- } ! if (slot < csm->fc_pol_cnt) { ! memmove(&csm->fc_pol[slot + 1], ! &csm->fc_pol[slot], ! sizeof(fc_pol_t) * (csm->fc_pol_cnt - slot)); } ! memcpy(&csm->fc_pol[slot], pol, sizeof(fc_pol_t)); ! csm->fc_pol_cnt++; if (modify != CBFROM_SYSTEM) { *************** *** 2900,2904 **** else { frerr(fr, RET_EUSAGE, ! "Usage: [FC/Network name] [Type:\"net\"|\"host\"] "); } } --- 2965,2972 ---- else { frerr(fr, RET_EUSAGE, ! "Usage: [FC/policy name] [enable: \"true\"|\"false\"] [source network name] " ! "[source service protocol name] [destination network name]" ! "[destination service protocol name] [flow control name] " ! "[rule: \"fc\"|\"mh\"]"); } } *************** *** 2907,2911 **** --- 2975,3019 ---- del_fc_pol(int argc, char *argv[], int modify, frp_t fr) { + fc_pol_t *pol = NULL; + int i; + int slot; + + if (argc == 1) { + for (i = 0; i < csm->fc_pol_cnt; i++) { + if (!strcmp(csm->fc_pol[i].name, argv[0])) { + pol = &csm->fc_pol[i]; + slot = i; + break; + } + } + + if (pol == NULL) { + frerr(fr, RET_ENOTFOUND, + "[FC/policy name] \"%s\" does not exist\n", argv[0]); + return; + } + + if (fr->ret != RET_OK) + return; + + if (slot < (csm->fc_pol_cnt - 1)) { + memcpy(&csm->fc_pol[slot], &csm->fc_pol[slot + 1], + sizeof(fc_pol_t) * (csm->fc_pol_cnt - slot - 1)); + } + memset(&csm->fc_pol[csm->fc_pol_cnt - 1], 0, sizeof(fc_pol_t)); + csm->fc_pol_cnt--; + + if (modify != CBFROM_SYSTEM) { + if ((fr->ret = saveconf(csm)) != RET_OK) { + frerr(fr, fr->ret, + "Cannot save configuration (%d)\n", fr->ret); + return; + } + } + } + else { + frerr(fr, RET_EUSAGE, "Usage: [FC/policy name]\n"); + } } |