71 struct socketpair_args {
98 struct readlink_args {
113 RuneSysCall_read(struct read_args *args, runesize_t *rval)
120 BOUNDSCHECK(&args->buf, args->bytes);
121 fdp = (void *)args->lvs.s_Addr;
123 ptr = args->buf.s_Addr;
125 while (r < args->bytes) {
126 if (args->offset < 0) {
127 n = extpread(fdp->fd, args->buf.s_Addr,
129 O_FNONBLOCKING, args->offset);
131 n = extpread(fdp->fd, args->buf.s_Addr,
133 O_FNONBLOCKING, args->offset + r);
138 if (errno == EAGAIN) {
139 if (threadWaitEvent(fdp->fd, THWAIT_READ) < 0)
160 * Semi-blocking read, read at least 1 byte.
162 * Will retry on EINTR or EAGAIN until at least 1 byte is read. Other errors
166 RuneSysCall_read1(struct read_args *args, runesize_t *rval)
170 BOUNDSCHECK(&args->buf, args->bytes);
171 fdp = (void *)args->lvs.s_Addr;
173 *rval = extpread(fdp->fd, args->buf.s_Addr, args->bytes,
174 O_FNONBLOCKING, args->offset);
179 if (errno == EAGAIN) {
180 if (threadWaitEvent(fdp->fd, THWAIT_READ) < 0)
193 * readn - non-blocking read. Can also be interrupted by EINTR.
196 RuneSysCall_readn(struct read_args *args, runesize_t *rval)
200 BOUNDSCHECK(&args->buf, args->bytes);
201 fdp = (void *)args->lvs.s_Addr;
203 *rval = extpread(fdp->fd, args->buf.s_Addr, args->bytes,
204 O_FNONBLOCKING, args->offset);
214 RuneSysCall_write(struct write_args *args, runesize_t *rval)
221 BOUNDSCHECK(&args->buf, args->bytes);
222 fdp = (void *)args->lvs.s_Addr;
224 ptr = args->buf.s_Addr;
226 while (r < args->bytes) {
227 if (args->offset < 0) {
228 n = extpwrite(fdp->fd, ptr, args->bytes - r,
229 O_FNONBLOCKING, args->offset);
231 n = extpwrite(fdp->fd, ptr, args->bytes - r,
232 O_FNONBLOCKING, args->offset + r);
237 if (errno == EAGAIN) {
238 if (threadWaitEvent(fdp->fd, THWAIT_WRITE) < 0)
257 * Semi-blocking write, write at least 1 byte.
259 * Will retry on EINTR or EAGAIN until at least 1 byte is write. Other errors
263 RuneSysCall_write1(struct write_args *args, runesize_t *rval)
267 BOUNDSCHECK(&args->buf, args->bytes);
268 fdp = (void *)args->lvs.s_Addr;
271 *rval = extpwrite(fdp->fd, args->buf.s_Addr, args->bytes,
272 O_FNONBLOCKING, args->offset);
277 if (errno == EAGAIN) {
278 if (threadWaitEvent(fdp->fd, THWAIT_WRITE) < 0)
291 RuneSysCall_writen(struct write_args *args, runesize_t *rval)
295 BOUNDSCHECK(&args->buf, args->bytes);
296 fdp = (void *)args->lvs.s_Addr;
298 *rval = extpwrite(fdp->fd, args->buf.s_Addr, args->bytes,
299 O_FNONBLOCKING, args->offset);
309 RuneSysCall_open(struct open_args *args, int *rval)
313 BOUNDSCHECK(&args->path, 1);
314 dassert(args->path.s_End[-1] == 0);
315 fdp = (void *)args->lvs.s_Addr;
317 fdp->fd = open(args->path.s_Addr, args->flags | O_CLOEXEC, args->modes);
328 RuneSysCall_close(struct close_args *args, int *rval)
332 fdp = (void *)args->lvs.s_Addr;
333 *rval = close(fdp->fd);
342 RuneSysCall_dup(struct dup_args *args, int *rval)
346 fdp = (void *)args->lvs.s_Addr;
347 *rval = dup(args->sfd);
358 RuneSysCall_dup2(struct dup2_args *args, int *rval)
362 fdp = (void *)args->lvs.s_Addr;
363 *rval = dup2(args->sfd, args->dfd);
374 RuneSysCall_umask(struct umask_args *args, runemode_t *rval)
376 *rval = umask(args->mode);
380 RuneSysCall_lseek(struct lseek_args *args, runesize_t *rval)
384 fdp = (void *)args->lvs.s_Addr;
385 *rval = lseek(fdp->fd, args->off, args->how);
393 RuneSysCall_fcloexec(struct fsimple_args *args, int *rval)
397 fdp = (void *)args->lvs.s_Addr;
398 *rval = fcntl(fdp->fd, F_SETFD, (args->enable ? FD_CLOEXEC : 0));
404 RuneSysCall_fappend(struct fsimple_args *args, int *rval)
409 fdp = (void *)args->lvs.s_Addr;
410 flags = fcntl(fdp->fd, F_GETFL, 0);
419 *rval = fcntl(fdp->fd, F_SETFL, flags);
426 RuneSysCall_fnonblock(struct fsimple_args *args, int *rval)
431 fdp = (void *)args->lvs.s_Addr;
432 flags = fcntl(fdp->fd, F_GETFL, 0);
440 flags &= ~O_NONBLOCK;
441 *rval = fcntl(fdp->fd, F_SETFL, flags);
448 RuneSysCall_fdirect(struct fsimple_args *args, int *rval)
453 fdp = (void *)args->lvs.s_Addr;
454 flags = fcntl(fdp->fd, F_GETFL, 0);
463 *rval = fcntl(fdp->fd, F_SETFL, flags);
470 RuneSysCall_iowait_rd(struct iowait_args *args, void *rval)
474 fdp = (void *)args->lvs.s_Addr;
475 if (threadWaitEvent(fdp->fd, THWAIT_READ) < 0)
482 RuneSysCall_iowait_wr(struct iowait_args *args, void *rval)
486 fdp = (void *)args->lvs.s_Addr;
487 if (threadWaitEvent(fdp->fd, THWAIT_WRITE) < 0)
494 RuneSysCall_pipe2(struct pipe2_args *args, int *rval)
496 FDStor *fdr = args->fdr.s_Addr;
497 FDStor *fdw = args->fdw.s_Addr;
500 if (pipe2(fds, args->flags) < 0) {
516 RuneSysCall_socketpair(struct socketpair_args *args, int *rval)
518 FDStor *fdr = args->fdr.s_Addr;
519 FDStor *fdw = args->fdw.s_Addr;
522 if (socketpair(args->domain, args->type, args->proto, fds) < 0) {
538 RuneSysCall_symlink(struct symlink_args *args, int *rval)
540 FDStor *fdp = (void *)args->lvs.s_Addr;
544 buf = STRBOUNDSCHECK(&args->buf, 255);
545 nfile = STRBOUNDSCHECK(&args->nfile, PATH_MAX);
546 if (symlink(buf, nfile) < 0) {
556 RuneSysCall_link(struct link_args *args, int *rval)
558 FDStor *fdp = (void *)args->lvs.s_Addr;
562 ofile = STRBOUNDSCHECK(&args->ofile, PATH_MAX);
563 nfile = STRBOUNDSCHECK(&args->nfile, PATH_MAX);
564 if (link(ofile, nfile) < 0) {
574 RuneSysCall_readlink(struct readlink_args *args, int *rval)
576 FDStor *fdp = (void *)args->lvs.s_Addr;
581 target = STRBOUNDSCHECK(&args->target, PATH_MAX);
582 BOUNDSCHECK(&args->buf, 1);
583 buf = args->buf.s_Addr;
584 bufsize = args->buf.s_End - args->buf.s_Beg;
585 if (bufsize > 0x7FFFFFFF) /* ensure no overflow w/int return */
586 bufsize = 0x7FFFFFFF;
587 *rval = readlink(target, buf, bufsize - 1);
592 buf[*rval] = 0; /* rune zero-terminates the buffer */
598 RuneSysCall_unlink(struct unlink_args *args, int *rval)
600 FDStor *fdp = (void *)args->lvs.s_Addr;
603 target = STRBOUNDSCHECK(&args->target, PATH_MAX);
604 *rval = unlink(target);