/* * 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; } }
/* * The main function. */ static int main_wrapped(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.op) { case OP_DISPLAY: return pool6_display(); case OP_COUNT: return pool6_count(); case OP_ADD: if (!args.db.pool6.prefix_set) { log_err("Please enter the prefix to be added (--prefix)."); return -EINVAL; } return pool6_add(&args.db.pool6.prefix); case OP_REMOVE: if (!args.db.pool6.prefix_set) { log_err("Please enter the prefix to be removed (--prefix)."); return -EINVAL; } return pool6_remove(&args.db.pool6.prefix, args.db.quick); case OP_FLUSH: return pool6_flush(args.db.quick); default: log_err("Unknown operation for IPv6 pool mode: %u.", args.op); return -EINVAL; } break; case MODE_POOL4: switch (args.op) { case OP_DISPLAY: return pool4_display(); case OP_COUNT: return pool4_count(); case OP_ADD: if (!args.db.pool4.addr_set) { log_err("Please enter the address to be added (--address)."); return -EINVAL; } return pool4_add(&args.db.pool4.addr); case OP_REMOVE: if (!args.db.pool4.addr_set) { log_err("Please enter the address to be removed (--address)."); return -EINVAL; } return pool4_remove(&args.db.pool4.addr, args.db.quick); case OP_FLUSH: return pool4_flush(args.db.quick); default: log_err("Unknown operation for IPv4 pool mode: %u.", args.op); return -EINVAL; } break; case MODE_BIB: switch (args.op) { case OP_DISPLAY: return bib_display(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.numeric_hostname, args.db.tables.csv_format); case OP_COUNT: return bib_count(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp); case OP_ADD: error = 0; if (!args.db.tables.bib.addr6_set) { log_err("Missing IPv6 address#port (--bib6)."); error = -EINVAL; } if (!args.db.tables.bib.addr4_set) { log_err("Missing IPv4 address#port (--bib4)."); error = -EINVAL; } if (error) return error; return bib_add(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, &args.db.tables.bib.addr6, &args.db.tables.bib.addr4); case OP_REMOVE: if (!args.db.tables.bib.addr6_set && !args.db.tables.bib.addr4_set) { log_err("I need the IPv4 transport address and/or the IPv6 transport address of " "the entry you want to remove."); return -EINVAL; } return bib_remove(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.bib.addr6_set, &args.db.tables.bib.addr6, args.db.tables.bib.addr4_set, &args.db.tables.bib.addr4); default: log_err("Unknown operation for session mode: %u.", args.op); return -EINVAL; } break; case MODE_SESSION: switch (args.op) { case OP_DISPLAY: return session_display(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp, args.db.tables.numeric_hostname, args.db.tables.csv_format); case OP_COUNT: return session_count(args.db.tables.tcp, args.db.tables.udp, args.db.tables.icmp); default: log_err("Unknown operation for session mode: %u.", args.op); return -EINVAL; } break; #ifdef BENCHMARK case MODE_LOGTIME: switch (args.op) { case OP_DISPLAY: return logtime_display(); break; default: log_err("Unknown operation for log time mode: %u.", args.op); break; } break; #endif case MODE_GENERAL: switch (args.op) { case OP_DISPLAY: return general_display(); case OP_UPDATE: error = general_update(args.general.module, args.general.type, args.general.size, args.general.data); free(args.general.data); return error; default: log_err("Unknown operation for general mode: %u.", args.op); return -EINVAL; } } log_err("Unknown configuration mode: %u", args.mode); return -EINVAL; }