From f4a0b6e40b4d11942ae30bf22bb360fae5edeccd Mon Sep 17 00:00:00 2001 From: "Andrew V. Samoilov" Date: Fri, 11 Oct 2002 15:29:55 +0000 Subject: [PATCH] * smbfs.c (fake_share_stat): Make sure share exists by smbfs_get_path() and fill buf with realistic data if current_share_info is NULL. Reformat function. (smbfs_get_path): Add const qualifier to path. --- vfs/ChangeLog | 20 +++++++++----- vfs/smbfs.c | 75 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/vfs/ChangeLog b/vfs/ChangeLog index caa230394..7488053d2 100644 --- a/vfs/ChangeLog +++ b/vfs/ChangeLog @@ -1,3 +1,10 @@ +2002-10-11 Andrew V. Samoilov + + * smbfs.c (fake_share_stat): Make sure share exists by + smbfs_get_path() and fill buf with realistic data + if current_share_info is NULL. Reformat function. + (smbfs_get_path): Add const qualifier to path. + 2002-10-09 Andrew V. Samoilov * smbfs.c: Allow username in URL (/#smb:[user@]machine) and @@ -1691,13 +1698,14 @@ 2000-04-06 Timur Bakeyev - * ftpfs.c (netrc_next): Turned strange "const char * const keywords" - into more alike "const char const * keywords". Still, think, it's - too strict. + * ftpfs.c (netrc_next): Turned strange "const char * const + keywords" into more alike "const char const * keywords". Still, + think, it's too strict. - * smbfs.c: Add #define BOOL_DEFINED before inclusion of samba headers. - Libncurses(or slang?) defines BOOL and that can cause problems. (In fact, - I can't find references to that const, but sure, I hade reason to do that:) + * smbfs.c: Add #define BOOL_DEFINED before inclusion of samba + headers. Libncurses(or slang?) defines BOOL and that can cause + problems. (In fact, I can't find references to that const, but + sure, I hade reason to do that:) * util-alone.h: Declare load_anon_passwd() to avoid warnings. diff --git a/vfs/smbfs.c b/vfs/smbfs.c index 3f68d9be5..75a4ddd02 100644 --- a/vfs/smbfs.c +++ b/vfs/smbfs.c @@ -809,7 +809,7 @@ smbfs_chmod (vfs *me, char *path, int mode) { DEBUG(3, ("smbfs_chmod(path:%s, mode:%d)\n", path, mode)); /* my_errno = EOPNOTSUPP; - return -1; */ /* cant chmod on smb filesystem */ + return -1; */ /* cannot chmod on smb filesystem */ return 0; /* make mc happy */ } @@ -1114,7 +1114,7 @@ smbfs_open_link (char *host, char *path, const char *user, int *port, } static char * -smbfs_get_path (smbfs_connection ** sc, char *path) +smbfs_get_path (smbfs_connection ** sc, const char *path) { char *user, *host, *remote_path, *pass; int port = SMB_PORT; @@ -1223,34 +1223,52 @@ fake_server_stat(const char *server_url, const char *path, struct stat *buf) } static int -fake_share_stat(const char *server_url, const char *path, struct stat *buf) +fake_share_stat (const char *server_url, const char *path, struct stat *buf) { - dir_entry *dentry; - if (strlen(path) < strlen(server_url)) - return -1; - path += strlen(server_url); /* we only want share name */ - path++; - - if (*path == '/') /* '/' leading server name */ - path++; /* probably came from server browsing */ - - if (!current_share_info->entries) { - if (!smbfs_loaddir(current_share_info)); /* browse host */ - return -1; - } - dentry = current_share_info->entries; - DEBUG(3, ("fake_share_stat: %s on %s\n", path, server_url)); - while (dentry) { - if (strcmp(dentry->text, path) == 0) { - DEBUG(6, ("fake_share_stat: %s:%4o\n", - dentry->text, dentry->my_stat.st_mode)); - memcpy(buf, &dentry->my_stat, sizeof(struct stat)); - return 0; - } - dentry = dentry->next; - } - my_errno = ENOENT; + dir_entry *dentry; + if (strlen (path) < strlen (server_url)) return -1; + + if (!current_share_info) { /* Server was not stat()ed */ + /* Make sure there is such share at server */ + smbfs_connection *sc; + char *p; + p = smbfs_get_path (&sc, path); + g_free (p); + if (p) { + memset (buf, 0, sizeof (*buf)); + /* show this as dir */ + buf->st_mode = + S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | + S_IXOTH; + return 0; + } + return -1; + } + + path += strlen (server_url); /* we only want share name */ + path++; + + if (*path == '/') /* '/' leading server name */ + path++; /* probably came from server browsing */ + + if (!current_share_info->entries) { + if (!smbfs_loaddir (current_share_info)) /* browse host */ + return -1; + } + dentry = current_share_info->entries; + DEBUG (3, ("fake_share_stat: %s on %s\n", path, server_url)); + while (dentry) { + if (strcmp (dentry->text, path) == 0) { + DEBUG (6, ("fake_share_stat: %s:%4o\n", + dentry->text, dentry->my_stat.st_mode)); + memcpy (buf, &dentry->my_stat, sizeof (struct stat)); + return 0; + } + dentry = dentry->next; + } + my_errno = ENOENT; + return -1; } /* stat a single file, get_remote_stat callback */ @@ -1486,6 +1504,7 @@ smbfs_stat (vfs * me, char *path, struct stat *buf) } return fake_server_stat (server_url, path, buf); } + if (!strchr (++pp, '/')) { return fake_share_stat (server_url, path, buf); }