#include #include #include /* send.c - kiosend() "send to channel" * ~ lexi hale * kiosend() writes to a channel with an open out stream */ /* we define all platform functions here, * whether or not they're for the correct * platform - only the ones actually called * by the generated code will be linked */ #include #include kiocond kiosend(kiochan target, ksraw string, sz* len) { if (target.out.kind == kiostream_closed) return kiocond_fail_closed_stream; # ifdef KFenv_posix /* issue the write syscall here and now so we can * retrieve errno and report it if necessary */ k_platform_syscall_arg args[] = { target.out.platform_fd, (k_platform_syscall_arg)string.ptr, string.size }; struct k_platform_syscall_answer a = k_platform_syscall (k_platform_syscall_write,3,args); sz size = a.ret; if (size == -1) switch(a.error) { case k_platform_error_EPERM: return kiocond_fail_forbidden; case k_platform_error_EINVAL: return kiocond_fail_invalid; case k_platform_error_EBADF: return kiocond_fail_invalid; case k_platform_error_EFAULT: return kiocond_fail_pfault; case k_platform_error_ENOSPC: return kiocond_fail_no_space; case k_platform_error_EDQUOT: return kiocond_fail_over_quota; case k_platform_error_EIO: return kiocond_fail_io; case k_platform_error_EAGAIN: return kiocond_poll; case k_platform_error_EFBIG: return kiocond_fail_too_big; case k_platform_error_EINTR: return kiocond_interrupt; case k_platform_error_EDESTADDRREQ: return kiocond_fail_no_peer; default: return kiocond_fail; } # else Knoimpl(kiosend,KVos); # error missing implementation // boring error for plebs # endif if (len != null) *len = size; return kiocond_ok; }