mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-03 18:14:25 +03:00
extfs: refactoring: use GSList to store archive list.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
2d58e4d624
commit
7f9fb38176
@ -122,7 +122,6 @@ struct archive
|
|||||||
int fd_usage;
|
int fd_usage;
|
||||||
ino_t inode_counter;
|
ino_t inode_counter;
|
||||||
struct entry *root_entry;
|
struct entry *root_entry;
|
||||||
struct archive *next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -142,9 +141,10 @@ static gboolean notadir;
|
|||||||
static struct vfs_s_subclass extfs_subclass;
|
static struct vfs_s_subclass extfs_subclass;
|
||||||
static struct vfs_class *vfs_extfs_ops = (struct vfs_class *) &extfs_subclass;
|
static struct vfs_class *vfs_extfs_ops = (struct vfs_class *) &extfs_subclass;
|
||||||
|
|
||||||
static struct archive *first_archive = NULL;
|
static GSList *first_archive = NULL;
|
||||||
static int my_errno = 0;
|
static int my_errno = 0;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/*** file scope functions ************************************************************************/
|
/*** file scope functions ************************************************************************/
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
@ -155,6 +155,35 @@ static struct entry *extfs_resolve_symlinks_int (struct entry *entry, GSList * l
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static void
|
||||||
|
extfs_fill_name (void *data, void *user_data)
|
||||||
|
{
|
||||||
|
struct archive *a = (struct archive *) data;
|
||||||
|
fill_names_f func = (fill_names_f) user_data;
|
||||||
|
extfs_plugin_info_t *info;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
info = &g_array_index (extfs_plugins, extfs_plugin_info_t, a->fstype);
|
||||||
|
name =
|
||||||
|
g_strconcat (a->name != NULL ? a->name : "", PATH_SEP_STR, info->prefix,
|
||||||
|
VFS_PATH_URL_DELIMITER, (char *) NULL);
|
||||||
|
func (name);
|
||||||
|
g_free (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static gint
|
||||||
|
extfs_cmp_archive (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const struct archive *ar = (const struct archive *) a;
|
||||||
|
const char *archive_name = (const char *) b;
|
||||||
|
|
||||||
|
return (ar->name != NULL && strcmp (ar->name, archive_name) == 0) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
extfs_make_dots (struct entry *ent)
|
extfs_make_dots (struct entry *ent)
|
||||||
{
|
{
|
||||||
@ -349,23 +378,9 @@ extfs_find_entry (struct entry *dir, const char *name, gboolean make_dirs, gbool
|
|||||||
static void
|
static void
|
||||||
extfs_fill_names (struct vfs_class *me, fill_names_f func)
|
extfs_fill_names (struct vfs_class *me, fill_names_f func)
|
||||||
{
|
{
|
||||||
struct archive *a = first_archive;
|
|
||||||
|
|
||||||
(void) me;
|
(void) me;
|
||||||
|
|
||||||
while (a != NULL)
|
g_slist_foreach (first_archive, extfs_fill_name, func);
|
||||||
{
|
|
||||||
extfs_plugin_info_t *info;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
info = &g_array_index (extfs_plugins, extfs_plugin_info_t, a->fstype);
|
|
||||||
name =
|
|
||||||
g_strconcat (a->name ? a->name : "", PATH_SEP_STR, info->prefix, VFS_PATH_URL_DELIMITER,
|
|
||||||
(char *) NULL);
|
|
||||||
func (name);
|
|
||||||
g_free (name);
|
|
||||||
a = a->next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -374,6 +389,7 @@ static void
|
|||||||
extfs_free_archive (struct archive *archive)
|
extfs_free_archive (struct archive *archive)
|
||||||
{
|
{
|
||||||
extfs_free_entry (archive->root_entry);
|
extfs_free_entry (archive->root_entry);
|
||||||
|
|
||||||
if (archive->local_name != NULL)
|
if (archive->local_name != NULL)
|
||||||
{
|
{
|
||||||
struct stat my;
|
struct stat my;
|
||||||
@ -463,8 +479,7 @@ extfs_open_archive (int fstype, const char *name, struct archive **pparc)
|
|||||||
current_archive->inode_counter = 0;
|
current_archive->inode_counter = 0;
|
||||||
current_archive->fd_usage = 0;
|
current_archive->fd_usage = 0;
|
||||||
current_archive->rdev = archive_counter++;
|
current_archive->rdev = archive_counter++;
|
||||||
current_archive->next = first_archive;
|
first_archive = g_slist_prepend (first_archive, current_archive);
|
||||||
first_archive = current_archive;
|
|
||||||
mode = mystat.st_mode & 07777;
|
mode = mystat.st_mode & 07777;
|
||||||
if (mode & 0400)
|
if (mode & 0400)
|
||||||
mode |= 0100;
|
mode |= 0100;
|
||||||
@ -671,9 +686,10 @@ extfs_get_path_int (const vfs_path_t * vpath, struct archive **archive, gboolean
|
|||||||
{
|
{
|
||||||
char *archive_name;
|
char *archive_name;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
struct archive *parc;
|
GSList *parc;
|
||||||
int fstype;
|
int fstype;
|
||||||
const vfs_path_element_t *path_element;
|
const vfs_path_element_t *path_element;
|
||||||
|
struct archive *a = NULL;
|
||||||
|
|
||||||
path_element = vfs_path_get_by_index (vpath, -1);
|
path_element = vfs_path_get_by_index (vpath, -1);
|
||||||
|
|
||||||
@ -687,18 +703,16 @@ extfs_get_path_int (const vfs_path_t * vpath, struct archive **archive, gboolean
|
|||||||
* All filesystems should have some local archive, at least
|
* All filesystems should have some local archive, at least
|
||||||
* it can be PATH_SEP ('/').
|
* it can be PATH_SEP ('/').
|
||||||
*/
|
*/
|
||||||
for (parc = first_archive; parc != NULL; parc = parc->next)
|
parc = g_slist_find_custom (first_archive, archive_name, extfs_cmp_archive);
|
||||||
if (parc->name != NULL)
|
if (parc != NULL)
|
||||||
{
|
{
|
||||||
if (strcmp (parc->name, archive_name) == 0)
|
a = (struct archive *) parc->data;
|
||||||
{
|
vfs_stamp (vfs_extfs_ops, (vfsid) a);
|
||||||
vfs_stamp (vfs_extfs_ops, (vfsid) parc);
|
|
||||||
g_free (archive_name);
|
g_free (archive_name);
|
||||||
goto return_success;
|
goto return_success;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
result = do_not_open ? -1 : extfs_read_archive (fstype, archive_name, &parc);
|
result = do_not_open ? -1 : extfs_read_archive (fstype, archive_name, &a);
|
||||||
g_free (archive_name);
|
g_free (archive_name);
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
{
|
{
|
||||||
@ -707,7 +721,7 @@ extfs_get_path_int (const vfs_path_t * vpath, struct archive **archive, gboolean
|
|||||||
}
|
}
|
||||||
|
|
||||||
return_success:
|
return_success:
|
||||||
*archive = parc;
|
*archive = a;
|
||||||
return path_element->path;
|
return path_element->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1491,20 +1505,7 @@ extfs_free (vfsid id)
|
|||||||
{
|
{
|
||||||
struct archive *archive = (struct archive *) id;
|
struct archive *archive = (struct archive *) id;
|
||||||
|
|
||||||
if (archive == first_archive)
|
first_archive = g_slist_remove (first_archive, archive);
|
||||||
{
|
|
||||||
first_archive = archive->next;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct archive *parc;
|
|
||||||
for (parc = first_archive; parc != NULL; parc = parc->next)
|
|
||||||
if (parc->next == archive)
|
|
||||||
{
|
|
||||||
parc->next = archive->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
extfs_free_archive (archive);
|
extfs_free_archive (archive);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1680,15 +1681,10 @@ static void
|
|||||||
extfs_done (struct vfs_class *me)
|
extfs_done (struct vfs_class *me)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
struct archive *ar;
|
|
||||||
|
|
||||||
(void) me;
|
(void) me;
|
||||||
|
|
||||||
for (ar = first_archive; ar != NULL;)
|
g_slist_free_full (first_archive, (GDestroyNotify) extfs_free_archive);
|
||||||
{
|
|
||||||
extfs_free ((vfsid) ar);
|
|
||||||
ar = first_archive;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (extfs_plugins == NULL)
|
if (extfs_plugins == NULL)
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user