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

📄 spi.c

📁 FREESWAN VPN源代码包
💻 C
📖 第 1 页 / 共 5 页
字号:
					++pfkey_seq,					getpid()))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		return(1);	}	if((error = pfkey_msg_build(&pfkey_msg, extensions, EXT_BITS_IN))) {		fprintf(stderr, "%s: Trouble building pfkey message, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		return(1);	}	if(write(pfkey_sock, pfkey_msg,		 pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) !=	   pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) {		/* cleanup code here */		fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name);		pfkey_extensions_free(extensions);		pfkey_msg_free(&pfkey_msg);		return(1);	}	pfkey_extensions_free(extensions);	pfkey_msg_free(&pfkey_msg);		return(0);}static struct option const longopts[] ={	{"ah", 1, 0, 'H'},	{"esp", 1, 0, 'P'},	{"comp", 1, 0, 'Z'},	{"ip4", 0, 0, '4'},	{"ip6", 0, 0, '6'},	{"del", 0, 0, 'd'},	{"authkey", 1, 0, 'A'},	{"enckey", 1, 0, 'E'},	{"edst", 1, 0, 'e'},	{"spi", 1, 0, 's'},	{"proto", 1, 0, 'p'},	{"af", 1, 0, 'a'},	{"replay_window", 1, 0, 'w'},	{"iv", 1, 0, 'i'},	{"dst", 1, 0, 'D'},	{"src", 1, 0, 'S'},	{"said", 1, 0, 'I'},	{"help", 0, 0, 'h'},	{"version", 0, 0, 'v'},	{"clear", 0, 0, 'c'},	{"label", 1, 0, 'l'},	{"debug", 0, 0, 'g'},	{"optionsfrom", 1, 0, '+'},	{"life", 1, 0, 'f'},	{0, 0, 0, 0}};intmain(int argc, char *argv[]){	char *endptr;	__u32 spi = 0;	int c, previous = -1;/*	int ret; */	ip_said said;	size_t sa_len;	const char* error_s;	char ipaddr_txt[ADDRTOT_BUF];	char ipsaid_txt[SATOT_BUF];	int error = 0;	int argcount = argc;	unsigned char authalg, encryptalg;	struct sadb_ext *extensions[SADB_EXT_MAX + 1];	struct sadb_msg *pfkey_msg;	char *iv_opt, *akey_opt, *ekey_opt, *alg_opt, *edst_opt, *spi_opt, *proto_opt, *af_opt, *said_opt, *dst_opt, *src_opt;#if 0	ip_address pfkey_address_p_ska;	ip_address pfkey_ident_s_ska;	ip_address pfkey_ident_d_ska;#endif	uint32_t life[life_maxsever][life_maxtype];	char *life_opt[life_maxsever][life_maxtype];		program_name = argv[0];	memset(&said, 0, sizeof(said));	iv_opt = akey_opt = ekey_opt = alg_opt = edst_opt = spi_opt = proto_opt = af_opt = said_opt = dst_opt = src_opt = NULL;	{		int i,j;		for(i = 0; i < life_maxsever; i++) {			for(j = 0; j < life_maxtype; j++) {				life_opt[i][j] = NULL;				life[i][j] = 0;			}		}	}	while((c = getopt_long(argc, argv, ""/*"H:P:Z:46dcA:E:e:s:a:w:i:D:S:hvgl:+:f:"*/, longopts, 0)) != EOF) {		switch(c) {		case 'g':			debug = 1;			pfkey_lib_debug = 1;			argcount--;			break;		case 'l':			program_name = malloc(strlen(argv[0])					      + 10 /* update this when changing the sprintf() */					      + strlen(optarg));			sprintf(program_name, "%s --label %s",				argv[0],				optarg);			argcount -= 2;			break;		case 'H':			if(alg) {				fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear'  options permitted.\n",					program_name);				exit(1);			}			if       (!strcmp(optarg, "hmac-md5-96")) {				alg = XF_AHHMACMD5;			} else if(!strcmp(optarg, "hmac-sha1-96")) {				alg = XF_AHHMACSHA1;			} else {				fprintf(stderr, "%s: Unknown authentication algorithm '%s' follows '--ah' option.\n",					program_name, optarg);				exit(1);			}			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case 'P':			if(alg) {				fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear'  options permitted.\n",					program_name);				exit(1);			}			if       (!strcmp(optarg, "3des-md5-96")) {				alg = XF_ESP3DESMD596;			} else if(!strcmp(optarg, "3des-sha1-96")) {				alg = XF_ESP3DESSHA196;			} else if(!strcmp(optarg, "3des")) {				alg = XF_ESP3DES;#ifndef NO_KERNEL_ALG			} else if((alg_info=alg_info_esp_create_from_str(optarg, &alg_err))) {				int esp_ealg_id, esp_aalg_id;				alg = XF_OTHER_ALG;				if (alg_info->alg_info_cnt>1) {					fprintf(stderr, "%s: Invalid encryption algorithm '%s' "						"follows '--esp' option: lead too many(%d) "						"transforms\n",						program_name, optarg, alg_info->alg_info_cnt);					exit(1);				}				alg_string=optarg;				esp_info=&alg_info->esp[0];				if (debug) {					fprintf(stdout, "%s: alg_info: cnt=%d ealg[0]=%d aalg[0]=%d\n",						program_name, 						alg_info->alg_info_cnt,						esp_info->encryptalg,						esp_info->authalg);				}				esp_ealg_id=esp_info->esp_ealg_id;				esp_aalg_id=esp_info->esp_aalg_id;				if (kernel_alg_proc_read()==0) {					proc_read_ok++;					if (!kernel_alg_esp_enc_ok(esp_ealg_id, 0, 0))					{						fprintf(stderr, "%s: ESP encryptalg=%d (\"%s\") "								"not present\n",							program_name,							esp_ealg_id,							enum_name(&esp_transformid_names, esp_ealg_id));						exit(1);					}					if (!kernel_alg_esp_auth_ok(esp_aalg_id, 0))					{						fprintf(stderr, "%s: ESP authalg=%d (\"%s\")"								"not present\n",							program_name,							esp_aalg_id,							enum_name(&auth_alg_names, esp_aalg_id));						exit(1);					}				}#endif /* NO_KERNEL_ALG */			} else {				fprintf(stderr, "%s: Invalid encryption algorithm '%s' follows '--esp' option.\n",					program_name, optarg);				exit(1);			}			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case 'Z':			if(alg) {				fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear'  options permitted.\n",					program_name);				exit(1);			}			if       (!strcmp(optarg, "deflate")) {				alg = XF_COMPDEFLATE;			} else {				fprintf(stderr, "%s: Unknown compression algorithm '%s' follows '--comp' option.\n",					program_name, optarg);				exit(1);			}			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case '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_IP4;			address_family = AF_INET;			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case '6':			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_IP6;			address_family = AF_INET6;			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case 'd':			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_DEL;			if(debug) {				fprintf(stdout, "Algorithm %d selected.\n", alg);			}			alg_opt = optarg;			break;		case 'c':			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);			}			error_s = ttoaddr(optarg, 0, address_family, &edst);			if(error_s != NULL) {				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);			}			error_s = ttosa(optarg, 0, &said);			if(error_s != 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 == 0) {				address_family = addrtypeof(&said.dst);			} else 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);			}

⌨️ 快捷键说明

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