| 81 | } |
| 82 | |
| 83 | int check_cmd(const struct cmd_param *params, action_elem_t *elems) |
| 84 | { |
| 85 | int i; |
| 86 | const struct cmd_param *param; |
| 87 | pv_elem_t *pve; |
| 88 | |
| 89 | for (param=params, i=1; param->flags; param++, i++) { |
| 90 | pve = NULL; |
| 91 | |
| 92 | if (elems[i].type == NOSUBTYPE || elems[i].type == NULLV_ST) { |
| 93 | if (!(param->flags & CMD_PARAM_OPT)) { |
| 94 | LM_BUG("Mandatory parameter missing\n"); |
| 95 | return -1; |
| 96 | } else { |
| 97 | continue; |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | if (param->flags & CMD_PARAM_INT) { |
| 102 | if (elems[i].type != NUMBER_ST && elems[i].type != SCRIPTVAR_ST) { |
| 103 | LM_ERR("Param [%d] expected to be an integer or variable\n", i); |
| 104 | return -1; |
| 105 | } |
| 106 | } else if (param->flags & CMD_PARAM_STR) { |
| 107 | if (elems[i].type == STR_ST) { |
| 108 | if (!(param->flags & CMD_PARAM_NO_EXPAND) && |
| 109 | pv_parse_format(&elems[i].u.s, &pve) < 0) { |
| 110 | LM_ERR("Failed to parse formatted string in param " |
| 111 | "[%d]\n",i); |
| 112 | return -1; |
| 113 | } |
| 114 | |
| 115 | if ((!(param->flags & CMD_PARAM_NO_EXPAND) && |
| 116 | (pve->next || pve->spec.type != PVT_NONE)) && |
| 117 | (param->flags & CMD_PARAM_STATIC)) { |
| 118 | LM_ERR("Param [%d] does not support formatted strings\n",i); |
| 119 | return -1; |
| 120 | } |
| 121 | |
| 122 | if (pve) |
| 123 | pv_elem_free_all(pve); |
| 124 | } else if (elems[i].type == SCRIPTVAR_ST) { |
| 125 | if (param->flags & CMD_PARAM_STATIC) { |
| 126 | LM_ERR("Param [%d] does not support variables\n",i); |
| 127 | return -1; |
| 128 | } |
| 129 | } else { |
| 130 | LM_ERR("Param [%d] expected to be a string or variable\n", i); |
| 131 | return -1; |
| 132 | } |
| 133 | } else if (param->flags & CMD_PARAM_VAR) { |
| 134 | if (elems[i].type != SCRIPTVAR_ST) { |
| 135 | LM_ERR("Param [%d] expected to be a variable\n",i); |
| 136 | return -1; |
| 137 | } |
| 138 | } else if (param->flags & CMD_PARAM_REGEX) { |
| 139 | if (elems[i].type != STR_ST && elems[i].type != SCRIPTVAR_ST) { |
| 140 | LM_ERR("Param [%d] expected to be an integer or variable\n", i); |
no test coverage detected