-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherl_driver.c
More file actions
75 lines (63 loc) · 2.51 KB
/
erl_driver.c
File metadata and controls
75 lines (63 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* port_driver.c */
#include "erl_driver.h"
#include <string.h>
#define DRV_NAME "erl_driver"
//import rust fn
extern char* port_call(char*, size_t);
typedef struct {
ErlDrvPort port;
} erl_data;
static ErlDrvData port_drv_start(ErlDrvPort port, char *buff)
{
erl_data* d = (erl_data*)driver_alloc(sizeof(erl_data));
d->port = port;
return (ErlDrvData)d;
}
static void port_drv_stop(ErlDrvData handle)
{
driver_free((char*)handle);
}
static void port_drv_output(ErlDrvData handle, char *buff,
ErlDrvSizeT bufflen)
{
erl_data* d = (erl_data*)handle;
char* res = port_call(buff, bufflen);
driver_output(d->port, res, strlen(res));
}
ErlDrvEntry driver_entry = {
NULL, /* F_PTR init, called when driver is loaded */
port_drv_start, /* L_PTR start, called when port is opened */
port_drv_stop, /* F_PTR stop, called when port is closed */
port_drv_output, /* F_PTR output, called when erlang has sent */
NULL, /* F_PTR ready_input, called when input descriptor ready */
NULL, /* F_PTR ready_output, called when output descriptor ready */
DRV_NAME, /* char *driver_name, the argument to open_port */
NULL, /* F_PTR finish, called when unloaded */
NULL, /* void *handle, Reserved by VM */
NULL, /* F_PTR control, port_command callback */
NULL, /* F_PTR timeout, reserved */
NULL, /* F_PTR outputv, reserved */
NULL, /* F_PTR ready_async, only for async drivers */
NULL, /* F_PTR flush, called when port is about
to be closed, but there is data in driver
queue */
NULL, /* F_PTR call, much like control, sync call
to driver */
NULL, /* unused */
ERL_DRV_EXTENDED_MARKER, /* int extended marker, Should always be
set to indicate driver versioning */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* int major_version, should always be
set to this value */
ERL_DRV_EXTENDED_MINOR_VERSION, /* int minor_version, should always be
set to this value */
0, /* int driver_flags, see documentation */
NULL, /* void *handle2, reserved for VM use */
NULL, /* F_PTR process_exit, called when a
monitored process dies */
NULL /* F_PTR stop_select, called to close an
event object */
};
DRIVER_INIT(DRV_NAME) /* must match name in driver_entry */
{
return &driver_entry;
}