version 1.165, 2021/06/04 05:02:40 |
version 1.166, 2021/06/08 06:54:40 |
|
|
|
|
} |
} |
|
|
|
/* remove whitespace from end of string */ |
|
void |
|
rtrim(char *s) |
|
{ |
|
size_t i; |
|
|
|
if ((i = strlen(s)) == 0) |
|
return; |
|
for (i--; i > 0; i--) { |
|
if (isspace((int)s[i])) |
|
s[i] = '\0'; |
|
} |
|
} |
|
|
/* set/unset filedescriptor to non-blocking */ |
/* set/unset filedescriptor to non-blocking */ |
int |
int |
set_nonblock(int fd) |
set_nonblock(int fd) |
|
|
return 1; |
return 1; |
} |
} |
|
|
|
|
/* |
/* |
* Splits 's' into an argument vector. Handles quoted string and basic |
* Splits 's' into an argument vector. Handles quoted string and basic |
* escape characters (\\, \", \'). Caller must free the argument vector |
* escape characters (\\, \", \'). Caller must free the argument vector |
* and its members. |
* and its members. |
*/ |
*/ |
int |
int |
argv_split(const char *s, int *argcp, char ***argvp) |
argv_split(const char *s, int *argcp, char ***argvp, int terminate_on_comment) |
{ |
{ |
int r = SSH_ERR_INTERNAL_ERROR; |
int r = SSH_ERR_INTERNAL_ERROR; |
int argc = 0, quote, i, j; |
int argc = 0, quote, i, j; |
|
|
/* Skip leading whitespace */ |
/* Skip leading whitespace */ |
if (s[i] == ' ' || s[i] == '\t') |
if (s[i] == ' ' || s[i] == '\t') |
continue; |
continue; |
|
if (terminate_on_comment && s[i] == '#') |
|
break; |
/* Start of a token */ |
/* Start of a token */ |
quote = 0; |
quote = 0; |
|
|
|
|
if (s[i] == '\\') { |
if (s[i] == '\\') { |
if (s[i + 1] == '\'' || |
if (s[i + 1] == '\'' || |
s[i + 1] == '\"' || |
s[i + 1] == '\"' || |
s[i + 1] == '\\') { |
s[i + 1] == '\\' || |
|
(quote == 0 && s[i + 1] == ' ')) { |
i++; /* Skip '\' */ |
i++; /* Skip '\' */ |
arg[j++] = s[i]; |
arg[j++] = s[i]; |
} else { |
} else { |
|
|
sshbuf_free(buf); |
sshbuf_free(buf); |
sshbuf_free(arg); |
sshbuf_free(arg); |
return ret; |
return ret; |
|
} |
|
|
|
char * |
|
argv_next(int *argcp, char ***argvp) |
|
{ |
|
char *ret = (*argvp)[0]; |
|
|
|
if (*argcp > 0 && ret != NULL) { |
|
(*argcp)--; |
|
(*argvp)++; |
|
} |
|
return ret; |
|
} |
|
|
|
void |
|
argv_consume(int *argcp) |
|
{ |
|
*argcp = 0; |
|
} |
|
|
|
void |
|
argv_free(char **av, int ac) |
|
{ |
|
int i; |
|
|
|
if (av == NULL) |
|
return; |
|
for (i = 0; i < ac; i++) |
|
free(av[i]); |
|
free(av); |
} |
} |
|
|
/* Returns 0 if pid exited cleanly, non-zero otherwise */ |
/* Returns 0 if pid exited cleanly, non-zero otherwise */ |