static sexp sexp_file_lock_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0, sexp arg1) { int err; sexp res; if (! (sexp_portp(arg0) || sexp_filenop(arg0) || sexp_fixnump(arg0))) return sexp_xtype_exception(ctx, self, "not a port or file descriptor",arg0); if (! sexp_exact_integerp(arg1)) return sexp_type_exception(ctx, self, SEXP_FIXNUM, arg1); err = flock((sexp_portp(arg0) ? sexp_port_fileno(arg0) : sexp_filenop(arg0) ? sexp_fileno_fd(arg0) : sexp_unbox_fixnum(arg0)), sexp_sint_value(arg1)); if (err) { res = SEXP_FALSE; } else { res = SEXP_TRUE; } return res; }
static sexp sexp_duplicate_file_descriptor_to_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0, sexp arg1) { int err; sexp res; if (! (sexp_filenop(arg0) || sexp_fixnump(arg0))) return sexp_type_exception(ctx, self, SEXP_FILENO, arg0); if (! (sexp_filenop(arg1) || sexp_fixnump(arg1))) return sexp_type_exception(ctx, self, SEXP_FILENO, arg1); err = dup2((sexp_filenop(arg0) ? sexp_fileno_fd(arg0) : sexp_unbox_fixnum(arg0)), (sexp_filenop(arg1) ? sexp_fileno_fd(arg1) : sexp_unbox_fixnum(arg1))); if (err) { res = SEXP_FALSE; } else { res = SEXP_TRUE; } return res; }
/* block the current thread on the specified port */ static sexp sexp_blocker (sexp ctx, sexp self, sexp_sint_t n, sexp portorfd) { int fd; /* register the fd */ if (sexp_portp(portorfd)) fd = sexp_port_fileno(portorfd); else if (sexp_filenop(portorfd)) fd = sexp_fileno_fd(portorfd); else if (sexp_fixnump(portorfd)) fd = sexp_unbox_fixnum(portorfd); else return sexp_type_exception(ctx, self, SEXP_IPORT, portorfd); if (fd >= 0) sexp_insert_pollfd(ctx, fd, sexp_oportp(portorfd) ? POLLOUT : POLLIN); /* pause the current thread */ sexp_context_waitp(ctx) = 1; sexp_context_event(ctx) = portorfd; sexp_insert_timed(ctx, ctx, SEXP_FALSE); return SEXP_VOID; }
static sexp sexp_get_file_descriptor_status_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0) { sexp res; if (! (sexp_portp(arg0) || sexp_filenop(arg0) || sexp_fixnump(arg0))) return sexp_xtype_exception(ctx, self, "not a port or file descriptor",arg0); res = sexp_make_integer(ctx, fcntl((sexp_portp(arg0) ? sexp_port_fileno(arg0) : sexp_filenop(arg0) ? sexp_fileno_fd(arg0) : sexp_unbox_fixnum(arg0)), F_GETFL)); return res; }
static sexp sexp_file_truncate_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0, sexp arg1) { sexp res; if (! (sexp_portp(arg0) || sexp_filenop(arg0) || sexp_fixnump(arg0))) return sexp_xtype_exception(ctx, self, "not a port or file descriptor",arg0); if (! sexp_exact_integerp(arg1)) return sexp_type_exception(ctx, self, SEXP_FIXNUM, arg1); res = sexp_make_integer(ctx, ftruncate((sexp_portp(arg0) ? sexp_port_fileno(arg0) : sexp_filenop(arg0) ? sexp_fileno_fd(arg0) : sexp_unbox_fixnum(arg0)), sexp_uint_value(arg1))); return res; }
static sexp sexp_is_a_tty_p_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0) { sexp res; if (! (sexp_portp(arg0) || sexp_filenop(arg0) || sexp_fixnump(arg0))) return sexp_xtype_exception(ctx, self, "not a port or file descriptor",arg0); res = sexp_make_boolean(isatty((sexp_portp(arg0) ? sexp_port_fileno(arg0) : sexp_filenop(arg0) ? sexp_fileno_fd(arg0) : sexp_unbox_fixnum(arg0)))); return res; }