aboutsummaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorNoName115 <robert.kolcun@gmail.com>2017-10-25 14:20:52 +0200
committerAndreas Schneider <asn@cryptomilk.org>2017-12-21 11:43:14 +0100
commit99c5160cb5a1a169f86d334017efde4cef23ead8 (patch)
tree4e084e39083dbbd833f57370bd22ab5afb11fd9b /src/config.c
parent110da49504e52780195a6029bac6720129434f6c (diff)
downloadlibssh-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.c30
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: {