diff options
Diffstat (limited to 'do/msgrcv')
| -rw-r--r-- | do/msgrcv | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/do/msgrcv b/do/msgrcv new file mode 100644 index 0000000000..d687664721 --- /dev/null +++ b/do/msgrcv @@ -0,0 +1,34 @@ +int +do_msgrcv(arglast) +int *arglast; +{ +#ifdef HAS_MSG + register STR **st = stack->ary_array; + register int sp = arglast[0]; + STR *mstr; + char *mbuf; + long mtype; + int id, msize, flags, ret; + + id = (int)str_gnum(st[++sp]); + mstr = st[++sp]; + msize = (int)str_gnum(st[++sp]); + mtype = (long)str_gnum(st[++sp]); + flags = (int)str_gnum(st[++sp]); + mbuf = str_get(mstr); + if (mstr->str_cur < sizeof(long)+msize+1) { + STR_GROW(mstr, sizeof(long)+msize+1); + mbuf = str_get(mstr); + } + errno = 0; + ret = msgrcv(id, (struct msgbuf *)mbuf, msize, mtype, flags); + if (ret >= 0) { + mstr->str_cur = sizeof(long)+ret; + mstr->str_ptr[sizeof(long)+ret] = '\0'; + } + return ret; +#else + fatal("msgrcv not implemented"); +#endif +} + |
