diff options
Diffstat (limited to 'src/lib/libcrypto/engine/eng_ctrl.c')
| -rw-r--r-- | src/lib/libcrypto/engine/eng_ctrl.c | 313 |
1 files changed, 151 insertions, 162 deletions
diff --git a/src/lib/libcrypto/engine/eng_ctrl.c b/src/lib/libcrypto/engine/eng_ctrl.c index d5017e2329..67a724202b 100644 --- a/src/lib/libcrypto/engine/eng_ctrl.c +++ b/src/lib/libcrypto/engine/eng_ctrl.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * are met: | 7 | * are met: |
| 8 | * | 8 | * |
| 9 | * 1. Redistributions of source code must retain the above copyright | 9 | * 1. Redistributions of source code must retain the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer. | 10 | * notice, this list of conditions and the following disclaimer. |
| 11 | * | 11 | * |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer in | 13 | * notice, this list of conditions and the following disclaimer in |
| @@ -63,95 +63,92 @@ static const char *int_no_description = ""; | |||
| 63 | * ENGINE in question has asked us to take care of it (ie. the ENGINE did not | 63 | * ENGINE in question has asked us to take care of it (ie. the ENGINE did not |
| 64 | * set the ENGINE_FLAGS_MANUAL_CMD_CTRL flag. */ | 64 | * set the ENGINE_FLAGS_MANUAL_CMD_CTRL flag. */ |
| 65 | 65 | ||
| 66 | static int int_ctrl_cmd_is_null(const ENGINE_CMD_DEFN *defn) | 66 | static int |
| 67 | { | 67 | int_ctrl_cmd_is_null(const ENGINE_CMD_DEFN *defn) |
| 68 | if((defn->cmd_num == 0) || (defn->cmd_name == NULL)) | 68 | { |
| 69 | if ((defn->cmd_num == 0) || (defn->cmd_name == NULL)) | ||
| 69 | return 1; | 70 | return 1; |
| 70 | return 0; | 71 | return 0; |
| 71 | } | 72 | } |
| 72 | 73 | ||
| 73 | static int int_ctrl_cmd_by_name(const ENGINE_CMD_DEFN *defn, const char *s) | 74 | static int |
| 74 | { | 75 | int_ctrl_cmd_by_name(const ENGINE_CMD_DEFN *defn, const char *s) |
| 76 | { | ||
| 75 | int idx = 0; | 77 | int idx = 0; |
| 76 | while(!int_ctrl_cmd_is_null(defn) && (strcmp(defn->cmd_name, s) != 0)) | 78 | while (!int_ctrl_cmd_is_null(defn) && |
| 77 | { | 79 | (strcmp(defn->cmd_name, s) != 0)) { |
| 78 | idx++; | 80 | idx++; |
| 79 | defn++; | 81 | defn++; |
| 80 | } | 82 | } |
| 81 | if(int_ctrl_cmd_is_null(defn)) | 83 | if (int_ctrl_cmd_is_null(defn)) |
| 82 | /* The given name wasn't found */ | 84 | /* The given name wasn't found */ |
| 83 | return -1; | 85 | return -1; |
| 84 | return idx; | 86 | return idx; |
| 85 | } | 87 | } |
| 86 | 88 | ||
| 87 | static int int_ctrl_cmd_by_num(const ENGINE_CMD_DEFN *defn, unsigned int num) | 89 | static int |
| 88 | { | 90 | int_ctrl_cmd_by_num(const ENGINE_CMD_DEFN *defn, unsigned int num) |
| 91 | { | ||
| 89 | int idx = 0; | 92 | int idx = 0; |
| 90 | /* NB: It is stipulated that 'cmd_defn' lists are ordered by cmd_num. So | 93 | /* NB: It is stipulated that 'cmd_defn' lists are ordered by cmd_num. So |
| 91 | * our searches don't need to take any longer than necessary. */ | 94 | * our searches don't need to take any longer than necessary. */ |
| 92 | while(!int_ctrl_cmd_is_null(defn) && (defn->cmd_num < num)) | 95 | while (!int_ctrl_cmd_is_null(defn) && (defn->cmd_num < num)) { |
| 93 | { | ||
| 94 | idx++; | 96 | idx++; |
| 95 | defn++; | 97 | defn++; |
| 96 | } | 98 | } |
| 97 | if(defn->cmd_num == num) | 99 | if (defn->cmd_num == num) |
| 98 | return idx; | 100 | return idx; |
| 99 | /* The given cmd_num wasn't found */ | 101 | /* The given cmd_num wasn't found */ |
| 100 | return -1; | 102 | return -1; |
| 101 | } | 103 | } |
| 102 | 104 | ||
| 103 | static int int_ctrl_helper(ENGINE *e, int cmd, long i, void *p, | 105 | static int |
| 104 | void (*f)(void)) | 106 | int_ctrl_helper(ENGINE *e, int cmd, long i, void *p, void (*f)(void)) |
| 105 | { | 107 | { |
| 106 | int idx; | 108 | int idx; |
| 107 | int ret; | 109 | int ret; |
| 108 | char *s = (char *)p; | 110 | char *s = (char *)p; |
| 111 | |||
| 109 | /* Take care of the easy one first (eg. it requires no searches) */ | 112 | /* Take care of the easy one first (eg. it requires no searches) */ |
| 110 | if(cmd == ENGINE_CTRL_GET_FIRST_CMD_TYPE) | 113 | if (cmd == ENGINE_CTRL_GET_FIRST_CMD_TYPE) { |
| 111 | { | 114 | if ((e->cmd_defns == NULL) || |
| 112 | if((e->cmd_defns == NULL) || int_ctrl_cmd_is_null(e->cmd_defns)) | 115 | int_ctrl_cmd_is_null(e->cmd_defns)) |
| 113 | return 0; | 116 | return 0; |
| 114 | return e->cmd_defns->cmd_num; | 117 | return e->cmd_defns->cmd_num; |
| 115 | } | 118 | } |
| 116 | /* One or two commands require that "p" be a valid string buffer */ | 119 | /* One or two commands require that "p" be a valid string buffer */ |
| 117 | if((cmd == ENGINE_CTRL_GET_CMD_FROM_NAME) || | 120 | if ((cmd == ENGINE_CTRL_GET_CMD_FROM_NAME) || |
| 118 | (cmd == ENGINE_CTRL_GET_NAME_FROM_CMD) || | 121 | (cmd == ENGINE_CTRL_GET_NAME_FROM_CMD) || |
| 119 | (cmd == ENGINE_CTRL_GET_DESC_FROM_CMD)) | 122 | (cmd == ENGINE_CTRL_GET_DESC_FROM_CMD)) { |
| 120 | { | 123 | if (s == NULL) { |
| 121 | if(s == NULL) | ||
| 122 | { | ||
| 123 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, | 124 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, |
| 124 | ERR_R_PASSED_NULL_PARAMETER); | 125 | ERR_R_PASSED_NULL_PARAMETER); |
| 125 | return -1; | 126 | return -1; |
| 126 | } | ||
| 127 | } | 127 | } |
| 128 | } | ||
| 128 | /* Now handle cmd_name -> cmd_num conversion */ | 129 | /* Now handle cmd_name -> cmd_num conversion */ |
| 129 | if(cmd == ENGINE_CTRL_GET_CMD_FROM_NAME) | 130 | if (cmd == ENGINE_CTRL_GET_CMD_FROM_NAME) { |
| 130 | { | 131 | if ((e->cmd_defns == NULL) || |
| 131 | if((e->cmd_defns == NULL) || ((idx = int_ctrl_cmd_by_name( | 132 | ((idx = int_ctrl_cmd_by_name(e->cmd_defns, s)) < 0)) { |
| 132 | e->cmd_defns, s)) < 0)) | ||
| 133 | { | ||
| 134 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, | 133 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, |
| 135 | ENGINE_R_INVALID_CMD_NAME); | 134 | ENGINE_R_INVALID_CMD_NAME); |
| 136 | return -1; | 135 | return -1; |
| 137 | } | ||
| 138 | return e->cmd_defns[idx].cmd_num; | ||
| 139 | } | 136 | } |
| 137 | return e->cmd_defns[idx].cmd_num; | ||
| 138 | } | ||
| 140 | /* For the rest of the commands, the 'long' argument must specify a | 139 | /* For the rest of the commands, the 'long' argument must specify a |
| 141 | * valie command number - so we need to conduct a search. */ | 140 | * valie command number - so we need to conduct a search. */ |
| 142 | if((e->cmd_defns == NULL) || ((idx = int_ctrl_cmd_by_num(e->cmd_defns, | 141 | if ((e->cmd_defns == NULL) || |
| 143 | (unsigned int)i)) < 0)) | 142 | ((idx = int_ctrl_cmd_by_num(e->cmd_defns, (unsigned int)i)) < 0)) { |
| 144 | { | ||
| 145 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, | 143 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, |
| 146 | ENGINE_R_INVALID_CMD_NUMBER); | 144 | ENGINE_R_INVALID_CMD_NUMBER); |
| 147 | return -1; | 145 | return -1; |
| 148 | } | 146 | } |
| 149 | /* Now the logic splits depending on command type */ | 147 | /* Now the logic splits depending on command type */ |
| 150 | switch(cmd) | 148 | switch (cmd) { |
| 151 | { | ||
| 152 | case ENGINE_CTRL_GET_NEXT_CMD_TYPE: | 149 | case ENGINE_CTRL_GET_NEXT_CMD_TYPE: |
| 153 | idx++; | 150 | idx++; |
| 154 | if(int_ctrl_cmd_is_null(e->cmd_defns + idx)) | 151 | if (int_ctrl_cmd_is_null(e->cmd_defns + idx)) |
| 155 | /* end-of-list */ | 152 | /* end-of-list */ |
| 156 | return 0; | 153 | return 0; |
| 157 | else | 154 | else |
| @@ -159,17 +156,17 @@ static int int_ctrl_helper(ENGINE *e, int cmd, long i, void *p, | |||
| 159 | case ENGINE_CTRL_GET_NAME_LEN_FROM_CMD: | 156 | case ENGINE_CTRL_GET_NAME_LEN_FROM_CMD: |
| 160 | return strlen(e->cmd_defns[idx].cmd_name); | 157 | return strlen(e->cmd_defns[idx].cmd_name); |
| 161 | case ENGINE_CTRL_GET_NAME_FROM_CMD: | 158 | case ENGINE_CTRL_GET_NAME_FROM_CMD: |
| 162 | ret = snprintf(s,strlen(e->cmd_defns[idx].cmd_name) + 1, | 159 | ret = snprintf(s, strlen(e->cmd_defns[idx].cmd_name) + 1, |
| 163 | "%s", e->cmd_defns[idx].cmd_name); | 160 | "%s", e->cmd_defns[idx].cmd_name); |
| 164 | if (ret >= (strlen(e->cmd_defns[idx].cmd_name) + 1)) | 161 | if (ret >= (strlen(e->cmd_defns[idx].cmd_name) + 1)) |
| 165 | ret = -1; | 162 | ret = -1; |
| 166 | return ret; | 163 | return ret; |
| 167 | case ENGINE_CTRL_GET_DESC_LEN_FROM_CMD: | 164 | case ENGINE_CTRL_GET_DESC_LEN_FROM_CMD: |
| 168 | if(e->cmd_defns[idx].cmd_desc) | 165 | if (e->cmd_defns[idx].cmd_desc) |
| 169 | return strlen(e->cmd_defns[idx].cmd_desc); | 166 | return strlen(e->cmd_defns[idx].cmd_desc); |
| 170 | return strlen(int_no_description); | 167 | return strlen(int_no_description); |
| 171 | case ENGINE_CTRL_GET_DESC_FROM_CMD: | 168 | case ENGINE_CTRL_GET_DESC_FROM_CMD: |
| 172 | if(e->cmd_defns[idx].cmd_desc) { | 169 | if (e->cmd_defns[idx].cmd_desc) { |
| 173 | ret = snprintf(s, | 170 | ret = snprintf(s, |
| 174 | strlen(e->cmd_defns[idx].cmd_desc) + 1, | 171 | strlen(e->cmd_defns[idx].cmd_desc) + 1, |
| 175 | "%s", e->cmd_defns[idx].cmd_desc); | 172 | "%s", e->cmd_defns[idx].cmd_desc); |
| @@ -177,40 +174,40 @@ static int int_ctrl_helper(ENGINE *e, int cmd, long i, void *p, | |||
| 177 | ret = -1; | 174 | ret = -1; |
| 178 | return ret; | 175 | return ret; |
| 179 | } | 176 | } |
| 180 | ret = snprintf(s, strlen(int_no_description) + 1,"%s", | 177 | ret = snprintf(s, strlen(int_no_description) + 1, "%s", |
| 181 | int_no_description); | 178 | int_no_description); |
| 182 | if (ret >= strlen(int_no_description) + 1) | 179 | if (ret >= strlen(int_no_description) + 1) |
| 183 | ret = -1; | 180 | ret = -1; |
| 184 | return ret; | 181 | return ret; |
| 185 | case ENGINE_CTRL_GET_CMD_FLAGS: | 182 | case ENGINE_CTRL_GET_CMD_FLAGS: |
| 186 | return e->cmd_defns[idx].cmd_flags; | 183 | return e->cmd_defns[idx].cmd_flags; |
| 187 | } | 184 | } |
| 185 | |||
| 188 | /* Shouldn't really be here ... */ | 186 | /* Shouldn't really be here ... */ |
| 189 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER,ENGINE_R_INTERNAL_LIST_ERROR); | 187 | ENGINEerr(ENGINE_F_INT_CTRL_HELPER, ENGINE_R_INTERNAL_LIST_ERROR); |
| 190 | return -1; | 188 | return -1; |
| 191 | } | 189 | } |
| 192 | 190 | ||
| 193 | int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)) | 191 | int |
| 194 | { | 192 | ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)) |
| 193 | { | ||
| 195 | int ctrl_exists, ref_exists; | 194 | int ctrl_exists, ref_exists; |
| 196 | if(e == NULL) | 195 | |
| 197 | { | 196 | if (e == NULL) { |
| 198 | ENGINEerr(ENGINE_F_ENGINE_CTRL,ERR_R_PASSED_NULL_PARAMETER); | 197 | ENGINEerr(ENGINE_F_ENGINE_CTRL, ERR_R_PASSED_NULL_PARAMETER); |
| 199 | return 0; | 198 | return 0; |
| 200 | } | 199 | } |
| 201 | CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); | 200 | CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); |
| 202 | ref_exists = ((e->struct_ref > 0) ? 1 : 0); | 201 | ref_exists = ((e->struct_ref > 0) ? 1 : 0); |
| 203 | CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); | 202 | CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); |
| 204 | ctrl_exists = ((e->ctrl == NULL) ? 0 : 1); | 203 | ctrl_exists = ((e->ctrl == NULL) ? 0 : 1); |
| 205 | if(!ref_exists) | 204 | if (!ref_exists) { |
| 206 | { | 205 | ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_NO_REFERENCE); |
| 207 | ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_REFERENCE); | ||
| 208 | return 0; | 206 | return 0; |
| 209 | } | 207 | } |
| 210 | /* Intercept any "root-level" commands before trying to hand them on to | 208 | /* Intercept any "root-level" commands before trying to hand them on to |
| 211 | * ctrl() handlers. */ | 209 | * ctrl() handlers. */ |
| 212 | switch(cmd) | 210 | switch (cmd) { |
| 213 | { | ||
| 214 | case ENGINE_CTRL_HAS_CTRL_FUNCTION: | 211 | case ENGINE_CTRL_HAS_CTRL_FUNCTION: |
| 215 | return ctrl_exists; | 212 | return ctrl_exists; |
| 216 | case ENGINE_CTRL_GET_FIRST_CMD_TYPE: | 213 | case ENGINE_CTRL_GET_FIRST_CMD_TYPE: |
| @@ -221,180 +218,172 @@ int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)) | |||
| 221 | case ENGINE_CTRL_GET_DESC_LEN_FROM_CMD: | 218 | case ENGINE_CTRL_GET_DESC_LEN_FROM_CMD: |
| 222 | case ENGINE_CTRL_GET_DESC_FROM_CMD: | 219 | case ENGINE_CTRL_GET_DESC_FROM_CMD: |
| 223 | case ENGINE_CTRL_GET_CMD_FLAGS: | 220 | case ENGINE_CTRL_GET_CMD_FLAGS: |
| 224 | if(ctrl_exists && !(e->flags & ENGINE_FLAGS_MANUAL_CMD_CTRL)) | 221 | if (ctrl_exists && !(e->flags & ENGINE_FLAGS_MANUAL_CMD_CTRL)) |
| 225 | return int_ctrl_helper(e,cmd,i,p,f); | 222 | return int_ctrl_helper(e, cmd, i, p, f); |
| 226 | if(!ctrl_exists) | 223 | if (!ctrl_exists) { |
| 227 | { | 224 | ENGINEerr(ENGINE_F_ENGINE_CTRL, |
| 228 | ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION); | 225 | ENGINE_R_NO_CONTROL_FUNCTION); |
| 229 | /* For these cmd-related functions, failure is indicated | 226 | /* For these cmd-related functions, failure is indicated |
| 230 | * by a -1 return value (because 0 is used as a valid | 227 | * by a -1 return value (because 0 is used as a valid |
| 231 | * return in some places). */ | 228 | * return in some places). */ |
| 232 | return -1; | 229 | return -1; |
| 233 | } | 230 | } |
| 234 | default: | 231 | default: |
| 235 | break; | 232 | break; |
| 236 | } | 233 | } |
| 237 | /* Anything else requires a ctrl() handler to exist. */ | 234 | /* Anything else requires a ctrl() handler to exist. */ |
| 238 | if(!ctrl_exists) | 235 | if (!ctrl_exists) { |
| 239 | { | 236 | ENGINEerr(ENGINE_F_ENGINE_CTRL, ENGINE_R_NO_CONTROL_FUNCTION); |
| 240 | ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION); | ||
| 241 | return 0; | 237 | return 0; |
| 242 | } | ||
| 243 | return e->ctrl(e, cmd, i, p, f); | ||
| 244 | } | 238 | } |
| 239 | return e->ctrl(e, cmd, i, p, f); | ||
| 240 | } | ||
| 245 | 241 | ||
| 246 | int ENGINE_cmd_is_executable(ENGINE *e, int cmd) | 242 | int |
| 247 | { | 243 | ENGINE_cmd_is_executable(ENGINE *e, int cmd) |
| 244 | { | ||
| 248 | int flags; | 245 | int flags; |
| 249 | if((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, cmd, NULL, NULL)) < 0) | 246 | |
| 250 | { | 247 | if ((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, cmd, |
| 248 | NULL, NULL)) < 0) { | ||
| 251 | ENGINEerr(ENGINE_F_ENGINE_CMD_IS_EXECUTABLE, | 249 | ENGINEerr(ENGINE_F_ENGINE_CMD_IS_EXECUTABLE, |
| 252 | ENGINE_R_INVALID_CMD_NUMBER); | 250 | ENGINE_R_INVALID_CMD_NUMBER); |
| 253 | return 0; | 251 | return 0; |
| 254 | } | 252 | } |
| 255 | if(!(flags & ENGINE_CMD_FLAG_NO_INPUT) && | 253 | if (!(flags & ENGINE_CMD_FLAG_NO_INPUT) && |
| 256 | !(flags & ENGINE_CMD_FLAG_NUMERIC) && | 254 | !(flags & ENGINE_CMD_FLAG_NUMERIC) && |
| 257 | !(flags & ENGINE_CMD_FLAG_STRING)) | 255 | !(flags & ENGINE_CMD_FLAG_STRING)) |
| 258 | return 0; | 256 | return 0; |
| 259 | return 1; | 257 | return 1; |
| 260 | } | 258 | } |
| 261 | 259 | ||
| 262 | int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, | 260 | int |
| 263 | long i, void *p, void (*f)(void), int cmd_optional) | 261 | ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, long i, void *p, |
| 264 | { | 262 | void (*f)(void), int cmd_optional) |
| 263 | { | ||
| 265 | int num; | 264 | int num; |
| 266 | 265 | ||
| 267 | if((e == NULL) || (cmd_name == NULL)) | 266 | if ((e == NULL) || (cmd_name == NULL)) { |
| 268 | { | ||
| 269 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD, | 267 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD, |
| 270 | ERR_R_PASSED_NULL_PARAMETER); | 268 | ERR_R_PASSED_NULL_PARAMETER); |
| 271 | return 0; | 269 | return 0; |
| 272 | } | 270 | } |
| 273 | if((e->ctrl == NULL) || ((num = ENGINE_ctrl(e, | 271 | if ((e->ctrl == NULL) || |
| 274 | ENGINE_CTRL_GET_CMD_FROM_NAME, | 272 | ((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FROM_NAME, |
| 275 | 0, (void *)cmd_name, NULL)) <= 0)) | 273 | 0, (void *)cmd_name, NULL)) <= 0)) { |
| 276 | { | ||
| 277 | /* If the command didn't *have* to be supported, we fake | 274 | /* If the command didn't *have* to be supported, we fake |
| 278 | * success. This allows certain settings to be specified for | 275 | * success. This allows certain settings to be specified for |
| 279 | * multiple ENGINEs and only require a change of ENGINE id | 276 | * multiple ENGINEs and only require a change of ENGINE id |
| 280 | * (without having to selectively apply settings). Eg. changing | 277 | * (without having to selectively apply settings). Eg. changing |
| 281 | * from a hardware device back to the regular software ENGINE | 278 | * from a hardware device back to the regular software ENGINE |
| 282 | * without editing the config file, etc. */ | 279 | * without editing the config file, etc. */ |
| 283 | if(cmd_optional) | 280 | if (cmd_optional) { |
| 284 | { | ||
| 285 | ERR_clear_error(); | 281 | ERR_clear_error(); |
| 286 | return 1; | 282 | return 1; |
| 287 | } | ||
| 288 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD, | ||
| 289 | ENGINE_R_INVALID_CMD_NAME); | ||
| 290 | return 0; | ||
| 291 | } | 283 | } |
| 284 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD, ENGINE_R_INVALID_CMD_NAME); | ||
| 285 | return 0; | ||
| 286 | } | ||
| 287 | |||
| 292 | /* Force the result of the control command to 0 or 1, for the reasons | 288 | /* Force the result of the control command to 0 or 1, for the reasons |
| 293 | * mentioned before. */ | 289 | * mentioned before. */ |
| 294 | if (ENGINE_ctrl(e, num, i, p, f) > 0) | 290 | if (ENGINE_ctrl(e, num, i, p, f) > 0) |
| 295 | return 1; | 291 | return 1; |
| 296 | return 0; | ||
| 297 | } | ||
| 298 | 292 | ||
| 299 | int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, | 293 | return 0; |
| 300 | int cmd_optional) | 294 | } |
| 301 | { | 295 | |
| 296 | int | ||
| 297 | ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, | ||
| 298 | int cmd_optional) | ||
| 299 | { | ||
| 302 | int num, flags; | 300 | int num, flags; |
| 303 | long l; | 301 | long l; |
| 304 | char *ptr; | 302 | char *ptr; |
| 305 | if((e == NULL) || (cmd_name == NULL)) | 303 | |
| 306 | { | 304 | if ((e == NULL) || (cmd_name == NULL)) { |
| 307 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 305 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 308 | ERR_R_PASSED_NULL_PARAMETER); | 306 | ERR_R_PASSED_NULL_PARAMETER); |
| 309 | return 0; | 307 | return 0; |
| 310 | } | 308 | } |
| 311 | if((e->ctrl == NULL) || ((num = ENGINE_ctrl(e, | 309 | if ((e->ctrl == NULL) || |
| 312 | ENGINE_CTRL_GET_CMD_FROM_NAME, | 310 | ((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FROM_NAME, 0, |
| 313 | 0, (void *)cmd_name, NULL)) <= 0)) | 311 | (void *)cmd_name, NULL)) <= 0)) { |
| 314 | { | ||
| 315 | /* If the command didn't *have* to be supported, we fake | 312 | /* If the command didn't *have* to be supported, we fake |
| 316 | * success. This allows certain settings to be specified for | 313 | * success. This allows certain settings to be specified for |
| 317 | * multiple ENGINEs and only require a change of ENGINE id | 314 | * multiple ENGINEs and only require a change of ENGINE id |
| 318 | * (without having to selectively apply settings). Eg. changing | 315 | * (without having to selectively apply settings). Eg. changing |
| 319 | * from a hardware device back to the regular software ENGINE | 316 | * from a hardware device back to the regular software ENGINE |
| 320 | * without editing the config file, etc. */ | 317 | * without editing the config file, etc. */ |
| 321 | if(cmd_optional) | 318 | if (cmd_optional) { |
| 322 | { | ||
| 323 | ERR_clear_error(); | 319 | ERR_clear_error(); |
| 324 | return 1; | 320 | return 1; |
| 325 | } | 321 | } |
| 326 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 322 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 327 | ENGINE_R_INVALID_CMD_NAME); | 323 | ENGINE_R_INVALID_CMD_NAME); |
| 328 | return 0; | 324 | return 0; |
| 329 | } | 325 | } |
| 330 | if(!ENGINE_cmd_is_executable(e, num)) | 326 | if (!ENGINE_cmd_is_executable(e, num)) { |
| 331 | { | ||
| 332 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 327 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 333 | ENGINE_R_CMD_NOT_EXECUTABLE); | 328 | ENGINE_R_CMD_NOT_EXECUTABLE); |
| 334 | return 0; | 329 | return 0; |
| 335 | } | 330 | } |
| 336 | if((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num, NULL, NULL)) < 0) | 331 | if ((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num, |
| 337 | { | 332 | NULL, NULL)) < 0) { |
| 338 | /* Shouldn't happen, given that ENGINE_cmd_is_executable() | 333 | /* Shouldn't happen, given that ENGINE_cmd_is_executable() |
| 339 | * returned success. */ | 334 | * returned success. */ |
| 340 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 335 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 341 | ENGINE_R_INTERNAL_LIST_ERROR); | 336 | ENGINE_R_INTERNAL_LIST_ERROR); |
| 342 | return 0; | 337 | return 0; |
| 343 | } | 338 | } |
| 344 | /* If the command takes no input, there must be no input. And vice | 339 | /* If the command takes no input, there must be no input. And vice |
| 345 | * versa. */ | 340 | * versa. */ |
| 346 | if(flags & ENGINE_CMD_FLAG_NO_INPUT) | 341 | if (flags & ENGINE_CMD_FLAG_NO_INPUT) { |
| 347 | { | 342 | if (arg != NULL) { |
| 348 | if(arg != NULL) | ||
| 349 | { | ||
| 350 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 343 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 351 | ENGINE_R_COMMAND_TAKES_NO_INPUT); | 344 | ENGINE_R_COMMAND_TAKES_NO_INPUT); |
| 352 | return 0; | 345 | return 0; |
| 353 | } | 346 | } |
| 354 | /* We deliberately force the result of ENGINE_ctrl() to 0 or 1 | 347 | /* We deliberately force the result of ENGINE_ctrl() to 0 or 1 |
| 355 | * rather than returning it as "return data". This is to ensure | 348 | * rather than returning it as "return data". This is to ensure |
| 356 | * usage of these commands is consistent across applications and | 349 | * usage of these commands is consistent across applications and |
| 357 | * that certain applications don't understand it one way, and | 350 | * that certain applications don't understand it one way, and |
| 358 | * others another. */ | 351 | * others another. */ |
| 359 | if(ENGINE_ctrl(e, num, 0, (void *)arg, NULL) > 0) | 352 | if (ENGINE_ctrl(e, num, 0, (void *)arg, NULL) > 0) |
| 360 | return 1; | 353 | return 1; |
| 361 | return 0; | 354 | return 0; |
| 362 | } | 355 | } |
| 363 | /* So, we require input */ | 356 | /* So, we require input */ |
| 364 | if(arg == NULL) | 357 | if (arg == NULL) { |
| 365 | { | ||
| 366 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 358 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 367 | ENGINE_R_COMMAND_TAKES_INPUT); | 359 | ENGINE_R_COMMAND_TAKES_INPUT); |
| 368 | return 0; | 360 | return 0; |
| 369 | } | 361 | } |
| 370 | /* If it takes string input, that's easy */ | 362 | /* If it takes string input, that's easy */ |
| 371 | if(flags & ENGINE_CMD_FLAG_STRING) | 363 | if (flags & ENGINE_CMD_FLAG_STRING) { |
| 372 | { | ||
| 373 | /* Same explanation as above */ | 364 | /* Same explanation as above */ |
| 374 | if(ENGINE_ctrl(e, num, 0, (void *)arg, NULL) > 0) | 365 | if (ENGINE_ctrl(e, num, 0, (void *)arg, NULL) > 0) |
| 375 | return 1; | 366 | return 1; |
| 376 | return 0; | 367 | return 0; |
| 377 | } | 368 | } |
| 378 | /* If it doesn't take numeric either, then it is unsupported for use in | 369 | /* If it doesn't take numeric either, then it is unsupported for use in |
| 379 | * a config-setting situation, which is what this function is for. This | 370 | * a config-setting situation, which is what this function is for. This |
| 380 | * should never happen though, because ENGINE_cmd_is_executable() was | 371 | * should never happen though, because ENGINE_cmd_is_executable() was |
| 381 | * used. */ | 372 | * used. */ |
| 382 | if(!(flags & ENGINE_CMD_FLAG_NUMERIC)) | 373 | if (!(flags & ENGINE_CMD_FLAG_NUMERIC)) { |
| 383 | { | ||
| 384 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 374 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 385 | ENGINE_R_INTERNAL_LIST_ERROR); | 375 | ENGINE_R_INTERNAL_LIST_ERROR); |
| 386 | return 0; | 376 | return 0; |
| 387 | } | 377 | } |
| 388 | l = strtol(arg, &ptr, 10); | 378 | l = strtol(arg, &ptr, 10); |
| 389 | if((arg == ptr) || (*ptr != '\0')) | 379 | if ((arg == ptr) || (*ptr != '\0')) { |
| 390 | { | ||
| 391 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, | 380 | ENGINEerr(ENGINE_F_ENGINE_CTRL_CMD_STRING, |
| 392 | ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER); | 381 | ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER); |
| 393 | return 0; | 382 | return 0; |
| 394 | } | 383 | } |
| 395 | /* Force the result of the control command to 0 or 1, for the reasons | 384 | /* Force the result of the control command to 0 or 1, for the reasons |
| 396 | * mentioned before. */ | 385 | * mentioned before. */ |
| 397 | if(ENGINE_ctrl(e, num, l, NULL, NULL) > 0) | 386 | if (ENGINE_ctrl(e, num, l, NULL, NULL) > 0) |
| 398 | return 1; | 387 | return 1; |
| 399 | return 0; | 388 | return 0; |
| 400 | } | 389 | } |
