예제 #1
0
파일: nat64.c 프로젝트: edygarza/NAT64
/*
 * 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;
	}
}
예제 #2
0
파일: message.c 프로젝트: aosm/bind
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) ;
    }
}