Fix problems with stating / of ftp server + NO_LOCALHASH to prevent
podfuk deadlocs
Этот коммит содержится в:
родитель
68b9a9e5c3
Коммит
a1225de8b3
@ -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)))
|
||||
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;
|
||||
}
|
||||
|
||||
|
60
vfs/local.c
60
vfs/local.c
@ -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
|
||||
};
|
||||
|
13
vfs/vfs.c
13
vfs/vfs.c
@ -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;
|
||||
@ -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 );
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user