⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 网上下到的一个很详细介绍VPN基础知识的资料
💻 C
📖 第 1 页 / 共 4 页
字号:
			if(alg) {				fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear'  options permitted.\n",					program_name);				exit(1);			}			alg = XF_CLR;			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case 'e':			if(said_opt) {				fprintf(stderr, "%s: Error, EDST parameter redefined:%s, already defined in SA:%s\n",					program_name, optarg, said_opt);				exit (1);			}							if(edst_opt) {				fprintf(stderr, "%s: Error, EDST parameter redefined:%s, already defined as:%s\n",					program_name, optarg, edst_opt);				exit (1);			}							if((error_s = ttoaddr(optarg, 0, address_family, &edst)) != 0) {				if(error_s) {					fprintf(stderr, "%s: Error, %s converting --edst argument:%s\n",						program_name, error_s, optarg);					exit (1);				}			}			edst_opt = optarg;			if(debug) {				addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt));				fprintf(stdout, "edst=%s.\n", ipaddr_txt);			}			break;		case 's':			if(said_opt) {				fprintf(stderr, "%s: Error, SPI parameter redefined:%s, already defined in SA:%s\n",					program_name, optarg, said_opt);				exit (1);			}							if(spi_opt) {				fprintf(stderr, "%s: Error, SPI parameter redefined:%s, already defined as:%s\n",					program_name, optarg, spi_opt);				exit (1);			}							spi = strtoul(optarg, &endptr, 0);			if(!(endptr == optarg + strlen(optarg))) {				fprintf(stderr, "%s: Invalid character in SPI parameter: %s\n",					program_name, optarg);				exit (1);			}			if(spi < 0x100) {				fprintf(stderr, "%s: Illegal reserved spi: %s => 0x%x Must be larger than 0x100.\n",					program_name, optarg, spi);				exit(1);			}			spi_opt = optarg;			break;		case 'p':			if(said_opt) {				fprintf(stderr, "%s: Error, PROTO parameter redefined:%s, already defined in SA:%s\n",					program_name, optarg, said_opt);				exit (1);			}							if(proto_opt) {				fprintf(stderr, "%s: Error, PROTO parameter redefined:%s, already defined as:%s\n",					program_name, optarg, proto_opt);				exit (1);			}			if(!strcmp(optarg, "ah"))				proto = SA_AH;			if(!strcmp(optarg, "esp"))				proto = SA_ESP;			if(!strcmp(optarg, "tun"))				proto = SA_IPIP;			if(!strcmp(optarg, "comp"))				proto = SA_COMP;			if(proto == 0) {				fprintf(stderr, "%s: Invalid PROTO parameter: %s\n",					program_name, optarg);				exit (1);			}			proto_opt = optarg;			break;		case 'a':			if(said_opt) {				fprintf(stderr, "%s: Error, ADDRESS FAMILY parameter redefined:%s, already defined in SA:%s\n",					program_name, optarg, said_opt);				exit (1);			}							if(af_opt) {				fprintf(stderr, "%s: Error, ADDRESS FAMILY parameter redefined:%s, already defined as:%s\n",					program_name, optarg, af_opt);				exit (1);			}			if(strcmp(optarg, "inet") == 0) {				address_family = AF_INET;				/* currently we ensure that all addresses belong to the same address family */				anyaddr(address_family, &dst);				anyaddr(address_family, &edst);				anyaddr(address_family, &src);			}			if(strcmp(optarg, "inet6") == 0) {				address_family = AF_INET6;				/* currently we ensure that all addresses belong to the same address family */				anyaddr(address_family, &dst);				anyaddr(address_family, &edst);				anyaddr(address_family, &src);			}			if((strcmp(optarg, "inet") != 0) && (strcmp(optarg, "inet6") != 0)) {				fprintf(stderr, "%s: Invalid ADDRESS FAMILY parameter: %s.\n",					program_name, optarg);				exit (1);			}			af_opt = optarg;			break;		case 'I':			if(said_opt) {				fprintf(stderr, "%s: Error, SAID parameter redefined:%s, already defined in SA:%s\n",					program_name, optarg, said_opt);				exit (1);			}							if(proto_opt) {				fprintf(stderr, "%s: Error, PROTO parameter redefined in SA:%s, already defined as:%s\n",					program_name, optarg, proto_opt);				exit (1);			}			if(edst_opt) {				fprintf(stderr, "%s: Error, EDST parameter redefined in SA:%s, already defined as:%s\n",					program_name, optarg, edst_opt);				exit (1);			}			if(spi_opt) {				fprintf(stderr, "%s: Error, SPI parameter redefined in SA:%s, already defined as:%s\n",					program_name, optarg, spi_opt);				exit (1);			}			if((error_s = ttosa(optarg, 0, &said)) != NULL) {				fprintf(stderr, "%s: Error, %s converting --sa argument:%s\n",					program_name, error_s, optarg);				exit (1);			}			if(debug) {				satot(&said, 0, ipsaid_txt, sizeof(ipsaid_txt));				fprintf(stdout, "said=%s.\n", ipsaid_txt);			}			/* init the src and dst with the same address family */			if(address_family != addrtypeof(&said.dst)) {				fprintf(stderr, "%s: Error, specified address family (%d) is different that of SAID: %s\n",					program_name, address_family, optarg);				exit (1);			}			anyaddr(address_family, &dst);			anyaddr(address_family, &edst);			anyaddr(address_family, &src);			said_opt = optarg;			break;		case 'A':			if(optarg[0] == '0') {				switch(optarg[1]) {				case 't':				case 'x':				case 's':					break;				default:					fprintf(stderr, "%s: Authentication key must have a '0x', '0t' or '0s' prefix to select the format: %s\n",						program_name, optarg);					exit(1);				}			}			authkeylen = atodata(optarg, 0, NULL, 0);			if(!authkeylen) {				fprintf(stderr, "%s: unknown format or syntax error in authentication key: %s\n",					program_name, optarg);				exit (1);			}			authkey = malloc(authkeylen);			if(authkey == NULL) {				fprintf(stderr, "%s: Memory allocation error.\n", program_name);				exit(1);			}			memset(authkey, 0, authkeylen);			authkeylen = atodata(optarg, 0, authkey, authkeylen);			akey_opt = optarg;			break;		case 'E':			if(optarg[0] == '0') {				switch(optarg[1]) {				case 't':				case 'x':				case 's':					break;				default:					fprintf(stderr, "%s: Encryption key must have a '0x', '0t' or '0s' prefix to select the format: %s\n",						program_name, optarg);					exit(1);				}			}			enckeylen = atodata(optarg, 0, NULL, 0);			if(!enckeylen) {				fprintf(stderr, "%s: unknown format or syntax error in encryption key: %s\n",					program_name, optarg);				exit (1);			}			enckey = malloc(enckeylen);			if(enckey == NULL) {				fprintf(stderr, "%s: Memory allocation error.\n", program_name);				exit(1);			}			memset(enckey, 0, enckeylen);			enckeylen = atodata(optarg, 0, enckey, enckeylen);			ekey_opt = optarg;			break;		case 'w':			replay_window = strtoul(optarg, &endptr, 0);			if(!(endptr == optarg + strlen(optarg))) {				fprintf(stderr, "%s: Invalid character in replay_window parameter: %s\n",					program_name, optarg);				exit (1);			}			if((replay_window < 0x1) || (replay_window > 64)) {				fprintf(stderr, "%s: Failed -- Illegal window size: arg=%s, replay_window=%d, must be 1 <= size <= 64.\n",					program_name, optarg, replay_window);				exit(1);			}			break;		case 'i':			if(optarg[0] == '0') {				switch(optarg[1]) {				case 't':				case 'x':				case 's':					break;				default:					fprintf(stderr, "%s: IV must have a '0x', '0t' or '0s' prefix to select the format, found '%c'.\n",						program_name, optarg[1]);					exit(1);				}			}			ivlen = atodata(optarg, 0, NULL, 0);			if(!ivlen) {				fprintf(stderr, "%s: unknown format or syntax error in IV: %s\n",					program_name, optarg);				exit (1);			}			iv = malloc(ivlen);			if(iv == NULL) {				fprintf(stderr, "%s: Memory allocation error.\n", program_name);				exit(1);			}			memset(iv, 0, ivlen);			ivlen = atodata(optarg, 0, iv, ivlen);			iv_opt = optarg;			break;		case 'D':			if(dst_opt) {				fprintf(stderr, "%s: Error, DST parameter redefined:%s, already defined as:%s\n",					program_name, optarg, dst_opt);				exit (1);			}							if((error_s = ttoaddr(optarg, 0, address_family, &dst)) != 0) {				if(error_s) {					fprintf(stderr, "%s: Error, %s converting --dst argument:%s\n",						program_name, error_s, optarg);					exit (1);				}			}			dst_opt = optarg;			if(debug) {				addrtot(&dst, 0, ipaddr_txt, sizeof(ipaddr_txt));				fprintf(stdout, "dst=%s.\n", ipaddr_txt);			}			break;		case 'S':			if(src_opt) {				fprintf(stderr, "%s: Error, SRC parameter redefined:%s, already defined as:%s\n",					program_name, optarg, src_opt);				exit (1);			}							if((error_s = ttoaddr(optarg, 0, address_family, &src)) != 0) {				if(error_s) {					fprintf(stderr, "%s: Error, %s converting --src argument:%s\n",						program_name, error_s, optarg);					exit (1);				}			}			src_opt = optarg;			if(debug) {				addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt));				fprintf(stdout, "src=%s.\n", ipaddr_txt);			}			break;		case 'h':			usage(program_name, stdout);			exit(0);		case '?':			usage(program_name, stderr);			exit(1);		case 'v':			fprintf(stdout, "%s, %s\n", program_name, spi_c_version);			exit(1);		case '+': /* optionsfrom */			optionsfrom(optarg, &argc, &argv, optind, stderr);			/* no return on error */			break;		default:		}		previous = c;	}	if(debug) {		fprintf(stdout, "All options processed.\n");	}	if(argcount == 1) {		system("cat /proc/net/ipsec_spi");		exit(0);	}	switch(alg) {	case XF_IP4:	case XF_IP6:	case XF_DEL:	case XF_AHHMACMD5:	case XF_AHHMACSHA1:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:	case XF_ESP3DES:	case XF_COMPDEFLATE:		if(!said_opt) {			if(isanyaddr(&edst)) {				fprintf(stderr, "%s: SA destination not specified.\n",					program_name);				exit(1);			}			if(!spi) {				fprintf(stderr, "%s: SA SPI not specified.\n",					program_name);				exit(1);			}			if(!proto) {				fprintf(stderr, "%s: SA PROTO not specified.\n",					program_name);				exit(1);			}			initsaid(&edst, htonl(spi), proto, &said);		} else {			proto = said.proto;			spi = ntohl(said.spi);			edst = said.dst;		}		if((address_family != 0) && (address_family != addrtypeof(&said.dst))) {			fprintf(stderr, "%s: Defined address family and address family of SA missmatch.\n",				program_name);			exit(1);		}		sa_len = satot(&said, 0, sa, sizeof(sa));		if(debug) {			fprintf(stdout, "SA valid.\n");		}		break;	case XF_CLR:		break;	default:		fprintf(stderr, "%s: No action chosen.  See '%s --help' for usage.\n",			program_name, program_name);		exit(1);	}	switch(alg) {	case XF_CLR:	case XF_DEL:	case XF_IP4:	case XF_IP6:	case XF_AHHMACMD5:	case XF_AHHMACSHA1:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:	case XF_ESP3DES:	case XF_COMPDEFLATE:		break;	default:		fprintf(stderr, "%s: No action chosen.  See '%s --help' for usage.\n",			program_name, program_name);		exit(1);	}	if(debug) {		fprintf(stdout, "Algorithm ok.\n");	}	if((pfkey_sock = socket(PF_KEY, SOCK_RAW, PF_KEY_V2) ) < 0) {		fprintf(stderr, "%s: Trouble openning PF_KEY family socket with error: ",			program_name);		switch(errno) {		case ENOENT:			fprintf(stderr, "device does not exist.  See FreeS/WAN installation procedure.\n");			break;		case EACCES:			fprintf(stderr, "access denied.  ");			if(getuid() == 0) {				fprintf(stderr, "Check permissions.  Should be 600.\n");			} else {				fprintf(stderr, "You must be root to open this file.\n");			}			break;		case EUNATCH:			fprintf(stderr, "Netlink not enabled OR KLIPS not loaded.\n");			break;		case ENODEV:			fprintf(stderr, "KLIPS not loaded or enabled.\n");			break;		case EBUSY:			fprintf(stderr, "KLIPS is busy.  Most likely a serious internal error occured in a previous command.  Please report as much detail as possible to development team.\n");			break;		case EINVAL:			fprintf(stderr, "Invalid argument, KLIPS not loaded or check kernel log messages for specifics.\n");			break;		case ENOBUFS:			fprintf(stderr, "No kernel memory to allocate SA.\n");			break;		case ESOCKTNOSUPPORT:			fprintf(stderr, "Algorithm support not available in the kernel.  Please compile in support.\n");			break;		case EEXIST:			fprintf(stderr, "SA already in use.  Delete old one first.\n");			break;		case ENXIO:			fprintf(stderr, "SA does not exist.  Cannot delete.\n");			break;		default:			fprintf(stderr, "Unknown file open error %d.  Please report as much detail as possible to development team.\n", errno);		}		exit(1);	}#ifdef SIGS_FROM_BELOW	{		struct sigaction sig_act;		int sig_act_err;		memset(&sig_act, 0, sizeof(sig_act));		sig_act.sa_handler = pfkey_sig_handler;		sigemptyset(&sig_act.sa_mask);		sig_act.sa_flags = SA_RESTART;		sig_act_err = sigaction(SIGIO, &sig_act, NULL);		if(sig_act_err < 0) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -