aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_kern_chan.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-03-01 12:10:13 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2006-03-01 12:10:13 +0000
commit5d9ce36da4688ba2c14f658ed40b5b4ad971879b (patch)
tree379c5435a0741965848f8eb2449bef9c8b4d080c /lib/fuse_kern_chan.c
parentee588c01dca3991807aea456a66246ff8ad0c332 (diff)
downloadandroid_external_fuse-5d9ce36da4688ba2c14f658ed40b5b4ad971879b.tar.gz
android_external_fuse-5d9ce36da4688ba2c14f658ed40b5b4ad971879b.tar.bz2
android_external_fuse-5d9ce36da4688ba2c14f658ed40b5b4ad971879b.zip
fix
Diffstat (limited to 'lib/fuse_kern_chan.c')
-rw-r--r--lib/fuse_kern_chan.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/fuse_kern_chan.c b/lib/fuse_kern_chan.c
index d58c8b2..fe7d252 100644
--- a/lib/fuse_kern_chan.c
+++ b/lib/fuse_kern_chan.c
@@ -16,26 +16,33 @@
static int fuse_kern_chan_receive(struct fuse_chan *ch, char *buf, size_t size)
{
- ssize_t res = read(fuse_chan_fd(ch), buf, size);
- int err = errno;
+ int err;
+ ssize_t res;
struct fuse_session *se = fuse_chan_session(ch);
-
assert(se != NULL);
+
+ restart:
+ res = read(fuse_chan_fd(ch), buf, size);
+ err = errno;
+
if (fuse_session_exited(se))
return 0;
if (res == -1) {
- /* EINTR means, the read() was interrupted, ENOENT means the
- operation was interrupted */
- if (err == EINTR || err == ENOENT)
- return 0;
- /* ENODEV means we got unmounted, so we silently return failure */
- if (err != ENODEV)
+ /* ENOENT means the operation was interrupted, it's safe
+ to restart */
+ if (err == ENOENT)
+ goto restart;
+
+ /* Errors occuring during normal operation: EINTR (read
+ interrupted), EAGAIN (nonblocking I/O), ENODEV (filesystem
+ umounted) */
+ if (err != EINTR && err != EAGAIN && err != ENODEV)
perror("fuse: reading device");
- return -1;
+ return -err;
}
if ((size_t) res < sizeof(struct fuse_in_header)) {
fprintf(stderr, "short read on fuse device\n");
- return -1;
+ return -EIO;
}
return res;
}