X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=fuse%2Fguestmount.c;h=ba0d626ca66ce1276f95258907555bb1adf22d49;hp=c7220c0811c7f969c0a4cd35f993d4a8e3c6cb2e;hb=5c2da21b2ae56adc16bbd5bf9740a04ca70f9f19;hpb=9a8889e4d0c532b9f77af3a9cc7aae06adebfb83 diff --git a/fuse/guestmount.c b/fuse/guestmount.c index c7220c0..ba0d626 100644 --- a/fuse/guestmount.c +++ b/fuse/guestmount.c @@ -46,6 +46,7 @@ #include "progname.h" +#include "guestmount.h" #include "dircache.h" /* See */ @@ -53,21 +54,6 @@ #define ENOATTR ENODATA #endif -#ifdef HAVE_GETTEXT -#include "gettext.h" -#define _(str) dgettext(PACKAGE, (str)) -//#define N_(str) dgettext(PACKAGE, (str)) -#else -#define _(str) str -//#define N_(str) str -#endif - -static inline char * -bad_cast (char const *s) -{ - return (char *) s; -} - static guestfs_h *g = NULL; static int read_only = 0; int verbose = 0; @@ -360,8 +346,10 @@ fg_readlink (const char *path, char *buf, size_t size) memcpy (buf, r, len); buf[len] = '\0'; - if (free_it) - free ((char *) r); + if (free_it) { + char *tmp = (char *) r; + free (tmp); + } return 0; } @@ -439,7 +427,7 @@ fg_symlink (const char *from, const char *to) dir_cache_invalidate (to); - r = guestfs_ln_s (g, to, from); + r = guestfs_ln_s (g, from, to); if (r == -1) return error (); @@ -453,6 +441,7 @@ fg_rename (const char *from, const char *to) if (read_only) return -EROFS; + dir_cache_invalidate (from); dir_cache_invalidate (to); /* XXX It's not clear how close the 'mv' command is to the @@ -473,9 +462,10 @@ fg_link (const char *from, const char *to) if (read_only) return -EROFS; + dir_cache_invalidate (from); dir_cache_invalidate (to); - r = guestfs_ln (g, to, from); + r = guestfs_ln (g, from, to); if (r == -1) return error (); @@ -630,8 +620,14 @@ fg_read (const char *path, char *buf, size_t size, off_t offset, if (size > limit) size = limit; + /* Note the correct error handling here is tricky, because in the + * case where the call returns a zero-length buffer, it might return + * NULL. However it won't adjust rsize along the error path, so we + * can set rsize to something beforehand and use that as a flag. + */ + rsize = 1; r = guestfs_pread (g, path, size, offset, &rsize); - if (r == NULL) + if (rsize == 1 && r == NULL) return error (); /* This should never happen, but at least it stops us overflowing