summaryrefslogtreecommitdiff
path: root/sys/src/cmd/unix/drawterm/kern/devlfd.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/unix/drawterm/kern/devlfd.c126
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,
+};