summaryrefslogtreecommitdiff
path: root/common/treepathutils.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@tbzatek.englab.brq.redhat.com>2008-06-13 14:17:54 +0200
committerTomas Bzatek <tbzatek@tbzatek.englab.brq.redhat.com>2008-06-13 14:17:54 +0200
commit892e407c5f5e06fa8c0ca9250b3bc99851c6a61d (patch)
treefbca968b4f12c18cc755c0436925b744c6bb04ea /common/treepathutils.c
parent4e58288e8e2e76e8d518b21273f787be16a486c3 (diff)
downloadtuxcmd-modules-892e407c5f5e06fa8c0ca9250b3bc99851c6a61d.tar.xz
Symlink resolving code, disabled by default
Diffstat (limited to 'common/treepathutils.c')
-rw-r--r--common/treepathutils.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/common/treepathutils.c b/common/treepathutils.c
index 301f173..6215a14 100644
--- a/common/treepathutils.c
+++ b/common/treepathutils.c
@@ -1,5 +1,5 @@
/* Tux Commander VFS: String utilities
- * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
+ * Copyright (C) 2007-2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
* Check for updates on tuxcmd.sourceforge.net
*
* This program is free software; you can redistribute it and/or modify
@@ -311,3 +311,51 @@ struct PathTree* filelist_tree_get_item_by_index(struct PathTree *tree, unsigned
return t;
}
+
+void filelist_tree_resolve_symlinks_recurr(struct PathTree *tree, struct PathTree *root_tree, const char *path)
+{
+ if (tree) {
+ if ((tree->items) && (tree->items->len > 0)) {
+ unsigned int i;
+ for (i = 0; i < tree->items->len; i++)
+ {
+ struct PathTree* t = (struct PathTree*)g_ptr_array_index(tree->items, i);
+ gchar *new_path;
+
+ if ((t) && (t->data) && (t->data->ItemType == vSymlink) && (t->data->sLinkTo)) {
+ log("filelist_tree_resolve_symlinks: found '%s/%s' --> '%s'\n", path, t->node, t->data->sLinkTo);
+ gchar *rel = resolve_relative(path, t->data->sLinkTo);
+ log(" filelist_tree_resolve_symlinks: relative = '%s'\n", rel);
+ struct PathTree* link_t = filelist_tree_find_node_by_path(root_tree, rel);
+ if ((link_t) && (link_t->data)) {
+ /* WARNING: this is dangerous since we're destroying the symlink type */
+// t->data->ItemType = link_t->data->ItemType;
+ t->data->a_time = link_t->data->a_time;
+ t->data->c_time = link_t->data->c_time;
+ t->data->m_time = link_t->data->m_time;
+ t->data->iGID = link_t->data->iGID;
+ t->data->iUID = link_t->data->iUID;
+ t->data->iMode = link_t->data->iMode;
+ t->data->iSize = link_t->data->iSize;
+ }
+ g_free(rel);
+ }
+ if ((strlen(path) == 1) && (IS_DIR_SEP(*path)))
+ new_path = g_strconcat("/", t->node, NULL);
+ else
+ new_path = g_strconcat(path, "/", t->node, NULL);
+
+ filelist_tree_resolve_symlinks_recurr(t, root_tree, new_path);
+ g_free(new_path);
+ }
+ }
+ }
+}
+
+void filelist_tree_resolve_symlinks(struct PathTree *tree)
+{
+ log("filelist_tree_resolve_symlinks: begin\n");
+ filelist_tree_resolve_symlinks_recurr(tree, tree, "/");
+ log("filelist_tree_resolve_symlinks: end\n");
+}
+