static long eiawrite(Chan *c, void *buf, long n, vlong offset) { ssize_t cnt; char cmd[Maxctl]; int port = NETID(c->qid.path); USED(offset); if(c->qid.type & QTDIR) error(Eperm); switch(NETTYPE(c->qid.path)) { case Ndataqid: osenter(); cnt = write(eia[port].fd, buf, n); osleave(); if(cnt == -1) oserror(); return cnt; case Nctlqid: if(n >= (long)sizeof(cmd)) n = sizeof(cmd)-1; memmove(cmd, buf, n); cmd[n] = 0; wrctl(port, cmd); return n; } return 0; }
static long eiawrite(Chan *c, void *buf, long n, vlong offset) { DWORD cnt; char cmd[Maxctl]; int port = NETID(c->qid.path); BOOL good; uchar *data; if(c->qid.type & QTDIR) error(Eperm); switch(NETTYPE(c->qid.path)) { case Ndataqid: cnt = 0; data = (uchar*)buf; // if WriteFile times out (i.e. return true; cnt<n) then // allow osleave() to check for an interrupt otherwise try // to send the unsent data. while(n>0) { osenter(); good = WriteFile(eia[port].comfh, data, n, &cnt, NULL); osleave(); if(!good) oserror(); data += cnt; n -= cnt; } return (data-(uchar*)buf); case Nctlqid: if(n >= sizeof(cmd)) n = sizeof(cmd)-1; memmove(cmd, buf, n); cmd[n] = 0; wrctl(port, cmd); return n; } return 0; }