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

📄 readconf.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 C
📖 第 1 页 / 共 3 页
字号:
	case oIdentitiesOnly:		intptr = &options->identities_only;		goto parse_flag;	case oServerAliveInterval:		intptr = &options->server_alive_interval;		goto parse_time;	case oServerAliveCountMax:		intptr = &options->server_alive_count_max;		goto parse_int;	case oSendEnv:		while ((arg = strdelim(&s)) != NULL && *arg != '\0') {			if (strchr(arg, '=') != NULL)				fatal("%s line %d: Invalid environment name.",				    filename, linenum);			if (!*activep)				continue;			if (options->num_send_env >= MAX_SEND_ENV)				fatal("%s line %d: too many send env.",				    filename, linenum);			options->send_env[options->num_send_env++] =			    xstrdup(arg);		}		break;	case oControlPath:		charptr = &options->control_path;		goto parse_string;	case oControlMaster:		intptr = &options->control_master;		goto parse_yesnoask;	case oHashKnownHosts:		intptr = &options->hash_known_hosts;		goto parse_flag;	case oDeprecated:		debug("%s line %d: Deprecated option \"%s\"",		    filename, linenum, keyword);		return 0;	case oUnsupported:		error("%s line %d: Unsupported option \"%s\"",		    filename, linenum, keyword);		return 0;	default:		fatal("process_config_line: Unimplemented opcode %d", opcode);	}	/* Check that there is no garbage at end of line. */	if ((arg = strdelim(&s)) != NULL && *arg != '\0') {		fatal("%.200s line %d: garbage at end of line; \"%.200s\".",		     filename, linenum, arg);	}	return 0;}/* * Reads the config file and modifies the options accordingly.  Options * should already be initialized before this call.  This never returns if * there is an error.  If the file does not exist, this returns 0. */intread_config_file(const char *filename, const char *host, Options *options,    int checkperm){	FILE *f;	char line[1024];	int active, linenum;	int bad_options = 0;	/* Open the file. */	if ((f = fopen(filename, "r")) == NULL)		return 0;	if (checkperm) {		struct stat sb;		if (fstat(fileno(f), &sb) == -1)			fatal("fstat %s: %s", filename, strerror(errno));		if (((sb.st_uid != 0 && sb.st_uid != getuid()) ||		    (sb.st_mode & 022) != 0))			fatal("Bad owner or permissions on %s", filename);	}	debug("Reading configuration data %.200s", filename);	/*	 * Mark that we are now processing the options.  This flag is turned	 * on/off by Host specifications.	 */	active = 1;	linenum = 0;	while (fgets(line, sizeof(line), f)) {		/* Update line number counter. */		linenum++;		if (process_config_line(options, host, line, filename, linenum, &active) != 0)			bad_options++;	}	fclose(f);	if (bad_options > 0)		fatal("%s: terminating, %d bad configuration options",		    filename, bad_options);	return 1;}/* * Initializes options to special values that indicate that they have not yet * been set.  Read_config_file will only set options with this value. Options * are processed in the following order: command line, user config file, * system config file.  Last, fill_default_options is called. */voidinitialize_options(Options * options){	memset(options, 'X', sizeof(*options));	options->forward_agent = -1;	options->forward_x11 = -1;	options->forward_x11_trusted = -1;	options->xauth_location = NULL;	options->gateway_ports = -1;	options->use_privileged_port = -1;	options->rsa_authentication = -1;	options->pubkey_authentication = -1;	options->challenge_response_authentication = -1;	options->gss_authentication = -1;	options->gss_deleg_creds = -1;	options->password_authentication = -1;	options->kbd_interactive_authentication = -1;	options->kbd_interactive_devices = NULL;	options->rhosts_rsa_authentication = -1;	options->hostbased_authentication = -1;	options->batch_mode = -1;	options->check_host_ip = -1;	options->strict_host_key_checking = -1;	options->compression = -1;	options->tcp_keep_alive = -1;	options->compression_level = -1;	options->port = -1;	options->address_family = -1;	options->connection_attempts = -1;	options->connection_timeout = -1;	options->number_of_password_prompts = -1;	options->cipher = -1;	options->ciphers = NULL;	options->macs = NULL;	options->hostkeyalgorithms = NULL;	options->protocol = SSH_PROTO_UNKNOWN;	options->num_identity_files = 0;	options->hostname = NULL;	options->host_key_alias = NULL;	options->proxy_command = NULL;	options->user = NULL;	options->escape_char = -1;	options->system_hostfile = NULL;	options->user_hostfile = NULL;	options->system_hostfile2 = NULL;	options->user_hostfile2 = NULL;	options->num_local_forwards = 0;	options->num_remote_forwards = 0;	options->clear_forwardings = -1;	options->log_level = SYSLOG_LEVEL_NOT_SET;	options->preferred_authentications = NULL;	options->bind_address = NULL;	options->smartcard_device = NULL;	options->enable_ssh_keysign = - 1;	options->no_host_authentication_for_localhost = - 1;	options->identities_only = - 1;	options->rekey_limit = - 1;	options->verify_host_key_dns = -1;	options->server_alive_interval = -1;	options->server_alive_count_max = -1;	options->num_send_env = 0;	options->control_path = NULL;	options->control_master = -1;	options->hash_known_hosts = -1;}/* * Called after processing other sources of option data, this fills those * options for which no value has been specified with their default values. */voidfill_default_options(Options * options){	int len;	if (options->forward_agent == -1)		options->forward_agent = 0;	if (options->forward_x11 == -1)		options->forward_x11 = 0;	if (options->forward_x11_trusted == -1)		options->forward_x11_trusted = 0;	if (options->xauth_location == NULL)		options->xauth_location = _PATH_XAUTH;	if (options->gateway_ports == -1)		options->gateway_ports = 0;	if (options->use_privileged_port == -1)		options->use_privileged_port = 0;	if (options->rsa_authentication == -1)		options->rsa_authentication = 1;	if (options->pubkey_authentication == -1)		options->pubkey_authentication = 1;	if (options->challenge_response_authentication == -1)		options->challenge_response_authentication = 1;	if (options->gss_authentication == -1)		options->gss_authentication = 0;	if (options->gss_deleg_creds == -1)		options->gss_deleg_creds = 0;	if (options->password_authentication == -1)		options->password_authentication = 1;	if (options->kbd_interactive_authentication == -1)		options->kbd_interactive_authentication = 1;	if (options->rhosts_rsa_authentication == -1)		options->rhosts_rsa_authentication = 0;	if (options->hostbased_authentication == -1)		options->hostbased_authentication = 0;	if (options->batch_mode == -1)		options->batch_mode = 0;	if (options->check_host_ip == -1)		options->check_host_ip = 1;	if (options->strict_host_key_checking == -1)		options->strict_host_key_checking = 2;	/* 2 is default */	if (options->compression == -1)		options->compression = 0;	if (options->tcp_keep_alive == -1)		options->tcp_keep_alive = 1;	if (options->compression_level == -1)		options->compression_level = 6;	if (options->port == -1)		options->port = 0;	/* Filled in ssh_connect. */	if (options->address_family == -1)		options->address_family = AF_UNSPEC;	if (options->connection_attempts == -1)		options->connection_attempts = 1;	if (options->number_of_password_prompts == -1)		options->number_of_password_prompts = 3;	/* Selected in ssh_login(). */	if (options->cipher == -1)		options->cipher = SSH_CIPHER_NOT_SET;	/* options->ciphers, default set in myproposals.h */	/* options->macs, default set in myproposals.h */	/* options->hostkeyalgorithms, default set in myproposals.h */	if (options->protocol == SSH_PROTO_UNKNOWN)		options->protocol = SSH_PROTO_1|SSH_PROTO_2;	if (options->num_identity_files == 0) {		if (options->protocol & SSH_PROTO_1) {			len = 2 + strlen(_PATH_SSH_CLIENT_IDENTITY) + 1;			options->identity_files[options->num_identity_files] =			    xmalloc(len);			snprintf(options->identity_files[options->num_identity_files++],			    len, "~/%.100s", _PATH_SSH_CLIENT_IDENTITY);		}		if (options->protocol & SSH_PROTO_2) {			len = 2 + strlen(_PATH_SSH_CLIENT_ID_RSA) + 1;			options->identity_files[options->num_identity_files] =			    xmalloc(len);			snprintf(options->identity_files[options->num_identity_files++],			    len, "~/%.100s", _PATH_SSH_CLIENT_ID_RSA);			len = 2 + strlen(_PATH_SSH_CLIENT_ID_DSA) + 1;			options->identity_files[options->num_identity_files] =			    xmalloc(len);			snprintf(options->identity_files[options->num_identity_files++],			    len, "~/%.100s", _PATH_SSH_CLIENT_ID_DSA);		}	}	if (options->escape_char == -1)		options->escape_char = '~';	if (options->system_hostfile == NULL)		options->system_hostfile = _PATH_SSH_SYSTEM_HOSTFILE;	if (options->user_hostfile == NULL)		options->user_hostfile = _PATH_SSH_USER_HOSTFILE;	if (options->system_hostfile2 == NULL)		options->system_hostfile2 = _PATH_SSH_SYSTEM_HOSTFILE2;	if (options->user_hostfile2 == NULL)		options->user_hostfile2 = _PATH_SSH_USER_HOSTFILE2;	if (options->log_level == SYSLOG_LEVEL_NOT_SET)		options->log_level = SYSLOG_LEVEL_INFO;	if (options->clear_forwardings == 1)		clear_forwardings(options);	if (options->no_host_authentication_for_localhost == - 1)		options->no_host_authentication_for_localhost = 0;	if (options->identities_only == -1)		options->identities_only = 0;	if (options->enable_ssh_keysign == -1)		options->enable_ssh_keysign = 0;	if (options->rekey_limit == -1)		options->rekey_limit = 0;	if (options->verify_host_key_dns == -1)		options->verify_host_key_dns = 0;	if (options->server_alive_interval == -1)		options->server_alive_interval = 0;	if (options->server_alive_count_max == -1)		options->server_alive_count_max = 3;	if (options->control_master == -1)		options->control_master = 0;	if (options->hash_known_hosts == -1)		options->hash_known_hosts = 0;	/* options->proxy_command should not be set by default */	/* options->user will be set in the main program if appropriate */	/* options->hostname will be set in the main program if appropriate */	/* options->host_key_alias should not be set by default */	/* options->preferred_authentications will be set in ssh */}/* * parse_forward * parses a string containing a port forwarding specification of the form: *	[listenhost:]listenport:connecthost:connectport * returns number of arguments parsed or zero on error */intparse_forward(Forward *fwd, const char *fwdspec){	int i;	char *p, *cp, *fwdarg[4];	memset(fwd, '\0', sizeof(*fwd));	cp = p = xstrdup(fwdspec);	/* skip leading spaces */	while (*cp && isspace(*cp))		cp++;	for (i = 0; i < 4; ++i)		if ((fwdarg[i] = hpdelim(&cp)) == NULL)			break;	/* Check for trailing garbage in 4-arg case*/	if (cp != NULL)		i = 0;	/* failure */	switch (i) {	case 3:		fwd->listen_host = NULL;		fwd->listen_port = a2port(fwdarg[0]);		fwd->connect_host = xstrdup(cleanhostname(fwdarg[1]));		fwd->connect_port = a2port(fwdarg[2]);		break;	case 4:		fwd->listen_host = xstrdup(cleanhostname(fwdarg[0]));		fwd->listen_port = a2port(fwdarg[1]);		fwd->connect_host = xstrdup(cleanhostname(fwdarg[2]));		fwd->connect_port = a2port(fwdarg[3]);		break;	default:		i = 0; /* failure */	}	xfree(p);	if (fwd->listen_port == 0 && fwd->connect_port == 0)		goto fail_free;	if (fwd->connect_host != NULL &&	    strlen(fwd->connect_host) >= NI_MAXHOST)		goto fail_free;	return (i); fail_free:	if (fwd->connect_host != NULL)		xfree(fwd->connect_host);	if (fwd->listen_host != NULL)		xfree(fwd->listen_host);	return (0);}

⌨️ 快捷键说明

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