summaryrefslogtreecommitdiffstats
path: root/libssh
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2010-05-10 22:47:00 +0200
committerAndreas Schneider <mail@cynapses.org>2010-05-11 09:44:13 +0200
commit07e8d8f1f25518bae8789534e3bdff90e116a774 (patch)
treed5dee8dec954d85da9ff1dce2b1617bdd9b3e901 /libssh
parent34a927716a37a533719c3473dd0007be35307883 (diff)
Added a function to expand the tilde from a path.
Diffstat (limited to 'libssh')
-rw-r--r--libssh/misc.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/libssh/misc.c b/libssh/misc.c
index 3ba88fc7..7a3de7b4 100644
--- a/libssh/misc.c
+++ b/libssh/misc.c
@@ -492,5 +492,66 @@ int ssh_mkdir(const char *pathname, mode_t mode) {
return r;
}
-/** @} */
-/* vim: set ts=2 sw=2 et cindent: */
+/**
+ * @brief Expand a directory starting with a tilde '~'
+ *
+ * @param[in] session The ssh session to use.
+ *
+ * @param[in] d The directory to expand.
+ *
+ * @return The expanded directory, NULL on error.
+ */
+char *ssh_path_expand_tilde(const char *d) {
+ char *h, *r, *p;
+ size_t ld;
+ size_t lh = 0;
+
+ if (d[0] != '~') {
+ return strdup(d);
+ }
+ d++;
+
+ /* handle ~user/path */
+ p = strchr(d, '/');
+ if (p != NULL && p > d) {
+ struct passwd *pw;
+ size_t s = p - d;
+ char u[128];
+
+ if (s > sizeof(u)) {
+ return NULL;
+ }
+ memcpy(u, d, s);
+ u[s] = '\0';
+ pw = getpwnam(u);
+ if (pw == NULL) {
+ return NULL;
+ }
+ ld = strlen(p);
+ h = strdup(pw->pw_dir);
+ } else {
+ ld = strlen(d);
+ p = (char *) d;
+ h = ssh_get_user_home_dir();
+ }
+ if (h == NULL) {
+ return NULL;
+ }
+ lh = strlen(h);
+
+ r = malloc(ld + lh + 1);
+ if (r == NULL) {
+ return NULL;
+ }
+
+ if (lh > 0) {
+ memcpy(r, h, lh);
+ }
+ memcpy(r + lh, p, ld);
+
+ return r;
+}
+
+/* @} */
+
+/* vim: set ts=4 sw=4 et cindent: */