x
diff --git a/lib/fuse.c b/lib/fuse.c
index e645a71..3f8a46b 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -354,33 +354,28 @@
     }
                 
     res = write(f->fd, outbuf, outsize);
-    if(res == -1)
-        perror("writing fuse device");
+    if(res == -1) {
+        /* ENOENT means the operation was interrupted */
+        if(errno != ENOENT)
+            perror("writing fuse device");
+    }
 
     free(outbuf);
 }
 
-static void fill_cred(struct fuse_in_header *in, struct fuse_cred *cred)
-{
-    cred->uid = in->uid;
-    cred->gid = in->gid;
-}
-
 static void do_lookup(struct fuse *f, struct fuse_in_header *in, char *name)
 {
     int res;
     char *path;
     struct stat buf;
     struct fuse_lookup_out arg;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path_name(f, in->ino, name);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.getattr)
-            res = f->op.getattr(&cred, path, &buf);
+            res = f->op.getattr(path, &buf);
         free(path);
     }
     if(res == 0) {
@@ -402,15 +397,13 @@
     char *path;
     struct stat buf;
     struct fuse_getattr_out arg;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.getattr)
-            res = f->op.getattr(&cred, path, &buf);
+            res = f->op.getattr(path, &buf);
         free(path);
     }
     if(res == 0) 
@@ -419,20 +412,19 @@
     send_reply(f, in, res, &arg, sizeof(arg));
 }
 
-int do_chmod(struct fuse *f, struct fuse_cred *cred, const char *path,
-             struct fuse_attr *attr)
+int do_chmod(struct fuse *f, const char *path, struct fuse_attr *attr)
 {
     int res;
 
     res = -ENOSYS;
     if(f->op.chmod)
-        res = f->op.chmod(cred, path, attr->mode);
+        res = f->op.chmod(path, attr->mode);
 
     return res;
 }        
 
-int do_chown(struct fuse *f, struct fuse_cred *cred, const char *path,
-             struct fuse_attr *attr, int valid)
+int do_chown(struct fuse *f, const char *path, struct fuse_attr *attr,
+             int valid)
 {
     int res;
     uid_t uid = (valid & FATTR_UID) ? attr->uid : (uid_t) -1;
@@ -440,25 +432,23 @@
     
     res = -ENOSYS;
     if(f->op.chown)
-        res = f->op.chown(cred, path, uid, gid);
+        res = f->op.chown(path, uid, gid);
 
     return res;
 }
 
-int do_truncate(struct fuse *f, struct fuse_cred *cred, const char *path,
-                struct fuse_attr *attr)
+int do_truncate(struct fuse *f, const char *path, struct fuse_attr *attr)
 {
     int res;
 
     res = -ENOSYS;
     if(f->op.truncate)
-        res = f->op.truncate(cred, path, attr->size);
+        res = f->op.truncate(path, attr->size);
 
     return res;
 }
 
-int do_utime(struct fuse *f, struct fuse_cred *cred, const char *path,
-             struct fuse_attr *attr)
+int do_utime(struct fuse *f, const char *path, struct fuse_attr *attr)
 {
     int res;
     struct utimbuf buf;
@@ -466,7 +456,7 @@
     buf.modtime = attr->mtime;
     res = -ENOSYS;
     if(f->op.utime)
-        res = f->op.utime(cred, path, &buf);
+        res = f->op.utime(path, &buf);
 
     return res;
 }
@@ -479,9 +469,7 @@
     int valid = arg->valid;
     struct fuse_attr *attr = &arg->attr;
     struct fuse_setattr_out outarg;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
@@ -489,16 +477,16 @@
         if(f->op.getattr) {
             res = 0;
             if(!res && (valid & FATTR_MODE))
-                res = do_chmod(f, &cred, path, attr);
+                res = do_chmod(f, path, attr);
             if(!res && (valid & (FATTR_UID | FATTR_GID)))
-                res = do_chown(f, &cred, path, attr, valid);
+                res = do_chown(f, path, attr, valid);
             if(!res && (valid & FATTR_SIZE))
-                res = do_truncate(f, &cred, path, attr);
+                res = do_truncate(f, path, attr);
             if(!res && (valid & FATTR_UTIME))
-                res = do_utime(f, &cred, path, attr);
+                res = do_utime(f, path, attr);
             if(!res) {
                 struct stat buf;
-                res = f->op.getattr(&cred, path, &buf);
+                res = f->op.getattr(path, &buf);
                 if(!res)
                     convert_stat(&buf, &outarg.attr);
             }
@@ -513,15 +501,13 @@
     int res;
     char link[PATH_MAX + 1];
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.readlink)
-            res = f->op.readlink(&cred, path, link, sizeof(link));
+            res = f->op.readlink(path, link, sizeof(link));
         free(path);
     }
     link[PATH_MAX] = '\0';
@@ -534,9 +520,7 @@
     struct fuse_getdir_out arg;
     struct fuse_dirhandle dh;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     dh.fuse = f;
     dh.fp = tmpfile();
     dh.dir = in->ino;
@@ -545,7 +529,7 @@
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.getdir)
-            res = f->op.getdir(&cred, path, &dh, (fuse_dirfil_t) fill_dir);
+            res = f->op.getdir(path, &dh, (fuse_dirfil_t) fill_dir);
         free(path);
     }
     fflush(dh.fp);
@@ -561,17 +545,15 @@
     char *path;
     struct fuse_mknod_out outarg;
     struct stat buf;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path_name(f, in->ino, inarg->name);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.mknod && f->op.getattr) {
-            res = f->op.mknod(&cred, path, inarg->mode, inarg->rdev);
+            res = f->op.mknod(path, inarg->mode, inarg->rdev);
             if(res == 0)
-                res = f->op.getattr(&cred, path, &buf);
+                res = f->op.getattr(path, &buf);
         }
         free(path);
     }
@@ -589,15 +571,13 @@
 {
     int res;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path_name(f, in->ino, inarg->name);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.mkdir)
-            res = f->op.mkdir(&cred, path, inarg->mode);
+            res = f->op.mkdir(path, inarg->mode);
         free(path);
     }
     send_reply(f, in, res, NULL, 0);
@@ -607,20 +587,18 @@
 {
     int res;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path_name(f, in->ino, name);
     if(path != NULL) {
         res = -ENOSYS;
         if(in->opcode == FUSE_UNLINK) {
             if(f->op.unlink)
-                res = f->op.unlink(&cred, path);
+                res = f->op.unlink(path);
         }
         else {
             if(f->op.rmdir)
-                res = f->op.rmdir(&cred, path);
+                res = f->op.rmdir(path);
         }
         free(path);
     }
@@ -634,15 +612,13 @@
 {
     int res;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path_name(f, in->ino, name);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.symlink)
-            res = f->op.symlink(&cred, link, path);
+            res = f->op.symlink(link, path);
         free(path);
     }
     send_reply(f, in, res, NULL, 0);
@@ -658,9 +634,7 @@
     char *newname = inarg->names + strlen(oldname) + 1;
     char *oldpath;
     char *newpath;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     oldpath = get_path_name(f, olddir, oldname);
     if(oldpath != NULL) {
@@ -668,7 +642,7 @@
         if(newpath != NULL) {
             res = -ENOSYS;
             if(f->op.rename)
-                res = f->op.rename(&cred, oldpath, newpath);
+                res = f->op.rename(oldpath, newpath);
             if(res == 0)
                 rename_node(f, olddir, oldname, newdir, newname);
             free(newpath);
@@ -684,9 +658,7 @@
     int res;
     char *oldpath;
     char *newpath;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     oldpath = get_path(f, in->ino);
     if(oldpath != NULL) {
@@ -694,7 +666,7 @@
         if(newpath != NULL) {
             res = -ENOSYS;
             if(f->op.link)
-                res = f->op.link(&cred, oldpath, newpath);
+                res = f->op.link(oldpath, newpath);
             free(newpath);
         }
         free(oldpath);
@@ -707,15 +679,13 @@
 {
     int res;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.open)
-            res = f->op.open(&cred, path, arg->flags);
+            res = f->op.open(path, arg->flags);
         free(path);
     }
     send_reply(f, in, res, NULL, 0);
@@ -728,15 +698,13 @@
     char *path;
     char *buf = (char *) malloc(arg->size);
     size_t size;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.read)
-            res = f->op.read(&cred, path, buf, arg->size, arg->offset);
+            res = f->op.read(path, buf, arg->size, arg->offset);
         free(path);
     }
     
@@ -755,15 +723,13 @@
 {
     int res;
     char *path;
-    struct fuse_cred cred;
 
-    fill_cred(in, &cred);
     res = -ENOENT;
     path = get_path(f, in->ino);
     if(path != NULL) {
         res = -ENOSYS;
         if(f->op.write)
-            res = f->op.write(&cred, path, arg->buf, arg->size, arg->offset);
+            res = f->op.write(path, arg->buf, arg->size, arg->offset);
         free(path);
     }
     
@@ -905,11 +871,13 @@
         res = read(f->fd, inbuf, sizeof(inbuf));
         if(res == -1) {
             perror("reading fuse device");
-            continue;
+            /* BAD... This will happen again */
+            exit(1);
         }
         if((size_t) res < sizeof(struct fuse_in_header)) {
             fprintf(stderr, "short read on fuse device\n");
-            continue;
+            /* Cannot happen */
+            exit(1);
         }
 
         cmd = (struct cmd *) malloc(sizeof(struct cmd));