X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fuse%2Fguestmount.c;h=8fe91220021284ca75bf061a9fca9b7982614536;hb=bc484e99c23842aa67d2b533023eeaaa30fd6868;hp=1b3abf9788734572e2bf4e287a8890064cf23340;hpb=2c4a7ef92a4583a1217213573ad406eb5d745990;p=libguestfs.git diff --git a/fuse/guestmount.c b/fuse/guestmount.c index 1b3abf9..8fe9122 100644 --- a/fuse/guestmount.c +++ b/fuse/guestmount.c @@ -535,53 +535,16 @@ fg_utimens (const char *path, const struct timespec ts[2]) return 0; } -/* This call is quite hard to emulate through the guestfs(3) API. In - * one sense it's a little like access (see above) because it tests - * whether opening a file would succeed given the flags. But it also - * has side effects such as truncating the file if O_TRUNC is given. - * Therefore we need to emulate it ... painfully. +/* All this function needs to do is to check that the requested open + * flags are valid. See the notes in . */ static int fg_open (const char *path, struct fuse_file_info *fi) { - int r, exists; + int flags = fi->flags & 3; - if (fi->flags & O_WRONLY) { - if (read_only) - return -EROFS; - } - - exists = guestfs_exists (g, path); - if (exists == -1) - return error (); - - if (fi->flags & O_CREAT) { - if (read_only) - return -EROFS; - - dir_cache_invalidate (path); - - /* Exclusive? File must not exist already. */ - if (fi->flags & O_EXCL) { - if (exists) - return -EEXIST; - } - - /* Create? Touch it and optionally truncate it. */ - r = guestfs_touch (g, path); - if (r == -1) - return error (); - - if (fi->flags & O_TRUNC) { - r = guestfs_truncate (g, path); - if (r == -1) - return error (); - } - } else { - /* Not create, just check it exists. */ - if (!exists) - return -ENOENT; - } + if (read_only && flags != O_RDONLY) + return -EROFS; return 0; }