* smbfs.c (new_dir_entry): New function with repeated code from
browsing_helper, loaddir_helper and server_browsing_helper. (browsing_helper): Use new_dir_entry. (loaddir_helper): Likewise. (server_browsing_helper): Likewise. (cached_lstat_info): Eliminated. (smbfs_readdir): Make dirent_dest static const. Eliminate cached_lstat_info. (smbfs_open_link): Make user parameter const. Fix memory leak. (fake_server_stat): Make path parameter const. Symplify. (smbfs_fstat): Set my_errno to EFAULT before return.
Этот коммит содержится в:
родитель
480dc4765f
Коммит
3002c837ab
60
vfs/smbfs.c
60
vfs/smbfs.c
@ -386,12 +386,10 @@ static opendir_info
|
|||||||
*current_server_info;
|
*current_server_info;
|
||||||
|
|
||||||
static gboolean first_direntry;
|
static gboolean first_direntry;
|
||||||
/* browse for shares on server */
|
|
||||||
static void
|
|
||||||
browsing_helper(const char *name, uint32 type, const char *comment)
|
|
||||||
{
|
|
||||||
char *typestr = "";
|
|
||||||
|
|
||||||
|
static dir_entry *
|
||||||
|
new_dir_entry (const char * name)
|
||||||
|
{
|
||||||
dir_entry *new_entry;
|
dir_entry *new_entry;
|
||||||
new_entry = g_new0 (dir_entry, 1);
|
new_entry = g_new0 (dir_entry, 1);
|
||||||
new_entry->text = dos_to_unix (g_strdup (name), 1);
|
new_entry->text = dos_to_unix (g_strdup (name), 1);
|
||||||
@ -404,6 +402,17 @@ browsing_helper(const char *name, uint32 type, const char *comment)
|
|||||||
}
|
}
|
||||||
current_info->current = new_entry;
|
current_info->current = new_entry;
|
||||||
|
|
||||||
|
return new_entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* browse for shares on server */
|
||||||
|
static void
|
||||||
|
browsing_helper(const char *name, uint32 type, const char *comment)
|
||||||
|
{
|
||||||
|
char *typestr = "";
|
||||||
|
|
||||||
|
dir_entry *new_entry = new_dir_entry (name);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case STYPE_DISKTREE:
|
case STYPE_DISKTREE:
|
||||||
typestr = "Disk";
|
typestr = "Disk";
|
||||||
@ -429,16 +438,7 @@ loaddir_helper(file_info *finfo, const char *mask)
|
|||||||
if (finfo->mode & aHIDDEN)
|
if (finfo->mode & aHIDDEN)
|
||||||
return; /* don't bother with hidden files, "~$" screws up mc */
|
return; /* don't bother with hidden files, "~$" screws up mc */
|
||||||
#endif
|
#endif
|
||||||
new_entry = g_new0 (dir_entry, 1);
|
new_entry = new_dir_entry (finfo->name);
|
||||||
new_entry->text = dos_to_unix (g_strdup(finfo->name), 1);
|
|
||||||
|
|
||||||
if (first_direntry) {
|
|
||||||
current_info->entries = new_entry;
|
|
||||||
first_direntry = FALSE;
|
|
||||||
} else {
|
|
||||||
current_info->current->next = new_entry;
|
|
||||||
}
|
|
||||||
current_info->current = new_entry;
|
|
||||||
|
|
||||||
new_entry->my_stat.st_size = finfo->size;
|
new_entry->my_stat.st_size = finfo->size;
|
||||||
new_entry->my_stat.st_mtime = finfo->mtime;
|
new_entry->my_stat.st_mtime = finfo->mtime;
|
||||||
@ -501,17 +501,7 @@ convert_path(char **remote_file, gboolean trailing_asterik)
|
|||||||
static void
|
static void
|
||||||
server_browsing_helper(const char *name, uint32 m, const char *comment)
|
server_browsing_helper(const char *name, uint32 m, const char *comment)
|
||||||
{
|
{
|
||||||
dir_entry *new_entry;
|
dir_entry *new_entry = new_dir_entry (name);
|
||||||
new_entry = g_new0 (dir_entry, 1);
|
|
||||||
new_entry->text = dos_to_unix (g_strdup (name), 1);
|
|
||||||
|
|
||||||
if (first_direntry) {
|
|
||||||
current_info->entries = new_entry;
|
|
||||||
first_direntry = FALSE;
|
|
||||||
} else {
|
|
||||||
current_info->current->next = new_entry;
|
|
||||||
}
|
|
||||||
current_info->current = new_entry;
|
|
||||||
|
|
||||||
/* show this as dir */
|
/* show this as dir */
|
||||||
new_entry->my_stat.st_mode = S_IFDIR|S_IRUSR|S_IRGRP|S_IROTH;
|
new_entry->my_stat.st_mode = S_IFDIR|S_IRUSR|S_IRGRP|S_IROTH;
|
||||||
@ -740,11 +730,10 @@ static struct {
|
|||||||
/* The readdir routine loads the complete directory */
|
/* The readdir routine loads the complete directory */
|
||||||
/* It's too slow to ask the server each time */
|
/* It's too slow to ask the server each time */
|
||||||
/* It now also sends the complete lstat information for each file */
|
/* It now also sends the complete lstat information for each file */
|
||||||
static struct stat *cached_lstat_info;
|
|
||||||
static void *
|
static void *
|
||||||
smbfs_readdir (void *info)
|
smbfs_readdir (void *info)
|
||||||
{
|
{
|
||||||
char *dirent_dest;
|
static char * const dirent_dest = &(smbfs_readdir_data.dent.d_name [0]);
|
||||||
opendir_info *smbfs_info = (opendir_info *) info;
|
opendir_info *smbfs_info = (opendir_info *) info;
|
||||||
|
|
||||||
DEBUG(4, ("smbfs_readdir(%s)\n", smbfs_info->dirname));
|
DEBUG(4, ("smbfs_readdir(%s)\n", smbfs_info->dirname));
|
||||||
@ -756,15 +745,12 @@ smbfs_readdir (void *info)
|
|||||||
if (smbfs_info->current == 0) { /* reached end of dir entries */
|
if (smbfs_info->current == 0) { /* reached end of dir entries */
|
||||||
DEBUG(3, ("smbfs_readdir: smbfs_info->current = 0\n"));
|
DEBUG(3, ("smbfs_readdir: smbfs_info->current = 0\n"));
|
||||||
#ifdef SMBFS_FREE_DIR
|
#ifdef SMBFS_FREE_DIR
|
||||||
cached_lstat_info = 0;
|
|
||||||
smbfs_free_dir (smbfs_info->entries);
|
smbfs_free_dir (smbfs_info->entries);
|
||||||
smbfs_info->entries = 0;
|
smbfs_info->entries = 0;
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
dirent_dest = &(smbfs_readdir_data.dent.d_name [0]);
|
|
||||||
pstrcpy (dirent_dest, smbfs_info->current->text);
|
pstrcpy (dirent_dest, smbfs_info->current->text);
|
||||||
cached_lstat_info = &smbfs_info->current->my_stat;
|
|
||||||
smbfs_info->current = smbfs_info->current->next;
|
smbfs_info->current = smbfs_info->current->next;
|
||||||
|
|
||||||
#ifndef DIRENT_LENGTH_COMPUTED
|
#ifndef DIRENT_LENGTH_COMPUTED
|
||||||
@ -1029,7 +1015,7 @@ smbfs_get_free_bucket ()
|
|||||||
/* This routine keeps track of open connections */
|
/* This routine keeps track of open connections */
|
||||||
/* Returns a connected socket to host */
|
/* Returns a connected socket to host */
|
||||||
static smbfs_connection *
|
static smbfs_connection *
|
||||||
smbfs_open_link(char *host, char *path, char *user, int *port, char *this_pass)
|
smbfs_open_link(char *host, char *path, const char *user, int *port, char *this_pass)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
smbfs_connection *bucket;
|
smbfs_connection *bucket;
|
||||||
@ -1055,7 +1041,7 @@ smbfs_open_link(char *host, char *path, char *user, int *port, char *this_pass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (got_user)
|
if (got_user)
|
||||||
user = g_strdup(username); /* global from getenv */
|
user = username; /* global from getenv */
|
||||||
|
|
||||||
/* Is the link actually open? */
|
/* Is the link actually open? */
|
||||||
if (smbfs_get_free_bucket_init) {
|
if (smbfs_get_free_bucket_init) {
|
||||||
@ -1215,13 +1201,13 @@ smbfs_opendir (vfs *me, char *dirname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
fake_server_stat(char *server_url, char *path, struct stat *buf)
|
fake_server_stat(char *server_url, const char *path, struct stat *buf)
|
||||||
{
|
{
|
||||||
dir_entry *dentry;
|
dir_entry *dentry;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
while ((p = strchr(path, '/')))
|
if ((p = strrchr(path, '/')))
|
||||||
path++; /* advance until last '/' */
|
path = p + 1; /* advance until last '/' */
|
||||||
|
|
||||||
if (!current_info->entries) {
|
if (!current_info->entries) {
|
||||||
if (!smbfs_loaddir(current_info)); /* browse host */
|
if (!smbfs_loaddir(current_info)); /* browse host */
|
||||||
@ -1875,8 +1861,8 @@ smbfs_fstat (void *data, struct stat *buf)
|
|||||||
if (single_entry)
|
if (single_entry)
|
||||||
memcpy(buf, &single_entry->my_stat, sizeof(struct stat));
|
memcpy(buf, &single_entry->my_stat, sizeof(struct stat));
|
||||||
else { /* single_entry not set up: bug */
|
else { /* single_entry not set up: bug */
|
||||||
|
my_errno = EFAULT;
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
my_errno = -EFAULT;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user