示例#1
0
/*
 * Check that the optional printf format in description matches
 * the type of the magic.
 */
static int check_format(RMagic *ms, struct r_magic *m) {
	char *ptr;

	for (ptr = m->desc; *ptr; ptr++)
		if (*ptr == '%')
			break;
	if (*ptr == '\0') {
		/* No format string; ok */
		return 1;
	}

	if (file_nformats != file_nnames) {
		return -1;
	}		

	if (m->type >= file_nformats) {
		file_magwarn(ms, "Internal error inconsistency between "
		    "m->type and format strings");
		return -1;
	}
	if (magic_file_formats[m->type] == FILE_FMT_NONE) {
		file_magwarn(ms, "No format string for `%s' with description "
		    "`%s'", m->desc, magic_file_names[m->type]);
		return -1;
	}

	ptr++;
	if (ptr && check_format_type(ptr, magic_file_formats[m->type]) == -1) {
		/*
		 * TODO: this error message is unhelpful if the format
		 * string is not one character long
		 */
		file_magwarn(ms, "Printf format `%c' is not valid for type "
		    "`%s' in description `%s'",
		    ptr && *ptr ? *ptr : '?',
		    magic_file_names[m->type], m->desc);
		return -1;
	}

	for (; *ptr; ptr++) {
		if (*ptr == '%') {
			file_magwarn (ms,
			    "Too many format strings (should have at most one) "
			    "for `%s' with description `%s'",
			    magic_file_names[m->type], m->desc);
			return -1;
		}
	}
	return 0;
}
示例#2
0
    void MetaEntryVisitor::check_format(std::map<std::string, std::string> & value) const
    {
        // It must contain an ID, Number, Type and Description
        check_key_is_present(FORMAT, ID, value.count(ID));
        check_key_is_present(FORMAT, NUMBER, value.count(NUMBER));
        check_key_is_present(FORMAT, TYPE, value.count(TYPE));
        check_key_is_present(FORMAT, DESCRIPTION, value.count(DESCRIPTION));
        
        check_format_or_info_number(value[NUMBER], FORMAT);
        check_format_type(value[TYPE]);

        if (entry.source->version == Version::v41 || entry.source->version == Version::v42) {
            check_predefined_tag(FORMAT, NUMBER, value, format_v41_v42);
            check_predefined_tag(FORMAT, TYPE, value, format_v41_v42);
        } else {
            check_predefined_tag(FORMAT, NUMBER, value, format_v43);
            check_predefined_tag(FORMAT, TYPE, value, format_v43);
        }
    }
示例#3
0
static int      check_command_line(struct modbus_params_t *params, int argc, char **argv)
{
	(void)argc;

#if LIBMODBUS_VERSION_MAJOR >= 3
	if (params->host == NULL && params->serial == NULL && params->file == NULL) {
		ERR("Not provided or unable to parse host address/serial port name/filename: %s\n",
			argv[0]);
		return RESULT_WRONG_ARG;
	};
#else
	if (params->host == NULL && params->file == NULL) {
		ERR("Not provided or unable to parse host address or filename: %s\n", argv[0]);
		return RESULT_WRONG_ARG;
	};
#endif

#if LIBMODBUS_VERSION_MAJOR >= 3
	if (params->serial != NULL) {
		if (params->serial_mode != MODBUS_RTU_RS232 && params->serial_mode != MODBUS_RTU_RS485)	{
			ERR("%s: Invalid value of serial port mode parameter!\n", argv[0]);
			return RESULT_WRONG_ARG;
		}
		if (check_serial_parity(params->serial_parity)) {
			ERR("%s: Invalid value of serial port parity mode parameter!\n", argv[0]);
			return RESULT_WRONG_ARG;
		}
		if (params->serial_data_bits < 5 || params->serial_data_bits > 8) {
			ERR("%s: Invalid value of serial port mode data length parameter!\n", argv[0]);
			return RESULT_WRONG_ARG;
		}
		if (params->serial_stop_bits < 1 || params->serial_stop_bits > 2) {
			ERR("%s: Invalid value of serial port stop bits parameter!\n", argv[0]);
			return RESULT_WRONG_ARG;
		}
	}
#endif
	if (params->perf_data && (params->perf_label == NULL)) {
		ERR("Label parameter is required, when performance data is enabled\n");
		return RESULT_WRONG_ARG;
	}

	if (params->dump_size > 127) {
		ERR("The maximal number of registers in one dump is 127\n");
		return RESULT_WRONG_ARG;
	}


	if (check_swap_inverse(params))
		return RESULT_WRONG_ARG;

	if (check_function_num(params))
		return RESULT_WRONG_ARG;

	if (check_format_type(params))
		return RESULT_WRONG_ARG;

	if (check_source(params))
		return RESULT_WRONG_ARG;

	if (check_dump_param(params))
		return RESULT_WRONG_ARG;

	if (dbg_chk_level(DBG_INFO))
		print_settings(stdout, params);

	return RESULT_OK;
}