diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-03-01 12:10:13 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2006-03-01 12:10:13 +0000 |
commit | 5d9ce36da4688ba2c14f658ed40b5b4ad971879b (patch) | |
tree | 379c5435a0741965848f8eb2449bef9c8b4d080c /lib/fuse_kern_chan.c | |
parent | ee588c01dca3991807aea456a66246ff8ad0c332 (diff) | |
download | android_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.c | 29 |
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; } |