Sets ENOENT when appropriate
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 25 Jan 2014 01:10:37 +0000 (17:10 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 25 Jan 2014 01:10:37 +0000 (17:10 -0800)
Userspace will often require ENOENT be set after syscalls fail in a
certain way.  For instance, cp stats the destination, and if it gets a
generic error, the program aborts.  It ought to get ENOENT (or success).

We'll run into this in any place where userspace makes decisions based
on errno.

kern/drivers/dev/dev.c
kern/drivers/dev/tab.c
kern/src/net/netif.c

index 4aebdb3..286080f 100644 (file)
@@ -203,6 +203,7 @@ devwalk(struct chan *c,
                        case -1:
                                printd("DEVWALK -1, i was %d, want path %p\n", i, c->qid.path);
                        Notfound:
+                               set_errno(ENOENT);
                                if(j == 0)
                                        error(Enonexist);
                                set_errstr(Enonexist);
@@ -267,6 +268,7 @@ devstat(struct chan *c, uint8_t *db, int n,
                                return n;
                        }
                        printd("DEVSTAT fails:%c %llu\n", devtab[c->type].dc, c->qid.path);
+                       set_errno(ENOENT);
                        error(Enonexist);
                case 0:
                        printd("DEVSTAT got 0\n");
index 7593e36..f499506 100644 (file)
@@ -57,6 +57,7 @@ struct dev *devtabget(int dc, int user)
        }
 
        printk("devtabget FAILED %c\n", dc);
+       set_errno(ENOENT);
        error(Enonexist);
 }
 
index 57c430b..debcf1b 100644 (file)
@@ -376,8 +376,10 @@ netifwstat(struct netif *nif, struct chan *c, uint8_t *db, int n)
        int m;
 
        f = nif->f[NETID(c->qid.path)];
-       if(f == 0)
+       if(f == 0) {
+               set_errno(ENOENT);
                error(Enonexist);
+       }
 
        if(netown(f, current->user, OWRITE) < 0)
                error(Eperm);