diff options
| author | Tomas Bzatek <tbzatek@tbzatek.englab.brq.redhat.com> | 2008-06-13 14:17:54 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@tbzatek.englab.brq.redhat.com> | 2008-06-13 14:17:54 +0200 |
| commit | 892e407c5f5e06fa8c0ca9250b3bc99851c6a61d (patch) | |
| tree | fbca968b4f12c18cc755c0436925b744c6bb04ea /common/treepathutils.c | |
| parent | 4e58288e8e2e76e8d518b21273f787be16a486c3 (diff) | |
| download | tuxcmd-modules-892e407c5f5e06fa8c0ca9250b3bc99851c6a61d.tar.xz | |
Symlink resolving code, disabled by default
Diffstat (limited to 'common/treepathutils.c')
| -rw-r--r-- | common/treepathutils.c | 50 |
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"); +} + |
