SHA256
1
0
forked from pool/gvfs
gvfs/gvfs-nds-no-vfs-init.patch

214 lines
5.6 KiB
Diff
Raw Normal View History

diff -Nurp gvfs-1.0.2_old/daemon/gvfsbackendnds.c gvfs-1.0.2_new/daemon/gvfsbackendnds.c
--- gvfs-1.0.2_old/daemon/gvfsbackendnds.c 2009-01-16 22:25:34.000000000 +0530
+++ gvfs-1.0.2_new/daemon/gvfsbackendnds.c 2009-01-16 23:57:55.000000000 +0530
@@ -35,6 +35,7 @@
#include <glib/gi18n.h>
#include <gio/gio.h>
#include<dlfcn.h>
+#include <sys/utsname.h>
#include "gvfsbackendnds.h"
#include "gvfsjobmountmountable.h"
@@ -49,8 +50,6 @@
-/* Function Pointer to /opt/novell/lib/libinterface.so */
-int (*retrieve_children)(char *) = NULL;
typedef struct {
char *name;
@@ -199,6 +198,9 @@ update_cache (GVfsBackendNds *backend,co
int res;
char *ptr=NULL;
char *server_name=NULL;
+ struct utsname utsbuf;
+/* Function Pointer to /opt/novell/lib/libinterface.so */
+int (*retrieve_children)(char *);
entries = NULL;
entry_errno = 0;
@@ -232,17 +234,42 @@ if(backend->server == NULL) //retrieve
else //retrieve object names
{
- handle = dlopen("/opt/novell/lib/libinterface.so",RTLD_NOW);
+ uname(&utsbuf);
+ if(!strcmp(utsbuf.machine,"x86_64"))
+ handle = dlopen("/usr/lib64/libinterface.so",RTLD_NOW | RTLD_DEEPBIND);
+ else
+ handle = dlopen("/usr/lib/libinterface.so",RTLD_NOW | RTLD_DEEPBIND);
if(handle == NULL)
{
return;
}
*(void **)(&retrieve_children) = dlsym(handle,"retrieve_children");
+
+ unlink("/tmp/ndsobjects.txt");
+
if(retrieve_children != NULL)
{
res = (*retrieve_children)(server_name);
- }
+
+ if(res == 0)
+ {
+ fptr = fopen("/tmp/ndsobjects.txt","r");
+ if(fptr == NULL)
+ {
+ entry_errno = -1;
+ goto out;
+ }
+ objectname = (char *)malloc(sizeof(char) * 400);
+ while (fgets(objectname,400,fptr) != NULL)
+ {
+ objectlist = g_list_append(objectlist,g_strdup(objectname));
+ memset(objectname,'\0',400);
+ }
+ fclose(fptr);
+ free(objectname);
+ }
+ }
else
{
return;
@@ -265,6 +292,8 @@ for(object = objectlist;object != NULL;o
entries = g_list_append (entries, entry);
}
+//if(objectlist != NULL)
+//g_list_free(objectlist);
out:
@@ -274,7 +303,7 @@ for(object = objectlist;object != NULL;o
backend->entries = entries;
g_mutex_unlock (backend->entries_lock);
}
- backend->entry_errno = entry_errno;
+ backend->entry_errno = entry_errno;
}
@@ -376,15 +405,14 @@ do_mount (GVfsBackend *backend,
display_name = g_strdup (_("NVVFS Top Directory"));
browse_mount_spec = g_mount_spec_new ("nds");
icon = "network-workgroup";
-
}
else
{
display_name = g_strdup_printf (_("NVVFS Objects"));
browse_mount_spec = g_mount_spec_new ("nds");
+ //g_mount_spec_set (browse_mount_spec, "host", op_backend->mounted_server);
g_mount_spec_set (browse_mount_spec, "host", op_backend->server);
icon = "network-server";
-
}
g_vfs_backend_set_display_name (backend, display_name);
@@ -424,6 +452,74 @@ try_mount (GVfsBackend *backend,
return FALSE;
}
+static void
+run_mount_mountable (GVfsBackendNds *backend,
+ GVfsJobMountMountable *job,
+ const char *filename,
+ GMountSource *mount_source)
+{
+ BrowseEntry *entry;
+ GError *error = NULL;
+ GMountSpec *mount_spec;
+
+ g_mutex_lock (backend->entries_lock);
+
+backend->server = g_strdup(filename);
+
+ mount_spec = get_mount_spec_for_share (backend->server, filename);
+ g_vfs_job_mount_mountable_set_target (job, mount_spec, "/", TRUE);
+ g_mount_spec_unref (mount_spec);
+ g_mutex_unlock (backend->entries_lock);
+
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+}
+
+
+static gboolean
+do_mount_mountable (GVfsBackend *backend,
+ GVfsJobMountMountable *job,
+ const char *filename,
+ GMountSource *mount_source)
+{
+ GVfsBackendNds *op_backend = G_VFS_BACKEND_NDS (backend);
+
+update_cache (op_backend,filename);
+
+ run_mount_mountable (op_backend,
+ job,
+ filename,
+ mount_source);
+ return TRUE;
+}
+
+static gboolean
+try_mount_mountable (GVfsBackend *backend,
+ GVfsJobMountMountable *job,
+ const char *filename,
+ GMountSource *mount_source)
+{
+ GVfsBackendNds *op_backend = G_VFS_BACKEND_NDS (backend);
+
+
+ if (is_root (filename))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job),
+ G_IO_ERROR, G_IO_ERROR_NOT_MOUNTABLE_FILE,
+ _("The file is not a mountable"));
+ return TRUE;
+ }
+
+update_cache (op_backend,filename);
+
+ run_mount_mountable (op_backend,
+ job,
+ filename,
+ mount_source);
+ return TRUE;
+}
+
+
+
#define SUB_DELIM_CHARS "!$&'()*+,;="
static gboolean
@@ -482,7 +578,10 @@ get_file_info_from_entry (GVfsBackendNds
g_file_info_set_edit_name (info, entry->name_utf8);
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL, TRUE);
- icon = g_themed_icon_new ("network-server");
+ if(backend->server == NULL) //NDS-Tree icon
+ icon = g_themed_icon_new ("ncl-ndstree");
+ else
+ icon = g_themed_icon_new ("ncl-nwcontext");
if (icon)
{
@@ -634,7 +733,6 @@ try_enumerate (GVfsBackend *backend,
{
GVfsBackendNds *op_backend = G_VFS_BACKEND_NDS (backend);
-
update_cache (op_backend,filename);
run_enumerate (op_backend, job, filename, matcher);
@@ -648,7 +746,6 @@ g_vfs_backend_nds_class_init (GVfsBacken
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass);
-
gobject_class->finalize = g_vfs_backend_nds_finalize;
backend_class->mount = do_mount;