Phasor 2.2.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
posix_bindings.c
Go to the documentation of this file.
1#define PHASOR_FFI_BUILD_DLL
2#include <PhasorFFI.h>
3#include <fcntl.h>
4#include <unistd.h>
5#include <sys/stat.h>
6#include <dirent.h>
7#include <signal.h>
8#include <time.h>
9#include <sys/wait.h>
10#include <stdlib.h>
11#include <string.h>
12
13// -----------------
14// File I/O Wrappers
15// -----------------
16static PhasorValue phasor_open(PhasorVM* vm, int argc, const PhasorValue* argv) {
17 if (argc < 2 || !phasor_is_string(argv[0]) || !phasor_is_int(argv[1])) return phasor_make_int(-1);
18 const char* path = phasor_to_string(argv[0]);
19 int flags = (int)phasor_to_int(argv[1]);
20 int fd = open(path, flags, 0666);
21 return phasor_make_int(fd);
22}
23
24static PhasorValue phasor_close(PhasorVM* vm, int argc, const PhasorValue* argv) {
25 if (argc < 1 || !phasor_is_int(argv[0])) return phasor_make_int(-1);
26 int fd = (int)phasor_to_int(argv[0]);
27 return phasor_make_int(close(fd));
28}
29
30static PhasorValue phasor_read(PhasorVM* vm, int argc, const PhasorValue* argv) {
31 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1])) return phasor_make_string("");
32 int fd = (int)phasor_to_int(argv[0]);
33 size_t count = (size_t)phasor_to_int(argv[1]);
34 char* buf = (char*)malloc(count + 1);
35 if (!buf) return phasor_make_string("");
36 ssize_t r = read(fd, buf, count);
37 if (r >= 0) buf[r] = '\0';
38 else buf[0] = '\0';
40 free(buf);
41 return val;
42}
43
44static PhasorValue phasor_write(PhasorVM* vm, int argc, const PhasorValue* argv) {
45 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_string(argv[1])) return phasor_make_int(-1);
46 int fd = (int)phasor_to_int(argv[0]);
47 const char* s = phasor_to_string(argv[1]);
48 ssize_t r = write(fd, s, strlen(s));
49 return phasor_make_int(r);
50}
51
52static PhasorValue phasor_unlink(PhasorVM* vm, int argc, const PhasorValue* argv) {
53 if (argc < 1 || !phasor_is_string(argv[0])) return phasor_make_int(-1);
54 return phasor_make_int(unlink(phasor_to_string(argv[0])));
55}
56
57// -----------------
58// Directory Wrappers
59// -----------------
60static PhasorValue phasor_mkdir(PhasorVM* vm, int argc, const PhasorValue* argv) {
61 if (argc < 1 || !phasor_is_string(argv[0])) return phasor_make_int(-1);
62 const char* path = phasor_to_string(argv[0]);
63 return phasor_make_int(mkdir(path, 0777));
64}
65
66static PhasorValue phasor_rmdir(PhasorVM* vm, int argc, const PhasorValue* argv) {
67 if (argc < 1 || !phasor_is_string(argv[0])) return phasor_make_int(-1);
68 return phasor_make_int(rmdir(phasor_to_string(argv[0])));
69}
70
71// -----------------
72// Process Wrappers
73// -----------------
74static PhasorValue phasor_fork(PhasorVM* vm, int argc, const PhasorValue* argv) {
75 pid_t pid = fork();
76 return phasor_make_int((int64_t)pid);
77}
78
79static PhasorValue phasor_execve(PhasorVM* vm, int argc, const PhasorValue* argv) {
80 if (argc < 3 || !phasor_is_string(argv[0]) || !phasor_is_array(argv[1]) || !phasor_is_array(argv[2])) {
81 return phasor_make_int(-1);
82 }
83 const char* path = phasor_to_string(argv[0]);
84 const PhasorValue* argarr = argv[1].as.a.elements;
85 size_t argcnt = argv[1].as.a.count;
86 const PhasorValue* envarr = argv[2].as.a.elements;
87 size_t envcnt = argv[2].as.a.count;
88
89 char** args = (char**)malloc((argcnt + 1) * sizeof(char*));
90 char** envs = (char**)malloc((envcnt + 1) * sizeof(char*));
91 for (size_t i = 0; i < argcnt; i++) args[i] = (char*)phasor_to_string(argarr[i]);
92 args[argcnt] = NULL;
93 for (size_t i = 0; i < envcnt; i++) envs[i] = (char*)phasor_to_string(envarr[i]);
94 envs[envcnt] = NULL;
95
96 int r = execve(path, args, envs);
97 free(args);
98 free(envs);
99 return phasor_make_int(r); // will only return on error
100}
101
102static PhasorValue phasor_waitpid(PhasorVM* vm, int argc, const PhasorValue* argv) {
103 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1])) return phasor_make_int(-1);
104 pid_t pid = (pid_t)phasor_to_int(argv[0]);
105 int options = (int)phasor_to_int(argv[1]);
106 int status = 0;
107 pid_t r = waitpid(pid, &status, options);
109}
110
111// -----------------
112// Signal Wrappers
113// -----------------
114static PhasorValue phasor_kill(PhasorVM* vm, int argc, const PhasorValue* argv) {
115 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1])) return phasor_make_int(-1);
116 pid_t pid = (pid_t)phasor_to_int(argv[0]);
117 int sig = (int)phasor_to_int(argv[1]);
118 return phasor_make_int(kill(pid, sig));
119}
120
121// -----------------
122// Time Wrappers
123// -----------------
124static PhasorValue phasor_sleep(PhasorVM* vm, int argc, const PhasorValue* argv) {
125 if (argc < 1 || !phasor_is_int(argv[0])) return phasor_make_int(-1);
126 unsigned int sec = (unsigned int)phasor_to_int(argv[0]);
127 unsigned int r = sleep(sec);
128 return phasor_make_int(r);
129}
130
131static PhasorValue phasor_nanosleep(PhasorVM* vm, int argc, const PhasorValue* argv) {
132 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1])) return phasor_make_int(-1);
133 struct timespec req = {(time_t)phasor_to_int(argv[0]), (long)phasor_to_int(argv[1])};
134 struct timespec rem;
135 int r = nanosleep(&req, &rem);
136 return phasor_make_int(r);
137}
138
139static PhasorValue phasor_clock_gettime(PhasorVM* vm, int argc, const PhasorValue* argv) {
140 if (argc < 1 || !phasor_is_int(argv[0])) return phasor_make_int(-1);
141 struct timespec ts;
142 int r = clock_gettime((clockid_t)phasor_to_int(argv[0]), &ts);
143 PhasorValue vals[2] = {phasor_make_int(ts.tv_sec), phasor_make_int(ts.tv_nsec)};
144 return phasor_make_array(vals, 2);
145}
146
147// -----------------
148// Plugin Entry
149// -----------------
151 api->register_function(vm, "posix_open", phasor_open);
152 api->register_function(vm, "posix_close", phasor_close);
153 api->register_function(vm, "posix_read", phasor_read);
154 api->register_function(vm, "posix_write", phasor_write);
155 api->register_function(vm, "posix_unlink", phasor_unlink);
156
157 api->register_function(vm, "posix_mkdir", phasor_mkdir);
158 api->register_function(vm, "posix_rmdir", phasor_rmdir);
159
160 api->register_function(vm, "posix_fork", phasor_fork);
161 api->register_function(vm, "posix_execve", phasor_execve);
162 api->register_function(vm, "posix_waitpid", phasor_waitpid);
163
164 api->register_function(vm, "posix_kill", phasor_kill);
165
166 api->register_function(vm, "posix_sleep", phasor_sleep);
167 api->register_function(vm, "posix_nanosleep", phasor_nanosleep);
168 api->register_function(vm, "posix_clock_gettime", phasor_clock_gettime);
169}
static bool phasor_is_string(PhasorValue val)
Definition PhasorFFI.h:128
static const char * phasor_to_string(PhasorValue val)
Definition PhasorFFI.h:140
static int64_t phasor_to_int(PhasorValue val)
Definition PhasorFFI.h:135
static PhasorValue phasor_make_array(const PhasorValue *elements, size_t count)
Definition PhasorFFI.h:115
static PhasorValue phasor_make_string(const char *s)
Definition PhasorFFI.h:108
static bool phasor_is_int(PhasorValue val)
Definition PhasorFFI.h:126
static bool phasor_is_array(PhasorValue val)
Definition PhasorFFI.h:129
static PhasorValue phasor_make_int(int64_t i)
Definition PhasorFFI.h:94
struct PhasorVM PhasorVM
Definition PhasorFFI.h:42
#define PHASOR_FFI_EXPORT
Definition PhasorFFI.h:34
static PhasorValue phasor_rmdir(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_read(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_close(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_nanosleep(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_execve(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_unlink(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_write(PhasorVM *vm, int argc, const PhasorValue *argv)
PHASOR_FFI_EXPORT void phasor_plugin_entry(const PhasorAPI *api, PhasorVM *vm)
The one and only entry point for a Phasor plugin.
static PhasorValue phasor_kill(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_mkdir(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_fork(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_waitpid(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_clock_gettime(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_sleep(PhasorVM *vm, int argc, const PhasorValue *argv)
static PhasorValue phasor_open(PhasorVM *vm, int argc, const PhasorValue *argv)
PhasorRegisterFunction register_function
Definition PhasorFFI.h:157
struct PhasorValue::@257106260015165034006071221344325333366100147341::@324103060207145140324203224012174236216253240107 a
const PhasorValue * elements
Definition PhasorFFI.h:70
union PhasorValue::@257106260015165034006071221344325333366100147341 as
size_t count
Definition PhasorFFI.h:71