diff options
author | NoName115 <robert.kolcun@gmail.com> | 2017-10-25 14:20:52 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2017-12-21 11:43:14 +0100 |
commit | 99c5160cb5a1a169f86d334017efde4cef23ead8 (patch) | |
tree | 4e084e39083dbbd833f57370bd22ab5afb11fd9b /src/config.c | |
parent | 110da49504e52780195a6029bac6720129434f6c (diff) | |
download | libssh-99c5160cb5a1a169f86d334017efde4cef23ead8.tar.gz libssh-99c5160cb5a1a169f86d334017efde4cef23ead8.tar.xz libssh-99c5160cb5a1a169f86d334017efde4cef23ead8.zip |
config: glob support for include with test
Signed-off-by: NoName115 <robert.kolcun@gmail.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/config.c b/src/config.c index 330fb7ee..cedf34e4 100644 --- a/src/config.c +++ b/src/config.c @@ -27,6 +27,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <glob.h> #include "libssh/priv.h" #include "libssh/session.h" @@ -316,6 +317,33 @@ static void local_parse_file(ssh_session session, const char *filename, int *par return; } +static void local_parse_glob(ssh_session session, + const char *fileglob, + int *parsing, + int seen[]) +{ + glob_t globbuf = {0}; + int rt; + u_int i; + + rt = glob(fileglob, GLOB_TILDE, NULL, &globbuf); + if (rt == GLOB_NOMATCH) { + globfree(&globbuf); + return; + } else if (rt != 0) { + SSH_LOG(SSH_LOG_RARE, "Glob error: %s", + fileglob); + globfree(&globbuf); + return; + } + + for (i = 0; i < globbuf.gl_pathc; i++) { + local_parse_file(session, globbuf.gl_pathv[i], parsing, seen); + } + + globfree(&globbuf); +} + static int ssh_config_parse_line(ssh_session session, const char *line, unsigned int count, int *parsing, int seen[]) { enum ssh_config_opcode_e opcode; @@ -361,7 +389,7 @@ static int ssh_config_parse_line(ssh_session session, const char *line, p = ssh_config_get_str_tok(&s, NULL); if (p && *parsing) { - local_parse_file(session, p, parsing, seen); + local_parse_glob(session, p, parsing, seen); } break; case SOC_HOST: { |