From fac56bae327d503464c6c08113b41153064551a1 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 10 May 2010 23:18:09 +0200 Subject: Added a function to expand an escaped string. --- include/libssh/misc.h | 1 + libssh/misc.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/include/libssh/misc.h b/include/libssh/misc.h index 05c6d493..2c10944c 100644 --- a/include/libssh/misc.h +++ b/include/libssh/misc.h @@ -29,6 +29,7 @@ char *ssh_get_local_username(ssh_session session); int ssh_file_readaccess_ok(const char *file); char *ssh_path_expand_tilde(const char *d); +char *ssh_path_expand_escape(ssh_session session, const char *s); /* macro for byte ordering */ uint64_t ntohll(uint64_t); diff --git a/libssh/misc.c b/libssh/misc.c index 7bef392b..2b2158fb 100644 --- a/libssh/misc.c +++ b/libssh/misc.c @@ -46,6 +46,7 @@ #include "libssh/priv.h" #include "libssh/misc.h" +#include "libssh/session.h" #ifdef HAVE_LIBGCRYPT #define GCRYPT_STRING "/gnutls" @@ -580,6 +581,89 @@ char *ssh_path_expand_tilde(const char *d) { return r; } +char *ssh_path_expand_escape(ssh_session session, const char *s) { +#define MAX_BUF_SIZE 4096 + char host[NI_MAXHOST]; + char buf[MAX_BUF_SIZE]; + char *r, *x = NULL; + const char *p; + size_t i, l; + + if (strlen(s) > MAX_BUF_SIZE) { + ssh_set_error(session, SSH_FATAL, "string to expand too long"); + return NULL; + } + + r = ssh_path_expand_tilde(s); + if (r == NULL) { + ssh_set_error_oom(session); + return NULL; + } + + p = r; + buf[0] = '\0'; + + for (i = 0; *p != '\0'; p++) { + if (*p != '%') { + buf[i] = *p; + i++; + if (i > MAX_BUF_SIZE) { + return NULL; + } + buf[i] = '\0'; + continue; + } + + p++; + if (*p == '\0') { + break; + } + + switch (*p) { + case 'd': + x = strdup(session->sshdir); + break; + case 'u': + x = ssh_get_local_username(session); + break; + case 'l': + if (gethostname(host, sizeof(host) == 0)) { + x = strdup(host); + } + break; + case 'h': + x = strdup(session->host); + break; + case 'r': + x = strdup(session->username); + break; + default: + ssh_set_error(session, SSH_FATAL, + "Wrong escape sequence detected"); + return NULL; + } + + if (x == NULL) { + ssh_set_error_oom(session); + return NULL; + } + + i += strlen(x); + if (i > MAX_BUF_SIZE) { + ssh_set_error(session, SSH_FATAL, + "String too long"); + return NULL; + } + l = strlen(buf); + strcat(buf + l, x); + SAFE_FREE(x); + } + + free(r); + return strdup(buf); +#undef MAX_BUF_SIZE +} + /* @} */ /* vim: set ts=4 sw=4 et cindent: */ -- cgit v1.2.3 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105