static int reply_ok_binary(descriptor_t *desc, char *ptr, int beg_offset, int length) { ErlDrvTermData msg[24]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_ok); i = LOAD_BINARY(msg, i, edtk_alloced_ptr2ErlDrvBinary(ptr), beg_offset, length); i = LOAD_TUPLE(msg, i, 3); edtk_debug("%s: i = %d, ptr = 0x%lx, start = %d, end = %d", __FUNCTION__, i, ptr, beg_offset, length); res = driver_output_term(desc->port, msg, i); /* driver_output_term() incrs refc, and we're done, so decr refc */ /* ** We _know_ that "ptr" points to memory allocated by ** edtk_driver_alloc_wrapper(), so edtk_alloced_ptr2ErlDrvBinary() ** is safe in this case. If it weren't safe, then the binary ** must be returned by an xtra_return, which means we ** reply_ok_binary()) are never called! */ driver_free_binary(edtk_alloced_ptr2ErlDrvBinary(ptr)); edtk_debug("%s: res = %d", __FUNCTION__, res); return res; }
static int reply_ok_valmap(descriptor_t *desc, ErlDrvTermData valmap_atom, unsigned long valmap_index) { ErlDrvTermData msg[15]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_ok); i = LOAD_ATOM(msg, i, valmap_atom); i = LOAD_INT(msg, i, valmap_index); i = LOAD_TUPLE(msg, i, 2); i = LOAD_TUPLE(msg, i, 3); edtk_debug("reply_ok_valmap: i = %d", i); res = driver_output_term(desc->port, msg, i); edtk_debug("reply_ok_valmap: res = %d", res); return res; }
/* send {P, ok} to caller */ static ErlDrvSSizeT driver_send_ok(t_iconvdrv *iv) { int i = 0; ErlDrvTermData to, spec[10]; to = driver_caller(iv->port); i = LOAD_PORT(spec, i, iv->dport); i = LOAD_ATOM(spec, i, am_ok); i = LOAD_TUPLE(spec, i, 2); return erl_drv_send_term(driver_mk_port(iv->port), to, spec, i); }
/* send {P, ok} to caller */ static int driver_send_ok(t_iconvdrv *iv) { int i = 0; ErlDrvTermData to, spec[10]; to = driver_caller(iv->port); i = LOAD_PORT(spec, i, iv->dport); i = LOAD_ATOM(spec, i, am_ok); i = LOAD_TUPLE(spec, i, 2); return driver_send_term(iv->port, to, spec, i); }
/* send {P, error, Error} to caller */ static ErlDrvSSizeT driver_send_error(t_iconvdrv *iv, ErlDrvTermData *am) { int i = 0; ErlDrvTermData to, spec[8]; to = driver_caller(iv->port); i = LOAD_PORT(spec, i, iv->dport); i = LOAD_ATOM(spec, i, am_error); i = LOAD_ATOM(spec, i, *am); i = LOAD_TUPLE(spec, i, 3); return erl_drv_send_term(driver_mk_port(iv->port), to, spec, i); }
/* send {P, value, Bin} to caller */ static ErlDrvSSizeT driver_send_bin(t_iconvdrv *iv, ErlDrvBinary *bin, ErlDrvSizeT len) { int i = 0; ErlDrvTermData to, spec[10]; to = driver_caller(iv->port); i = LOAD_PORT(spec, i, iv->dport); i = LOAD_ATOM(spec, i, am_value); i = LOAD_BINARY(spec, i, bin, 0, len); i = LOAD_TUPLE(spec, i, 3); return erl_drv_send_term(driver_mk_port(iv->port), to, spec, i); }
/* send {P, value, Bin} to caller */ static int driver_send_bin(t_iconvdrv *iv, ErlDrvBinary *bin, int len) { int i = 0; ErlDrvTermData to, spec[10]; to = driver_caller(iv->port); i = LOAD_PORT(spec, i, iv->dport); i = LOAD_ATOM(spec, i, am_value); i = LOAD_BINARY(spec, i, bin, 0, len); i = LOAD_TUPLE(spec, i, 3); return driver_send_term(iv->port, to, spec, i); }
static int reply_ok(descriptor_t *desc) { ErlDrvTermData msg[24]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_ok); i = LOAD_TUPLE(msg, i, 2); edtk_debug("reply_ok: i = %d", i); res = driver_output_term(desc->port, msg, i); edtk_debug("reply_ok: res = %d", res); return res; }
/* send {P, error, Error} to caller */ static int driver_send_error(t_md4drv *md4, ErlDrvTermData *am) { int i = 0; ErlDrvTermData to, spec[8]; to = driver_caller(md4->port); i = LOAD_PORT(spec, i, md4->dport); i = LOAD_ATOM(spec, i, am_error); i = LOAD_ATOM(spec, i, *am); i = LOAD_TUPLE(spec, i, 3); return driver_send_term(md4->port, to, spec, i); }
static int reply_error_atom(descriptor_t *desc, ErlDrvTermData atom) { ErlDrvTermData msg[24]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_error); i = LOAD_ATOM(msg, i, atom); i = LOAD_TUPLE(msg, i, 3); edtk_debug("%s: i = %d", __FUNCTION__, i); res = driver_output_term(desc->port, msg, i); edtk_debug("%s: res = %d", __FUNCTION__, res); return res; }
static int reply_ok_num(descriptor_t *desc, unsigned long num) { ErlDrvTermData msg[24]; int i = 0; int res; i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_ok); i = LOAD_INT(msg, i, num); i = LOAD_TUPLE(msg, i, 3); edtk_debug("%s: i = %d, num = %lu", __FUNCTION__, i, num); res = driver_output_term(desc->port, msg, i); edtk_debug("%s: res = %d", __FUNCTION__, res); return res; }
static int reply_error(descriptor_t *desc, int errnum) { ErlDrvTermData msg[24]; int i = 0; int res; edtk_debug("reply_error: errnum = %d", errnum); i = LOAD_PORT(msg, i, driver_mk_port(desc->port)); i = LOAD_ATOM(msg, i, am_error); i = LOAD_INT(msg, i, errnum); i = LOAD_TUPLE(msg, i, 3); edtk_debug("reply_error: i = %d", i); res = driver_output_term(desc->port, msg, i); edtk_debug("reply_error: res = %d", res); return res; }