mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
* vfs.h: Remove vfs_uid and vfs_gid. Fix all dependencies.
This commit is contained in:
parent
34e6f513ed
commit
b9c6a9b3d1
@ -1,3 +1,7 @@
|
||||
2002-12-05 Pavel Roskin <proski@gnu.org>
|
||||
|
||||
* vfs.h: Remove vfs_uid and vfs_gid. Fix all dependencies.
|
||||
|
||||
2002-12-05 Andrew V. Samoilov <sav@bcs.zp.ua>
|
||||
|
||||
* extfs.c (open_archive): Use open_error_pipe before popen() and
|
||||
|
18
vfs/cpio.c
18
vfs/cpio.c
@ -541,18 +541,18 @@ static void *cpio_super_check(vfs *me, char *archive_name, char *op)
|
||||
return &sb;
|
||||
}
|
||||
|
||||
static int cpio_super_same(vfs *me, struct vfs_s_super *parc, char *archive_name, char *op, void *cookie)
|
||||
{
|
||||
static int
|
||||
cpio_super_same (vfs *me, struct vfs_s_super *parc, char *archive_name,
|
||||
char *op, void *cookie)
|
||||
{
|
||||
struct stat *archive_stat = cookie; /* stat of main archive */
|
||||
|
||||
if(strcmp(parc->name, archive_name)) return 0;
|
||||
if (strcmp (parc->name, archive_name))
|
||||
return 0;
|
||||
|
||||
if(vfs_uid && (!(archive_stat->st_mode & 0004)))
|
||||
if((archive_stat->st_gid != vfs_gid) || !(archive_stat->st_mode & 0040))
|
||||
if((archive_stat->st_uid != vfs_uid) || !(archive_stat->st_mode & 0400))
|
||||
return 0;
|
||||
/* Has the cached archive been changed on the disk? */
|
||||
if(parc->u.cpio.stat.st_mtime < archive_stat->st_mtime) { /* Yes, reload! */
|
||||
/* Has the cached archive been changed on the disk? */
|
||||
if (parc->u.cpio.stat.st_mtime < archive_stat->st_mtime) {
|
||||
/* Yes, reload! */
|
||||
(*vfs_cpiofs_ops.free) ((vfsid) parc);
|
||||
vfs_rmstamp (&vfs_cpiofs_ops, (vfsid) parc, 0);
|
||||
return 2;
|
||||
|
60
vfs/extfs.c
60
vfs/extfs.c
@ -398,11 +398,13 @@ static int read_archive (int fstype, char *name, struct archive **pparc)
|
||||
static char *get_path (char *inname, struct archive **archive, int is_dir,
|
||||
int do_not_open);
|
||||
|
||||
/* Returns path inside argument. Returned char* is inside inname, which is mangled
|
||||
* by this operation (so you must not free it's return value)
|
||||
/*
|
||||
* Return path inside argument. Returned char* is inside inname, which is mangled
|
||||
* by this operation, so don't free the return value.
|
||||
*/
|
||||
static char *get_path_mangle (char *inname, struct archive **archive, int is_dir,
|
||||
int do_not_open)
|
||||
static char *
|
||||
get_path_mangle (char *inname, struct archive **archive, int is_dir,
|
||||
int do_not_open)
|
||||
{
|
||||
char *local, *archive_name, *op;
|
||||
int result = -1;
|
||||
@ -410,44 +412,38 @@ static char *get_path_mangle (char *inname, struct archive **archive, int is_dir
|
||||
struct vfs_stamping *parent;
|
||||
vfs *v;
|
||||
int fstype;
|
||||
|
||||
archive_name = inname;
|
||||
vfs_split( inname, &local, &op );
|
||||
fstype = extfs_which( NULL, op ); /* FIXME: we really should pass
|
||||
self pointer. But as we know that extfs_which does not touch vfs
|
||||
*me, it does not matter for now */
|
||||
if (fstype == -1)
|
||||
return NULL;
|
||||
if (!local)
|
||||
local = "";
|
||||
|
||||
/* All filesystems should have some local archive, at least
|
||||
archive_name = inname;
|
||||
vfs_split (inname, &local, &op);
|
||||
|
||||
/*
|
||||
* FIXME: we really should pass self pointer. But as we know that
|
||||
* extfs_which does not touch vfs *me, it does not matter for now
|
||||
*/
|
||||
fstype = extfs_which (NULL, op);
|
||||
|
||||
if (fstype == -1)
|
||||
return NULL;
|
||||
if (!local)
|
||||
local = "";
|
||||
|
||||
/*
|
||||
* All filesystems should have some local archive, at least
|
||||
* it can be '/'.
|
||||
*
|
||||
* Actually, we should implement an alias mechanism that would
|
||||
* translate: "a:" to "dos:a.
|
||||
*
|
||||
*/
|
||||
for (parc = first_archive; parc != NULL; parc = parc->next)
|
||||
if (parc->name) {
|
||||
if (parc->name) {
|
||||
if (!strcmp (parc->name, archive_name)) {
|
||||
struct stat *s=&(parc->extfsstat);
|
||||
if (vfs_uid && (!(s->st_mode & 0004)))
|
||||
if ((s->st_gid != vfs_gid) || !(s->st_mode & 0040))
|
||||
if ((s->st_uid != vfs_uid) || !(s->st_mode & 0400))
|
||||
return NULL;
|
||||
/* This is not too secure - in some cases (/#mtools) files created
|
||||
under user a are probably visible to everyone else since / usually
|
||||
has permissions 755 */
|
||||
vfs_stamp (&vfs_extfs_ops, (vfsid) parc);
|
||||
vfs_stamp (&vfs_extfs_ops, (vfsid) parc);
|
||||
goto return_success;
|
||||
}
|
||||
}
|
||||
|
||||
result = do_not_open ? -1 : read_archive (fstype, archive_name, &parc);
|
||||
if (result == -1) ERRNOR (EIO, NULL);
|
||||
if (result == -1)
|
||||
ERRNOR (EIO, NULL);
|
||||
|
||||
if (archive_name){
|
||||
if (archive_name) {
|
||||
v = vfs_type (archive_name);
|
||||
if (v == &vfs_local_ops) {
|
||||
parent = NULL;
|
||||
@ -460,7 +456,7 @@ static char *get_path_mangle (char *inname, struct archive **archive, int is_dir
|
||||
vfs_add_noncurrent_stamps (&vfs_extfs_ops, (vfsid) parc, parent);
|
||||
vfs_rm_parents (parent);
|
||||
}
|
||||
return_success:
|
||||
return_success:
|
||||
*archive = parc;
|
||||
return local;
|
||||
}
|
||||
|
55
vfs/sfs.c
55
vfs/sfs.c
@ -107,18 +107,16 @@ static char *
|
||||
redirect (vfs *me, char *name)
|
||||
{
|
||||
struct cachedfile *cur = head;
|
||||
uid_t uid = vfs_uid;
|
||||
char *cache;
|
||||
int handle;
|
||||
|
||||
while (cur){
|
||||
if ((!strcmp (name, cur->name)) &&
|
||||
(uid == cur->uid) &&
|
||||
(uptodate (cur->name, cur->cache)))
|
||||
/* FIXME: when not uptodate, we might want to kill cache
|
||||
* file immediately, not to wait until timeout. */ {
|
||||
vfs_stamp (&vfs_sfs_ops, cur);
|
||||
return cur->cache;
|
||||
while (cur) {
|
||||
/* FIXME: when not uptodate, we might want to kill cache
|
||||
* file immediately, not to wait until timeout. */
|
||||
if ((!strcmp (name, cur->name)) && (cur->uid == 0)
|
||||
&& (uptodate (cur->name, cur->cache))) {
|
||||
vfs_stamp (&vfs_sfs_ops, cur);
|
||||
return cur->cache;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
@ -131,11 +129,11 @@ redirect (vfs *me, char *name)
|
||||
|
||||
close (handle);
|
||||
|
||||
if (!vfmake (me, name, cache)){
|
||||
if (!vfmake (me, name, cache)) {
|
||||
cur = g_new (struct cachedfile, 1);
|
||||
cur->name = g_strdup (name);
|
||||
cur->cache = cache;
|
||||
cur->uid = uid;
|
||||
cur->uid = 0;
|
||||
cur->next = head;
|
||||
head = cur;
|
||||
|
||||
@ -144,7 +142,7 @@ redirect (vfs *me, char *name)
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
|
||||
unlink (cache);
|
||||
g_free (cache);
|
||||
return "/I_MUST_NOT_EXIST";
|
||||
@ -207,16 +205,16 @@ static int sfs_readlink (vfs *me, char *path, char *buf, int size)
|
||||
return readlink (path, buf, size);
|
||||
}
|
||||
|
||||
static vfsid sfs_getid (vfs *me, char *path, struct vfs_stamping **parent)
|
||||
{ /* FIXME: what should I do? */
|
||||
static vfsid
|
||||
sfs_getid (vfs *me, char *path, struct vfs_stamping **parent)
|
||||
{ /* FIXME: what should I do? */
|
||||
vfs *v;
|
||||
vfsid id;
|
||||
struct vfs_stamping *par;
|
||||
struct cachedfile *cur = head;
|
||||
|
||||
while (cur) {
|
||||
if ((!strcmp( path, cur->name )) &&
|
||||
(vfs_uid == cur->uid))
|
||||
if ((!strcmp (path, cur->name)) && (cur->uid == 0))
|
||||
break;
|
||||
cur = cur->next;
|
||||
}
|
||||
@ -224,22 +222,27 @@ static vfsid sfs_getid (vfs *me, char *path, struct vfs_stamping **parent)
|
||||
*parent = NULL;
|
||||
|
||||
if (!cur)
|
||||
return (vfsid)(-1);
|
||||
return (vfsid) (-1);
|
||||
|
||||
{
|
||||
char *path2 = g_strdup (path);
|
||||
v = vfs_split (path2, NULL, NULL); /* Strip suffix which led to this being sfs */
|
||||
v = vfs_split (path2, NULL, NULL); /* ... and learn whoever was the parent system */
|
||||
char *path2 = g_strdup (path);
|
||||
|
||||
/* Strip suffix which led to this being sfs */
|
||||
v = vfs_split (path2, NULL, NULL);
|
||||
|
||||
/* ... and learn whoever was the parent system */
|
||||
v = vfs_split (path2, NULL, NULL);
|
||||
|
||||
id = (*v->getid) (v, path2, &par);
|
||||
g_free (path2);
|
||||
}
|
||||
|
||||
if (id != (vfsid)-1) {
|
||||
*parent = g_new (struct vfs_stamping, 1);
|
||||
(*parent)->v = v;
|
||||
(*parent)->id = id;
|
||||
(*parent)->parent = par;
|
||||
(*parent)->next = NULL;
|
||||
if (id != (vfsid) - 1) {
|
||||
*parent = g_new (struct vfs_stamping, 1);
|
||||
(*parent)->v = v;
|
||||
(*parent)->id = id;
|
||||
(*parent)->parent = par;
|
||||
(*parent)->next = NULL;
|
||||
}
|
||||
return (vfsid) cur;
|
||||
}
|
||||
|
18
vfs/tar.c
18
vfs/tar.c
@ -441,18 +441,18 @@ static void *tar_super_check(vfs *me, char *archive_name, char *op)
|
||||
return &stat_buf;
|
||||
}
|
||||
|
||||
static int tar_super_same(vfs *me, struct vfs_s_super *parc, char *archive_name, char *op, void *cookie)
|
||||
{
|
||||
static int
|
||||
tar_super_same (vfs *me, struct vfs_s_super *parc, char *archive_name,
|
||||
char *op, void *cookie)
|
||||
{
|
||||
struct stat *archive_stat = cookie; /* stat of main archive */
|
||||
|
||||
if (strcmp (parc->name, archive_name)) return 0;
|
||||
if (strcmp (parc->name, archive_name))
|
||||
return 0;
|
||||
|
||||
if (vfs_uid && (!(archive_stat->st_mode & 0004)))
|
||||
if ((archive_stat->st_gid != vfs_gid) || !(archive_stat->st_mode & 0040))
|
||||
if ((archive_stat->st_uid != vfs_uid) || !(archive_stat->st_mode & 0400))
|
||||
return 0;
|
||||
/* Has the cached archive been changed on the disk? */
|
||||
if (parc->u.tar.tarstat.st_mtime < archive_stat->st_mtime) { /* Yes, reload! */
|
||||
/* Has the cached archive been changed on the disk? */
|
||||
if (parc->u.tar.tarstat.st_mtime < archive_stat->st_mtime) {
|
||||
/* Yes, reload! */
|
||||
(*vfs_tarfs_ops.free) ((vfsid) parc);
|
||||
vfs_rmstamp (&vfs_tarfs_ops, (vfsid) parc, 0);
|
||||
return 2;
|
||||
|
Loading…
Reference in New Issue
Block a user