mirror of https://github.com/MidnightCommander/mc
Removed vfs_get_class() function
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
922114a1d0
commit
3d1e2df9b7
|
@ -8,7 +8,6 @@ LIBS=@CHECK_LIBS@ \
|
|||
|
||||
TESTS = \
|
||||
current_dir \
|
||||
get_vfs_class \
|
||||
path_serialize \
|
||||
vfs_path_string_convert \
|
||||
vfs_prefix_to_class \
|
||||
|
@ -20,9 +19,6 @@ check_PROGRAMS = $(TESTS)
|
|||
current_dir_SOURCES = \
|
||||
current_dir.c
|
||||
|
||||
get_vfs_class_SOURCES = \
|
||||
get_vfs_class.c
|
||||
|
||||
path_serialize_SOURCES = \
|
||||
path_serialize.c
|
||||
|
||||
|
|
|
@ -1,162 +0,0 @@
|
|||
/* lib/vfs - get vfs class from string
|
||||
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
|
||||
Written by:
|
||||
Slava Zanko <slavazanko@gmail.com>, 2011
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License
|
||||
as published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#define TEST_SUITE_NAME "/lib/vfs"
|
||||
|
||||
#include <check.h>
|
||||
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/strutil.h"
|
||||
#include "lib/vfs/xdirentry.h"
|
||||
#include "lib/vfs/vfs.c" /* for testing static methods */
|
||||
|
||||
#include "src/vfs/local/local.c"
|
||||
|
||||
static void
|
||||
setup (void)
|
||||
{
|
||||
str_init_strings (NULL);
|
||||
|
||||
vfs_init ();
|
||||
init_localfs ();
|
||||
vfs_setup_work_dir ();
|
||||
}
|
||||
|
||||
static void
|
||||
teardown (void)
|
||||
{
|
||||
vfs_shut ();
|
||||
str_uninit_strings ();
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
START_TEST (test_register_vfs_class)
|
||||
{
|
||||
static struct vfs_s_subclass test_subclass;
|
||||
static struct vfs_class vfs_test_ops;
|
||||
|
||||
test_subclass.flags = VFS_S_REMOTE;
|
||||
vfs_s_init_class (&vfs_test_ops, &test_subclass);
|
||||
|
||||
vfs_test_ops.name = "testfs";
|
||||
vfs_test_ops.flags = VFSF_NOLINKS;
|
||||
vfs_test_ops.prefix = "test:";
|
||||
vfs_register_class (&vfs_test_ops);
|
||||
|
||||
fail_if (vfs__classes_list->len != 2, "Failed to register test VFS module");;
|
||||
|
||||
{
|
||||
struct vfs_class *result;
|
||||
result = vfs_get_class("/#test://bla-bla/some/path");
|
||||
fail_if(result == NULL, "VFS module not found!");
|
||||
fail_unless(result == &vfs_test_ops, "Result(%p) don't match to vfs_test_ops(%p)!", result, &vfs_test_ops);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
struct vfs_class *result;
|
||||
result = vfs_get_class("/#test://bla-bla/some/path/#test_not_exists://bla-bla/some/path");
|
||||
fail_if(result == NULL, "VFS module not found!");
|
||||
fail_unless(result == &vfs_test_ops, "Result(%p) don't match to vfs_test_ops(%p)!", result, &vfs_test_ops);
|
||||
}
|
||||
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
START_TEST (test_register_vfs_class2)
|
||||
{
|
||||
static struct vfs_s_subclass test_subclass1, test_subclass2;
|
||||
static struct vfs_class vfs_test_ops1, vfs_test_ops2;
|
||||
|
||||
test_subclass1.flags = VFS_S_REMOTE;
|
||||
vfs_s_init_class (&vfs_test_ops1, &test_subclass1);
|
||||
|
||||
vfs_test_ops1.name = "testfs1";
|
||||
vfs_test_ops1.flags = VFSF_NOLINKS;
|
||||
vfs_test_ops1.prefix = "test1:";
|
||||
vfs_register_class (&vfs_test_ops1);
|
||||
|
||||
vfs_s_init_class (&vfs_test_ops2, &test_subclass2);
|
||||
|
||||
vfs_test_ops2.name = "testfs2";
|
||||
vfs_test_ops2.prefix = "test2:";
|
||||
vfs_register_class (&vfs_test_ops2);
|
||||
|
||||
|
||||
fail_if (vfs__classes_list->len != 3, "Failed to register test VFS module");;
|
||||
|
||||
{
|
||||
struct vfs_class *result;
|
||||
result = vfs_get_class("/#test1://bla-bla/some/path");
|
||||
fail_if(result == NULL, "VFS module not found!");
|
||||
fail_unless(result == &vfs_test_ops1, "Result(%p) don't match to vfs_test_ops1(%p)!", result, &vfs_test_ops1);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
struct vfs_class *result;
|
||||
result = vfs_get_class("/#test2://bla-bla/some/path/#test1://bla-bla/some/path");
|
||||
fail_if(result == NULL, "VFS module not found!");
|
||||
fail_unless(result == &vfs_test_ops1, "Result(%p) don't match to vfs_test_ops1(%p)!", result, &vfs_test_ops1);
|
||||
}
|
||||
|
||||
{
|
||||
struct vfs_class *result;
|
||||
result = vfs_get_class("/#test1://bla-bla/some/path/#test2://bla-bla/some/path");
|
||||
fail_if(result == NULL, "VFS module not found!");
|
||||
fail_unless(result == &vfs_test_ops2, "Result(%p) don't match to vfs_test_ops2(%p)!", result, &vfs_test_ops2);
|
||||
}
|
||||
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int number_failed;
|
||||
|
||||
Suite *s = suite_create (TEST_SUITE_NAME);
|
||||
TCase *tc_core = tcase_create ("Core");
|
||||
SRunner *sr;
|
||||
|
||||
tcase_add_checked_fixture (tc_core, setup, teardown);
|
||||
|
||||
/* Add new tests here: *************** */
|
||||
tcase_add_test (tc_core, test_register_vfs_class);
|
||||
tcase_add_test (tc_core, test_register_vfs_class2);
|
||||
/* *********************************** */
|
||||
|
||||
suite_add_tcase (s, tc_core);
|
||||
sr = srunner_create (s);
|
||||
srunner_set_log (sr, "get_vfs_class.log");
|
||||
srunner_run_all (sr, CK_NORMAL);
|
||||
number_failed = srunner_ntests_failed (sr);
|
||||
srunner_free (sr);
|
||||
return (number_failed == 0) ? 0 : 1;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
|
@ -112,47 +112,6 @@ static const struct
|
|||
};
|
||||
|
||||
/*** file scope functions ************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static gboolean
|
||||
path_magic (const char *path)
|
||||
{
|
||||
struct stat buf;
|
||||
|
||||
return (stat (path, &buf) != 0);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static struct vfs_class *
|
||||
_vfs_get_class (char *path)
|
||||
{
|
||||
char *semi;
|
||||
char *slash;
|
||||
struct vfs_class *ret;
|
||||
|
||||
g_return_val_if_fail (path, NULL);
|
||||
|
||||
semi = strrchr (path, '#');
|
||||
if (semi == NULL || !path_magic (path))
|
||||
return NULL;
|
||||
|
||||
slash = strchr (semi, PATH_SEP);
|
||||
*semi = '\0';
|
||||
if (slash != NULL)
|
||||
*slash = '\0';
|
||||
|
||||
ret = vfs_prefix_to_class (semi + 1);
|
||||
|
||||
if (slash != NULL)
|
||||
*slash = PATH_SEP;
|
||||
if (ret == NULL)
|
||||
ret = _vfs_get_class (path);
|
||||
|
||||
*semi = '#';
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/* now used only by vfs_translate_path, but could be used in other vfs
|
||||
* plugin to automatic detect encoding
|
||||
|
@ -394,24 +353,6 @@ vfs_strip_suffix_from_filename (const char *filename)
|
|||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
struct vfs_class *
|
||||
vfs_get_class (const char *pathname)
|
||||
{
|
||||
char *path;
|
||||
struct vfs_class *vfs;
|
||||
|
||||
path = g_strdup (pathname);
|
||||
vfs = _vfs_get_class (path);
|
||||
g_free (path);
|
||||
|
||||
if (vfs == NULL)
|
||||
vfs = g_ptr_array_index (vfs__classes_list, 0); /* localfs */
|
||||
|
||||
return vfs;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
char *
|
||||
vfs_translate_path (const char *path)
|
||||
{
|
||||
|
@ -629,7 +570,7 @@ vfs_print_message (const char *msg, ...)
|
|||
char *
|
||||
_vfs_get_cwd (void)
|
||||
{
|
||||
char *trans, *curr_dir;
|
||||
vfs_path_element_t *path_element;
|
||||
|
||||
if (vfs_get_raw_current_dir () == NULL)
|
||||
{
|
||||
|
@ -638,13 +579,10 @@ _vfs_get_cwd (void)
|
|||
vfs_set_raw_current_dir (vfs_path_from_str (tmp));
|
||||
g_free (tmp);
|
||||
}
|
||||
path_element = vfs_path_get_by_index (vfs_get_raw_current_dir (), -1);
|
||||
|
||||
curr_dir = vfs_get_current_dir ();
|
||||
trans = vfs_translate_path_n (curr_dir);
|
||||
|
||||
if (_vfs_get_class (trans) == NULL)
|
||||
if (path_element->class->flags & VFSF_LOCAL)
|
||||
{
|
||||
vfs_path_element_t *path_element = vfs_path_get_by_index (vfs_get_raw_current_dir (), -1);
|
||||
|
||||
if (path_element->encoding == NULL)
|
||||
{
|
||||
|
@ -665,7 +603,7 @@ _vfs_get_cwd (void)
|
|||
/* Check if it is O.K. to use the current_dir */
|
||||
if (!(mc_global.vfs.cd_symlinks
|
||||
&& mc_stat (vfs_str_buffer->str, &my_stat) == 0
|
||||
&& mc_stat (curr_dir, &my_stat2) == 0
|
||||
&& mc_stat (path_element->path, &my_stat2) == 0
|
||||
&& my_stat.st_ino == my_stat2.st_ino
|
||||
&& my_stat.st_dev == my_stat2.st_dev))
|
||||
{
|
||||
|
@ -676,8 +614,7 @@ _vfs_get_cwd (void)
|
|||
}
|
||||
}
|
||||
|
||||
g_free (trans);
|
||||
return curr_dir;
|
||||
return vfs_path_to_str (vfs_get_raw_current_dir ());
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
|
|
@ -242,7 +242,6 @@ char *vfs_translate_url (const char *url);
|
|||
struct vfs_class *vfs_split (char *path, char **inpath, char **op);
|
||||
char *vfs_path (const char *path);
|
||||
|
||||
struct vfs_class *vfs_get_class (const char *path);
|
||||
vfs_class_flags_t vfs_file_class_flags (const vfs_path_t * vpath);
|
||||
|
||||
/* translate path back to terminal encoding, remove all #enc:
|
||||
|
|
|
@ -234,17 +234,22 @@ free_linklist (struct link **lc_linklist)
|
|||
static int
|
||||
is_in_linklist (struct link *lp, const char *path, struct stat *sb)
|
||||
{
|
||||
vfs_path_t *vpath;
|
||||
vfs_path_element_t *vpath_element;
|
||||
ino_t ino = sb->st_ino;
|
||||
dev_t dev = sb->st_dev;
|
||||
struct vfs_class *vfs = vfs_get_class (path);
|
||||
|
||||
vpath = vfs_path_from_str (path);
|
||||
vpath_element = vfs_path_get_by_index (vpath, -1);
|
||||
|
||||
while (lp != NULL)
|
||||
{
|
||||
if (lp->vfs == vfs)
|
||||
if (lp->vfs == vpath_element->class)
|
||||
if (lp->ino == ino && lp->dev == dev)
|
||||
return 1;
|
||||
lp = lp->next;
|
||||
}
|
||||
vfs_path_free (vpath);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -281,12 +286,29 @@ check_hardlinks (const char *src_name, const char *dst_name, struct stat *pstat)
|
|||
for (lp = linklist; lp != NULL; lp = lp->next)
|
||||
if (lp->vfs == my_vfs && lp->ino == ino && lp->dev == dev)
|
||||
{
|
||||
struct vfs_class *lp_name_class;
|
||||
|
||||
vpath = vfs_path_from_str (lp->name);
|
||||
lp_name_class = vfs_path_get_by_index (vpath, -1)->class;
|
||||
vfs_path_free (vpath);
|
||||
|
||||
if (!mc_stat (lp->name, &link_stat) && link_stat.st_ino == ino
|
||||
&& link_stat.st_dev == dev && vfs_get_class (lp->name) == my_vfs)
|
||||
&& link_stat.st_dev == dev && lp_name_class == my_vfs)
|
||||
{
|
||||
struct vfs_class *p_class, *dst_name_class;
|
||||
|
||||
p = strchr (lp->name, 0) + 1; /* i.e. where the `name' file
|
||||
was copied to */
|
||||
if (vfs_get_class (dst_name) == vfs_get_class (p))
|
||||
|
||||
vpath = vfs_path_from_str (p);
|
||||
p_class = vfs_path_get_by_index (vpath, -1)->class;
|
||||
vfs_path_free (vpath);
|
||||
|
||||
vpath = vfs_path_from_str (dst_name);
|
||||
dst_name_class = vfs_path_get_by_index (vpath, -1)->class;
|
||||
vfs_path_free (vpath);
|
||||
|
||||
if (dst_name_class == p_class)
|
||||
{
|
||||
if (!mc_stat (p, &link_stat))
|
||||
{
|
||||
|
@ -1754,7 +1776,11 @@ copy_dir_dir (FileOpTotalContext * tctx, FileOpContext * ctx, const char *s, con
|
|||
}
|
||||
|
||||
lp = g_new (struct link, 1);
|
||||
lp->vfs = vfs_get_class (s);
|
||||
{
|
||||
vfs_path_t *vpath = vfs_path_from_str (s);
|
||||
lp->vfs = vfs_path_get_by_index (vpath, -1)->class;
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
lp->ino = cbuf.st_ino;
|
||||
lp->dev = cbuf.st_dev;
|
||||
lp->next = parent_dirs;
|
||||
|
@ -1814,7 +1840,11 @@ copy_dir_dir (FileOpTotalContext * tctx, FileOpContext * ctx, const char *s, con
|
|||
|
||||
lp = g_new (struct link, 1);
|
||||
mc_stat (dest_dir, &buf);
|
||||
lp->vfs = vfs_get_class (dest_dir);
|
||||
{
|
||||
vfs_path_t *vpath = vfs_path_from_str (dest_dir);
|
||||
lp->vfs = vfs_path_get_by_index (vpath, -1)->class;
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
lp->ino = buf.st_ino;
|
||||
lp->dev = buf.st_dev;
|
||||
lp->next = dest_dirs;
|
||||
|
|
Loading…
Reference in New Issue