diff options
Diffstat (limited to 'rpc/rpc-lib/src')
| -rw-r--r-- | rpc/rpc-lib/src/rpc-transport.c | 441 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpc-transport.h | 2 | 
2 files changed, 4 insertions, 439 deletions
diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c index 57d9b5adcb5..b97ba61bf2b 100644 --- a/rpc/rpc-lib/src/rpc-transport.c +++ b/rpc/rpc-lib/src/rpc-transport.c @@ -42,435 +42,8 @@  #define GF_OPTION_LIST_EMPTY(_opt) (_opt->value[0] == NULL)  #endif -int -__volume_option_value_validate (char *name, -                                data_pair_t *pair, -                                volume_option_t *opt) -{ -	int       i = 0; -	int       ret = -1; -	uint64_t  input_size = 0; -	long long inputll = 0; - -	/* Key is valid, validate the option */ -	switch (opt->type) { -        case GF_OPTION_TYPE_XLATOR: -                break; - -	case GF_OPTION_TYPE_PATH: -	{ -                if (strstr (pair->value->data, "../")) { -                        gf_log (name, GF_LOG_ERROR, -                                "invalid path given '%s'", -                                pair->value->data); -                        ret = -1; -                        goto out; -                } - -                /* Make sure the given path is valid */ -		if (pair->value->data[0] != '/') { -			gf_log (name, GF_LOG_WARNING, -				"option %s %s: '%s' is not an " -				"absolute path name", -				pair->key, pair->value->data, -				pair->value->data); -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_INT: -	{ -		/* Check the range */ -		if (gf_string2longlong (pair->value->data, -					&inputll) != 0) { -			gf_log (name, GF_LOG_ERROR, -				"invalid number format \"%s\" in " -				"\"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if ((opt->min == 0) && (opt->max == 0)) { -			gf_log (name, GF_LOG_DEBUG, -				"no range check required for " -				"'option %s %s'", -				pair->key, pair->value->data); -			ret = 0; -			break; -		} -		if ((inputll < opt->min) || -		    (inputll > opt->max)) { -			gf_log (name, GF_LOG_WARNING, -				"'%lld' in 'option %s %s' is out of " -				"range [%"PRId64" - %"PRId64"]", -				inputll, pair->key, -				pair->value->data, -				opt->min, opt->max); -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_SIZET: -	{ -		/* Check the range */ -		if (gf_string2bytesize (pair->value->data, -					&input_size) != 0) { -			gf_log (name, GF_LOG_ERROR, -				"invalid size format \"%s\" in " -				"\"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if ((opt->min == 0) && (opt->max == 0)) { -			gf_log (name, GF_LOG_DEBUG, -				"no range check required for " -				"'option %s %s'", -				pair->key, pair->value->data); -			ret = 0; -			break; -		} -		if ((input_size < opt->min) || -		    (input_size > opt->max)) { -			gf_log (name, GF_LOG_ERROR, -				"'%"PRId64"' in 'option %s %s' is " -				"out of range [%"PRId64" - %"PRId64"]", -				input_size, pair->key, -				pair->value->data, -				opt->min, opt->max); -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_BOOL: -	{ -		/* Check if the value is one of -		   '0|1|on|off|no|yes|true|false|enable|disable' */ -		gf_boolean_t bool_value; -		if (gf_string2boolean (pair->value->data, -				       &bool_value) != 0) { -			gf_log (name, GF_LOG_ERROR, -				"option %s %s: '%s' is not a valid " -				"boolean value", -				pair->key, pair->value->data, -				pair->value->data); -			goto out; -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_STR: -	{ -		/* Check if the '*str' is valid */ -                if (GF_OPTION_LIST_EMPTY(opt)) { -                        ret = 0; -                        goto out; -                } - -		for (i = 0; (i < ZR_OPTION_MAX_ARRAY_SIZE) && -			     opt->value[i]; i++) { -			if (strcasecmp (opt->value[i], -					pair->value->data) == 0) { -				ret = 0; -				break; -			} -		} - -		if ((i == ZR_OPTION_MAX_ARRAY_SIZE) -		    || ((i < ZR_OPTION_MAX_ARRAY_SIZE) -			&& (!opt->value[i]))) { -			/* enter here only if -			 * 1. reached end of opt->value array and haven't -                         *    validated input -			 *                      OR -			 * 2. valid input list is less than -                         *    ZR_OPTION_MAX_ARRAY_SIZE and input has not -                         *    matched all possible input values. -			 */ -			char given_array[4096] = {0,}; -			for (i = 0; (i < ZR_OPTION_MAX_ARRAY_SIZE) && -				     opt->value[i];) { -				strcat (given_array, opt->value[i]); -                                if(((++i) < ZR_OPTION_MAX_ARRAY_SIZE) && -                                   (opt->value[i])) -				        strcat (given_array, ", "); -                                else -                                        strcat (given_array, "."); -			} - -			gf_log (name, GF_LOG_ERROR, -				"option %s %s: '%s' is not valid " -				"(possible options are %s)", -				pair->key, pair->value->data, -				pair->value->data, given_array); - -			goto out; -		} -	} -	break; -	case GF_OPTION_TYPE_PERCENT: -	{ -		uint32_t percent = 0; - - -		/* Check if the value is valid percentage */ -		if (gf_string2percent (pair->value->data, -				       &percent) != 0) { -			gf_log (name, GF_LOG_ERROR, -				"invalid percent format \"%s\" " -				"in \"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if ((percent < 0) || (percent > 100)) { -			gf_log (name, GF_LOG_ERROR, -				"'%d' in 'option %s %s' is out of " -				"range [0 - 100]", -				percent, pair->key, -				pair->value->data); -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_PERCENT_OR_SIZET: -	{ -		uint32_t percent = 0; -		uint64_t input_size = 0; - -		/* Check if the value is valid percentage */ -		if (gf_string2percent (pair->value->data, -				       &percent) == 0) { -			if (percent > 100) { -				gf_log (name, GF_LOG_DEBUG, -					"value given was greater than 100, " -					"assuming this is actually a size"); -		        if (gf_string2bytesize (pair->value->data, -				                &input_size) == 0) { -				        /* Check the range */ -				if ((opt->min == 0) && -                                            (opt->max == 0)) { -				        gf_log (name, GF_LOG_DEBUG, -				        "no range check " -                                                        "required for " -					"'option %s %s'", -				pair->key, -                                                        pair->value->data); -						// It is a size -			                        ret = 0; -				                goto out; -				} -			if ((input_size < opt->min) || -				            (input_size > opt->max)) { -				        gf_log (name, GF_LOG_ERROR, -				        "'%"PRId64"' in " -                                                        "'option %s %s' is out" -					" of range [%"PRId64"" -                                                        "- %"PRId64"]", -				input_size, pair->key, -				pair->value->data, -				                opt->min, opt->max); -				} -					// It is a size -					ret = 0; -					goto out; -				} else { -					// It's not a percent or size -					gf_log (name, GF_LOG_ERROR, -					"invalid number format \"%s\" " -					"in \"option %s\"", -					pair->value->data, pair->key); -				} - -			} -			// It is a percent -			ret = 0; -			goto out; -		} else { -		        if (gf_string2bytesize (pair->value->data, -				        &input_size) == 0) { -			        /* Check the range */ -			if ((opt->min == 0) && (opt->max == 0)) { -			        gf_log (name, GF_LOG_DEBUG, -				        "no range check required for " -					"'option %s %s'", -			pair->key, pair->value->data); -					// It is a size -		                        ret = 0; -				        goto out; -			} -		        if ((input_size < opt->min) || -			            (input_size > opt->max)) { -					gf_log (name, GF_LOG_ERROR, -				        "'%"PRId64"' in 'option %s %s'" -                                                " is out of range [%"PRId64" -" -                                                " %"PRId64"]", -			input_size, pair->key, -			pair->value->data, -			                opt->min, opt->max); -				} -			} else { -				// It's not a percent or size -				gf_log (name, GF_LOG_ERROR, -					"invalid number format \"%s\" " -					"in \"option %s\"", -					pair->value->data, pair->key); -			} -			//It is a size -                        ret = 0; -		        goto out; -		} -	} -	break; -	case GF_OPTION_TYPE_TIME: -	{ -		uint32_t input_time = 0; - -		/* Check if the value is valid percentage */ -		if (gf_string2time (pair->value->data, -				    &input_time) != 0) { -			gf_log (name, -				GF_LOG_ERROR, -				"invalid time format \"%s\" in " -				"\"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if ((opt->min == 0) && (opt->max == 0)) { -			gf_log (name, GF_LOG_DEBUG, -				"no range check required for " -				"'option %s %s'", -				pair->key, pair->value->data); -			ret = 0; -			goto out; -		} -		if ((input_time < opt->min) || -		    (input_time > opt->max)) { -			gf_log (name, GF_LOG_ERROR, -				"'%"PRIu32"' in 'option %s %s' is " -				"out of range [%"PRId64" - %"PRId64"]", -				input_time, pair->key, -				pair->value->data, -				opt->min, opt->max); -		} -		ret = 0; -	} -	break; -	case GF_OPTION_TYPE_DOUBLE: -	{ -		double input_time = 0.0; - -		/* Check if the value is valid double */ -		if (gf_string2double (pair->value->data, -				      &input_time) != 0) { -			gf_log (name, -				GF_LOG_ERROR, -				"invalid time format \"%s\" in \"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if (input_time < 0.0) { -			gf_log (name, -				GF_LOG_ERROR, -				"invalid time format \"%s\" in \"option %s\"", -				pair->value->data, pair->key); -			goto out; -		} - -		if ((opt->min == 0) && (opt->max == 0)) { -			gf_log (name, GF_LOG_DEBUG, -				"no range check required for 'option %s %s'", -				pair->key, pair->value->data); -			ret = 0; -			goto out; -		} -		ret = 0; -	} -	break; -        case GF_OPTION_TYPE_INTERNET_ADDRESS: -        { -                if (!valid_internet_address (pair->value->data)) { -			gf_log (name, GF_LOG_ERROR, -			        "internet address '%s' does not conform to" -				"standards.", pair->value->data); -                } -                ret = 0; -	} -        break; -	case GF_OPTION_TYPE_ANY: -		/* NO CHECK */ -		ret = 0; -		break; -	} - -out: -	return ret; -} - -/* FIXME: this procedure should be removed from transport */  int -validate_volume_options (char *name, dict_t *options, volume_option_t *opt) -{ -	int i = 0; -	int ret = -1; -	int index = 0; -	volume_option_t *trav  = NULL; -	data_pair_t     *pairs = NULL; - -	if (!opt) { -		ret = 0; -		goto out; -	} - -	/* First search for not supported options, if any report error */ -	pairs = options->members_list; -	while (pairs) { -		ret = -1; -		for (index = 0; -		     opt[index].key && opt[index].key[0] ; index++) { -			trav = &(opt[index]); -			for (i = 0 ; -			     (i < ZR_VOLUME_MAX_NUM_KEY) && -				     trav->key[i]; i++) { -				/* Check if the key is valid */ -				if (fnmatch (trav->key[i], -					     pairs->key, FNM_NOESCAPE) == 0) { -					ret = 0; -					break; -				} -			} -			if (!ret) { -				if (i) { -					gf_log (name, GF_LOG_WARNING, -						"option '%s' is deprecated, " -						"preferred is '%s', continuing" -						" with correction", -						trav->key[i], trav->key[0]); -					/* TODO: some bytes lost */ -					pairs->key = gf_strdup (trav->key[0]); -				} -				break; -			} -		} -		if (!ret) { -			ret = __volume_option_value_validate (name, pairs, trav); -			if (-1 == ret) { -				goto out; -			} -		} - -		pairs = pairs->next; -	} - -	ret = 0; - out: -	return ret; -} - -int32_t  rpc_transport_get_myaddr (rpc_transport_t *this, char *peeraddr, int addrlen,                            struct sockaddr_storage *sa, size_t salen)  { @@ -731,11 +304,10 @@ rpc_transport_load (glusterfs_ctx_t *ctx, dict_t *options, char *trans_name)  		gf_log ("rpc-transport", GF_LOG_DEBUG,  			"volume option validation not specified");  	} else { -                /* FIXME: is adding really needed? */ -		/* list_add_tail (&vol_opt->list, &xl->volume_options); */ -		if (-1 == -		    validate_volume_options (trans_name, options, -                                             vol_opt->given_opt)) { +                INIT_LIST_HEAD (&vol_opt->list); +		list_add_tail (&vol_opt->list, &(THIS->volume_options)); +                if (xlator_options_validate_list (THIS, options, vol_opt, +                                                  NULL)) {  			gf_log ("rpc-transport", GF_LOG_ERROR,  				"volume option validation failed");  			goto fail; @@ -760,7 +332,6 @@ rpc_transport_load (glusterfs_ctx_t *ctx, dict_t *options, char *trans_name)                  GF_FREE (name);          } -        GF_FREE (vol_opt);  	return return_trans;  fail: @@ -772,10 +343,6 @@ fail:                  GF_FREE (trans);          } -        if (vol_opt) { -                GF_FREE (vol_opt); -        } -          if (name) {                  GF_FREE (name);          } diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h index 42b36afd2d9..e3fb1712848 100644 --- a/rpc/rpc-lib/src/rpc-transport.h +++ b/rpc/rpc-lib/src/rpc-transport.h @@ -203,8 +203,6 @@ struct rpc_transport {  	data_t                    *buf;   	int32_t                  (*init)   (rpc_transport_t *this);  	void                     (*fini)   (rpc_transport_t *this); -        int32_t                  (*validate_options) (rpc_transport_t *this, -                                                      char **op_errstr);          int                      (*reconfigure) (rpc_transport_t *this, dict_t *options);          rpc_transport_notify_t     notify;          void                      *notify_data;  | 
