summaryrefslogtreecommitdiff
path: root/sys/src/cmd/5e/sys.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-06-25 16:17:20 +0200
committeraiju <aiju@phicode.de>2011-06-25 16:17:20 +0200
commit0b22dfd1f69985aabc5af37dca8a217a1e6e54e9 (patch)
tree577216074a5edb2402525c2d219ad8a96af8f9d7 /sys/src/cmd/5e/sys.c
parentb4ae96bcb95e76293a81241bf6edebf27cab7e35 (diff)
5e: added note support
added wstat / fwstat / alarm
Diffstat (limited to 'sys/src/cmd/5e/sys.c')
-rw-r--r--sys/src/cmd/5e/sys.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/src/cmd/5e/sys.c b/sys/src/cmd/5e/sys.c
index daa02e0c7..0f9fb1c03 100644
--- a/sys/src/cmd/5e/sys.c
+++ b/sys/src/cmd/5e/sys.c
@@ -197,6 +197,46 @@ sysfstat(void)
}
static void
+syswstat(void)
+{
+ u32int name, edir, nedir;
+ char *namet;
+ void *edirt;
+ int copied, copied2;
+
+ name = arg(0);
+ namet = copyifnec(name, -1, &copied);
+ edir = arg(1);
+ nedir = arg(2);
+ edirt = copyifnec(edir, nedir, &copied2);
+ if(systrace)
+ fprint(2, "wstat(%#ux=\"%s\", %#ux, %ud)\n", name, namet, edir, nedir);
+ P->R[0] = noteerr(wstat(namet, edirt, nedir), nedir);
+ if(copied)
+ free(namet);
+ if(copied2)
+ free(edirt);
+}
+
+static void
+sysfwstat(void)
+{
+ u32int fd, edir, nedir;
+ void *edirt;
+ int copied;
+
+ fd = arg(0);
+ edir = arg(1);
+ nedir = arg(2);
+ edirt = copyifnec(edir, nedir, &copied);
+ if(systrace)
+ fprint(2, "fwstat(%d, %#ux, %d)\n", fd, edir, nedir);
+ P->R[0] = noteerr(fwstat(fd, edirt, nedir), nedir);
+ if(copied)
+ free(edirt);
+}
+
+static void
sysexits(void)
{
if(arg(0) == 0)
@@ -266,6 +306,27 @@ syschdir(void)
static void
sysnotify(void)
{
+ u32int handler;
+
+ handler = arg(0);
+ if(systrace)
+ fprint(2, "notify(%#ux)\n", handler);
+ P->notehandler = handler;
+ P->R[0] = 0;
+}
+
+static void
+sysnoted(void)
+{
+ u32int v;
+
+ v = arg(0);
+ if(systrace)
+ fprint(2, "noted(%d)\n", v);
+ if(P->innote)
+ longjmp(P->notejmp, v + 1);
+ cherrstr("the front fell off");
+ P->R[0] = -1;
}
static void
@@ -541,6 +602,17 @@ sysremove(void)
free(filet);
}
+static void
+sysalarm(void)
+{
+ u32int msec;
+
+ msec = arg(0);
+ if(systrace)
+ fprint(2, "alarm(%d)\n", msec);
+ P->R[0] = alarm(msec);
+}
+
void
syscall(void)
{
@@ -556,10 +628,13 @@ syscall(void)
[ERRSTR] syserrstr,
[STAT] sysstat,
[FSTAT] sysfstat,
+ [WSTAT] syswstat,
+ [FWSTAT] sysfwstat,
[SEEK] sysseek,
[CHDIR] syschdir,
[FD2PATH] sysfd2path,
[NOTIFY] sysnotify,
+ [NOTED] sysnoted,
[RFORK] sysrfork,
[EXEC] sysexec,
[AWAIT] sysawait,
@@ -571,6 +646,7 @@ syscall(void)
[DUP] sysdup,
[MOUNT] sysmount,
[REMOVE] sysremove,
+ [ALARM] sysalarm,
};
n = P->R[0];