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 #include #include +#include #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;