diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/unix/drawterm/kern/devlfd.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/unix/drawterm/kern/devlfd.c')
-rwxr-xr-x | sys/src/cmd/unix/drawterm/kern/devlfd.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/src/cmd/unix/drawterm/kern/devlfd.c b/sys/src/cmd/unix/drawterm/kern/devlfd.c new file mode 100755 index 000000000..7c61e0c1e --- /dev/null +++ b/sys/src/cmd/unix/drawterm/kern/devlfd.c @@ -0,0 +1,126 @@ +#include "u.h" +#include <errno.h> +#include "lib.h" +#include "dat.h" +#include "fns.h" +#include "error.h" + +#undef pread +#undef pwrite + +Chan* +lfdchan(int fd) +{ + Chan *c; + + c = newchan(); + c->type = devno('L', 0); + c->aux = (void*)(uintptr)fd; + c->name = newcname("fd"); + c->mode = ORDWR; + c->qid.type = 0; + c->qid.path = 0; + c->qid.vers = 0; + c->dev = 0; + c->offset = 0; + return c; +} + +int +lfdfd(int fd) +{ + return newfd(lfdchan(fd)); +} + +static Chan* +lfdattach(char *x) +{ + USED(x); + + error(Egreg); + return nil; +} + +static Walkqid* +lfdwalk(Chan *c, Chan *nc, char **name, int nname) +{ + USED(c); + USED(nc); + USED(name); + USED(nname); + + error(Egreg); + return nil; +} + +static int +lfdstat(Chan *c, uchar *dp, int n) +{ + USED(c); + USED(dp); + USED(n); + error(Egreg); + return -1; +} + +static Chan* +lfdopen(Chan *c, int omode) +{ + USED(c); + USED(omode); + + error(Egreg); + return nil; +} + +static void +lfdclose(Chan *c) +{ + close((int)(uintptr)c->aux); +} + +static long +lfdread(Chan *c, void *buf, long n, vlong off) +{ + USED(off); /* can't pread on pipes */ + n = read((int)(uintptr)c->aux, buf, n); + if(n < 0){ + iprint("error %d\n", errno); + oserror(); + } + return n; +} + +static long +lfdwrite(Chan *c, void *buf, long n, vlong off) +{ + USED(off); /* can't pread on pipes */ + + n = write((int)(uintptr)c->aux, buf, n); + if(n < 0){ + iprint("error %d\n", errno); + oserror(); + } + return n; +} + +Dev lfddevtab = { + 'L', + "lfd", + + devreset, + devinit, + devshutdown, + lfdattach, + lfdwalk, + lfdstat, + lfdopen, + devcreate, + lfdclose, + lfdread, + devbread, + lfdwrite, + devbwrite, + devremove, + devwstat, +}; |