その1の、その後。
nif.c
# include <stdio.h>
# include <string.h>
# include <errno.h>
# define UNUSED(p) (void)(p)
// -- --
typedef struct {
int id;
} nif_t;
// -- --
static ERL_NIF_TERM open(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {
if (1 == argc &&
enif_is_number(env, argv[0])) {
int id = 0;
enif_get_int(env, argv[0], &id);
ERL_NIF_TERM term;
nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);
if (NULL != resource) {
resource->id = id;
printf("open: resource=%ld, id=%d\r\n", (long)resource, resource->id);
return enif_make_tuple2(env,
enif_make_atom(env, "ok"),
term);
} else {
return enif_make_tuple2(env,
enif_make_atom(env, "error"),
enif_make_string(env, "enomem", ERL_NIF_LATIN1));
}
}
return enif_make_badarg(env);
}
static ERL_NIF_TERM close(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {
if (1 == argc) {
ErlNifBinary bin;
if (enif_inspect_binary(env, argv[0], &bin) && sizeof(nif_t) == bin.size) {
ERL_NIF_TERM term;
nif_t *resource = (nif_t *)enif_make_new_binary(env, sizeof(nif_t), &term);
memcpy(resource, bin.data, bin.size);
printf("close: resource=%ld, id=%d\r\n", (long)resource, resource->id);
return enif_make_atom(env, "ok");
}
}
return enif_make_badarg(env);
}
// -- --
static ErlNifFunc funcs[] = {
{"open", 1, open},
{"close", 1, close},
};
static int load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM load_info) {
UNUSED(env), UNUSED(load_info);
*priv_data = NULL;
return 0;
}
/*
*/
ERL_NIF_INIT(nif, funcs, load, NULL, NULL, NULL);
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Eshell V5.10.4 (abort with ^G)
1>
1> {ok,B} = nif:open(123).
open: resource=444388128, id=123
{ok,<<123,0,0,0>>}
2> nif:close(B).
close: resource=444424072, id=123
ok
3> q().
crypto を真似て。戻りの binary が <<>> でないのも良い。