version 1.86, 2019/07/09 04:15:00 |
version 1.87, 2019/09/03 08:32:11 |
|
|
#include "ssh2.h" |
#include "ssh2.h" |
#include "auth-options.h" |
#include "auth-options.h" |
|
|
/* |
|
* Match flag 'opt' in *optsp, and if allow_negate is set then also match |
|
* 'no-opt'. Returns -1 if option not matched, 1 if option matches or 0 |
|
* if negated option matches. |
|
* If the option or negated option matches, then *optsp is updated to |
|
* point to the first character after the option. |
|
*/ |
|
static int |
|
opt_flag(const char *opt, int allow_negate, const char **optsp) |
|
{ |
|
size_t opt_len = strlen(opt); |
|
const char *opts = *optsp; |
|
int negate = 0; |
|
|
|
if (allow_negate && strncasecmp(opts, "no-", 3) == 0) { |
|
opts += 3; |
|
negate = 1; |
|
} |
|
if (strncasecmp(opts, opt, opt_len) == 0) { |
|
*optsp = opts + opt_len; |
|
return negate ? 0 : 1; |
|
} |
|
return -1; |
|
} |
|
|
|
static char * |
|
opt_dequote(const char **sp, const char **errstrp) |
|
{ |
|
const char *s = *sp; |
|
char *ret; |
|
size_t i; |
|
|
|
*errstrp = NULL; |
|
if (*s != '"') { |
|
*errstrp = "missing start quote"; |
|
return NULL; |
|
} |
|
s++; |
|
if ((ret = malloc(strlen((s)) + 1)) == NULL) { |
|
*errstrp = "memory allocation failed"; |
|
return NULL; |
|
} |
|
for (i = 0; *s != '\0' && *s != '"';) { |
|
if (s[0] == '\\' && s[1] == '"') |
|
s++; |
|
ret[i++] = *s++; |
|
} |
|
if (*s == '\0') { |
|
*errstrp = "missing end quote"; |
|
free(ret); |
|
return NULL; |
|
} |
|
ret[i] = '\0'; |
|
s++; |
|
*sp = s; |
|
return ret; |
|
} |
|
|
|
static int |
|
opt_match(const char **opts, const char *term) |
|
{ |
|
if (strncasecmp((*opts), term, strlen(term)) == 0 && |
|
(*opts)[strlen(term)] == '=') { |
|
*opts += strlen(term) + 1; |
|
return 1; |
|
} |
|
return 0; |
|
} |
|
|
|
static int |
static int |
dup_strings(char ***dstp, size_t *ndstp, char **src, size_t nsrc) |
dup_strings(char ***dstp, size_t *ndstp, char **src, size_t nsrc) |
{ |
{ |