1
1

Fix problems with stating / of ftp server + NO_LOCALHASH to prevent

podfuk deadlocs
Этот коммит содержится в:
Pavel Machek 2000-04-16 19:13:00 +00:00
родитель 68b9a9e5c3
Коммит a1225de8b3
5 изменённых файлов: 90 добавлений и 10 удалений

Просмотреть файл

@ -1,3 +1,11 @@
2000-04-16 Pavel Machek <pavel@bug.ucw.cz>
* vfs.c (vfs_type): FL_NO_LOCALHASH for prevention of obscure
deadlocks with podfuk
* direntry.c: fix behaviour when stating / directory of ftp
archive
2000-04-15 Timur Bakeyev <mc@bat.ru>
* ftpfs.c (netrc_next): "const char * keywords" is pretty nice.

Просмотреть файл

@ -581,7 +581,6 @@ vfs_s_inode_from_path (vfs *me, char *name, int flags)
return NULL;
return vfs_s_find_inode (me, super->root, q, flags & FL_FOLLOW ? LINK_FOLLOW : LINK_NO_FOLLOW, flags & ~FL_FOLLOW);
}
struct dirhandle {
@ -694,11 +693,18 @@ vfs_s_chdir (vfs *me, char *path)
static int
vfs_s_internal_stat (vfs *me, char *path, struct stat *buf, int flag)
{
char *path2;
struct vfs_s_inode *ino;
if (!(ino = vfs_s_inode_from_path (me, path, flag)))
return -1;
path2 = g_strdup(path);
if (!(ino = vfs_s_inode_from_path (me, path2, flag))) {
if (!(ino = vfs_s_inode_from_path (me, path, flag|FL_DIR))) {
g_free(path2);
return -1;
}
}
*buf = ino->st;
g_free(path2);
return 0;
}

Просмотреть файл

@ -352,3 +352,63 @@ vfs vfs_local_ops = {
local_munmap
#endif
};
vfs vfs_nil_ops = {
NULL, /* This is place of next pointer */
"Filesystem which just returns failure",
0, /* flags */
NULL, /* prefix */
NULL, /* data */
0, /* errno */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
local_getid,
local_nothingisopen,
local_free,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
#ifdef HAVE_MMAP
, NULL,
NULL
#endif
};

Просмотреть файл

@ -234,6 +234,7 @@ vfs_split (char *path, char **inpath, char **op)
return ret;
}
if (slash)
*slash = PATH_SEP;
ret = vfs_split (path, inpath, op);
@ -248,11 +249,9 @@ vfs_rosplit (char *path)
char *slash;
vfs *ret;
if (!path)
vfs_die ("Can not rosplit NULL");
g_return_val_if_fail(path, NULL);
semi = strrchr (path, '#');
if (!semi || !path_magic (path))
return NULL;
@ -262,6 +261,8 @@ vfs_rosplit (char *path)
*slash = 0;
ret = vfs_type_from_op (semi+1);
if (!ret && (vfs_flags & FL_NO_LOCALHASH))
return &vfs_nil_ops;
if (slash)
*slash = PATH_SEP;
@ -280,7 +281,7 @@ vfs_type (char *path)
vfs = vfs_rosplit(path);
if (!vfs)
vfs = &vfs_local_ops;
vfs = &vfs_local_ops;
return vfs;
}
@ -409,8 +410,10 @@ mc_open (const char *filename, int flags, ...)
mode = va_arg (ap, int);
va_end (ap);
if (!vfs->open)
vfs_die ("VFS must support open.\n");
if (!vfs->open) {
errno = -EOPNOTSUPP;
return -1;
}
info = (*vfs->open) (vfs, file, flags, mode); /* open must be supported */
g_free (file);

Просмотреть файл

@ -126,6 +126,7 @@ struct utimbuf {
/* Other file systems */
extern vfs vfs_local_ops;
extern vfs vfs_nil_ops;
extern vfs vfs_tarfs_ops;
extern vfs vfs_cpiofs_ops;
@ -369,8 +370,10 @@ extern gid_t vfs_gid;
#define FL_NO_SFS 64
#define FL_NO_FISH 128
#define FL_NO_LOCALHASH 0x20000000 /* When you never ever want vfs to work with regular files with # in name */
#define FL_NO_CWDSETUP 0x40000000
#ifdef VFS_STANDALONE
extern void mc_vfs_init( void );
extern void mc_vfs_done( void );