static void dump_element(int to, void *to_arg, Eterm x) { if (is_list(x)) { erts_print(to, to_arg, "H" WORD_FMT, list_val(x)); } else if (is_boxed(x)) { erts_print(to, to_arg, "H" WORD_FMT, boxed_val(x)); } else if (is_immed(x)) { if (is_atom(x)) { unsigned char* s = atom_tab(atom_val(x))->name; int len = atom_tab(atom_val(x))->len; int i; erts_print(to, to_arg, "A%X:", atom_tab(atom_val(x))->len); for (i = 0; i < len; i++) { erts_putc(to, to_arg, *s++); } } else if (is_small(x)) { erts_print(to, to_arg, "I%T", x); } else if (is_pid(x)) { erts_print(to, to_arg, "P%T", x); } else if (is_port(x)) { erts_print(to, to_arg, "p<%bpu.%bpu>", port_channel_no(x), port_number(x)); } else if (is_nil(x)) { erts_putc(to, to_arg, 'N'); } } }
term_t bif_read0_2(term_t Port, term_t Len, process_t *ctx) { apr_status_t rs; apr_size_t size; apr_byte_t *buf; term_t bin; port_t *p; if (!is_port(Port) || !is_int(Len)) return A_BADARG; p = port_lookup(prp_serial(Port)); if (p == 0) return A_BADARG; size = (apr_size_t)int_value(Len); buf = xalloc(proc_gc_pool(ctx), size); rs = p->read(p, buf, &size); if (size == 0 && APR_STATUS_IS_EOF(rs)) result(A_EOF); else if (size == 0 && rs != 0) return decipher_status(rs); else { bin = make_binary(intnum(size), buf, proc_gc_pool(ctx)); result(bin); } return AI_OK; }
BIF_RETTYPE is_port_1(BIF_ALIST_1) { if (is_port(BIF_ARG_1)) { BIF_RET(am_true); } BIF_RET(am_false); }
term_t bif_write0_2(term_t Port, term_t Bin, process_t *ctx) { apr_status_t rs; apr_size_t size; port_t *p; if (!is_port(Port) || !is_binary(Bin)) return A_BADARG; p = port_lookup(prp_serial(Port)); if (p == 0) return A_BADARG; size = (apr_size_t)int_value(bin_size(Bin)); rs = p->write(p, bin_data(Bin), &size); if (rs != 0) return decipher_status(rs); //TODO: something may still be written result(intnum(size)); return AI_OK; }
term_t bif_sendto4(term_t Sock, term_t RemIP, term_t RemPort, term_t Bin, process_t *ctx) { apr_status_t rs; port_t *port; apr_socket_t *sock; const char *host; int udp_port; apr_sockaddr_t *sa; apr_pool_t *p; if (!is_port(Sock)) return A_BADARG; if (!is_binary(RemIP) || !is_int(RemPort)) return A_BADARG; if (!is_binary(Bin)) return A_BADARG; port = port_lookup(prp_serial(Sock)); if (port == 0) return A_CLOSED; if (!port->is_socket(port)) return A_BADARG; sock = port->get_socket(port); host = (const char *)bin_data(RemIP); udp_port = (apr_port_t)int_value(RemPort); apr_pool_create(&p, 0); rs = apr_sockaddr_info_get(&sa, host, APR_INET, udp_port, 0, p); if (rs == 0) { apr_size_t len = (apr_size_t)int_value(bin_size(Bin)); rs = apr_socket_sendto(sock, sa, 0, (const char *)bin_data(Bin), &len); } if (rs != 0) { apr_pool_destroy(p); return decipher_status(rs); } result(A_OK); return AI_OK; }
int enif_is_port(ErlNifEnv* env, ERL_NIF_TERM term) { return is_port(term); }