From b127812ccc7f8269fa0bff4a2fdf2f4e606f1055 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 4 May 2012 20:11:02 -0400 Subject: [PATCH] new write function --- mwrite.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 mwrite.c diff --git a/mwrite.c b/mwrite.c new file mode 100644 index 0000000..78ea502 --- /dev/null +++ b/mwrite.c @@ -0,0 +1,58 @@ +#include "marignotti.h" +#include +#include +#include + + +#pragma noroot +#pragma optimize 79 + +// called through GSOS. +int mwrite(int ipid, void *p1, void *p2, void *p3, void *p4, void *p5) +{ + Entry *e; + Word terr; + Word t; + int xerrno; + + char *buffer = (char *)p1; + LongWord nbytes = *(LongWord *)p2; + + *(LongWord *)p2 = 0; + + e = find_entry(ipid); + + if (!e) + { + return EBADF; + } + + // todo -- queue up if pending >= _SNDLOWAT? + // todo -- push? + + IncBusy(); + terr = TCPIPWriteTCP(ipid, buffer, nbytes, 0, 0); + t = _toolErr; + DecBusy(); + + if (t) terr = t; + + if (t || terr == tcperrBadConnection) + return ENOTCONN; + + if (terr == tcperrNoResources) + return ENOMEM; + + if (terr == tcperrConClosing) + { + int xerrno; + if (!e->_NOSIGPIPE) + Kkill(Kgetpid(), SIGPIPE, &xerrno); + + return EPIPE; + } + + *(LongWord *)p2 = nbytes; + + return 0; +} \ No newline at end of file