/* * The main function. */ int main(int argc, char **argv) { struct arguments args; int error; error = parse_args(argc, argv, &args); if (error) return error; switch (args.mode) { case MODE_POOL6: switch (args.operation) { case OP_DISPLAY: return pool6_display(); case OP_ADD: if (!args.pool6_prefix_set) { log_err(ERR_MISSING_PARAM, "Please enter the prefix to be added (--prefix)."); return -EINVAL; } return pool6_add(&args.pool6_prefix); case OP_REMOVE: if (!args.pool6_prefix_set) { log_err(ERR_MISSING_PARAM, "Please enter the prefix to be removed (--prefix)."); return -EINVAL; } return pool6_remove(&args.pool6_prefix); default: log_err(ERR_UNKNOWN_OP, "Unknown operation for IPv6 pool mode: %u.", args.operation); return -EINVAL; } break; case MODE_POOL4: switch (args.operation) { case OP_DISPLAY: return pool4_display(); case OP_ADD: if (!args.pool4_addr_set) { log_err(ERR_MISSING_PARAM, "Please enter the address to be added (--address)."); return -EINVAL; } return pool4_add(&args.pool4_addr); case OP_REMOVE: if (!args.pool4_addr_set) { log_err(ERR_MISSING_PARAM, "Please enter the address to be removed (--address)."); return -EINVAL; } return pool4_remove(&args.pool4_addr); default: log_err(ERR_UNKNOWN_OP, "Unknown operation for IPv4 pool mode: %u.", args.operation); return -EINVAL; } case MODE_BIB: switch (args.operation) { case OP_DISPLAY: return bib_display(args.tcp, args.udp, args.icmp); default: log_err(ERR_UNKNOWN_OP, "Unknown operation for BIB mode: %u.", args.operation); return -EINVAL; } break; case MODE_SESSION: switch (args.operation) { case OP_DISPLAY: return session_display(args.tcp, args.udp, args.icmp); case OP_ADD: error = 0; if (!args.session_pair6_remote_set) { log_err(ERR_MISSING_PARAM, "Missing remote IPv6 address#port (--remote6)."); error = -EINVAL; } if (!args.session_pair6_local_set) { log_err(ERR_MISSING_PARAM, "Missing local IPv6 address#port (--local6)."); error = -EINVAL; } if (!args.session_pair4_local_set) { log_err(ERR_MISSING_PARAM, "Missing local IPv4 address#port (--local4)."); error = -EINVAL; } if (!args.session_pair4_remote_set) { log_err(ERR_MISSING_PARAM, "Missing remote IPv4 address#port (--remote4)."); error = -EINVAL; } if (error) return error; return session_add(args.tcp, args.udp, args.icmp, &args.session_pair6, &args.session_pair4); case OP_REMOVE: if (args.session_pair6_remote_set && args.session_pair6_local_set) return session_remove_ipv6(args.tcp, args.udp, args.icmp, &args.session_pair6); if (args.session_pair4_remote_set && args.session_pair4_local_set) return session_remove_ipv4(args.tcp, args.udp, args.icmp, &args.session_pair4); log_err(ERR_MISSING_PARAM, "You need to provide both the local and remote nodes' " "address#port, either from the IPv6 or the IPv4 side."); return -EINVAL; default: log_err(ERR_UNKNOWN_OP, "Unknown operation for session mode: %u.", args.operation); return -EINVAL; } break; case MODE_FILTERING: return filtering_request(args.operation, &args.filtering); case MODE_TRANSLATE: error = translate_request(args.operation, &args.translate); if (args.translate.mtu_plateaus) free(args.translate.mtu_plateaus); return error; default: log_err(ERR_EMPTY_COMMAND, "Command seems empty; --help or --usage for info."); return -EINVAL; } }
static void messageForward(MSGPTR pMsg, u_char *msg, int len) { u_short *p ; u_char buff[1024] ; u_char *bbase ; size_t bleng ; size_t cleng = 0 ; /* avoid un-expected length on xlate error */ size_t cstat = 0 ; /* avoid un-expected status on xlate error */ TRACE("messageForward - %04x -> %04x\n", pMsg->orgId, pMsg->newId) ; /* * prepare conversion buffer */ if (len < sizeof(buff) / 2) { bbase = buff ; bleng = sizeof(buff) ; } else { bbase = malloc(len * 2) ; bleng = len * 2 ; } if (bbase == NULL) { WARN("messageForward - cannot prepare conversion buffer\n") ; return ; } /* * translate message (domain names) */ TRACE("messageForward - translate request\n") ; cstat = translate_request(&pMsg->trctx, msg, len, bbase, bleng, &cleng) ; TRACE("messageForward - translated status %d length %d\n", cstat, cleng) ; if (cstat != 0) { /* error on conversion */ WARN("messageForward - translation error %d\n", cstat) ; errorOnRequest(pMsg, msg, len, cstat) ; return ; } if (pMsg->proto == SOCK_DGRAM && cleng > 512) { WARN("messageForward - translation overflow %d\n", cleng) ; errorOnRequest(pMsg, msg, len, 2) ; return ; } /* * forward the request */ p = (u_short *) bbase ; p[0] = htons(pMsg->newId) ; server_forward(NULL, pMsg->proto, bbase, cleng) ; /* * cleanup buffer */ if (bbase != buff) { free(bbase) ; } }