Example #1
0
/*
 * 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;
	}
}
Example #2
0
File: jool.c Project: npowern/NAT64
/*
 * 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;
}