Skip to content

Commit 15f9e63

Browse files
committed
Add fcntl module
1 parent c24a1ca commit 15f9e63

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

src/modules/module_fcntl.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <errno.h>
2+
#include <fcntl.h>
3+
4+
#include <kuroko/vm.h>
5+
#include <kuroko/value.h>
6+
#include <kuroko/util.h>
7+
8+
#ifdef _WIN32
9+
KrkValue krk_module_onload_fcntl(void) {
10+
return NONE_VAL();
11+
}
12+
#else
13+
KRK_Function(fcntl) {
14+
KrkValue fd_value;
15+
int cmd;
16+
int arg = 0;
17+
if (!krk_parseArgs("Vi|i",
18+
(const char*[]){"fd","cmd","arg"},
19+
&fd_value, &cmd, &arg)) {
20+
return NONE_VAL();
21+
}
22+
int fd;
23+
if (IS_INTEGER(fd_value)) {
24+
fd = AS_INTEGER(fd_value);
25+
} else if (IS_INSTANCE(fd_value)){
26+
krk_push(fd_value);
27+
if (!krk_bindMethod(krk_getType(fd_value), S("fileno"))) {
28+
return krk_runtimeError(KRK_EXC(typeError),
29+
"no fileno() method on '%T'", fd_value);
30+
}
31+
KrkValue fileno = krk_callStack(0);
32+
if (!IS_INTEGER(fileno)) {
33+
return krk_runtimeError(KRK_EXC(typeError),
34+
"fileno() returned non-integer '%T'", fileno);
35+
}
36+
fd = AS_INTEGER(fileno);
37+
} else {
38+
return krk_runtimeError(KRK_EXC(typeError),
39+
"expected integer or object with fileno(), not '%T'", fileno);
40+
}
41+
int result = fcntl(fd, cmd, arg);
42+
if (result < 0) {
43+
return krk_runtimeError(KRK_EXC(OSError), "%s", strerror(errno));
44+
}
45+
return INTEGER_VAL(result);
46+
}
47+
48+
KrkValue krk_module_onload_fcntl(void) {
49+
KrkInstance *module = krk_newInstance(KRK_BASE_CLASS(module));
50+
krk_push(OBJECT_VAL(module));
51+
52+
KRK_DOC(module, "@brief Provides access to file control functions.");
53+
54+
KRK_DOC(BIND_FUNC(module,fcntl),
55+
"@brief Modify file fd with command cmd\n"
56+
"@arguments fd,cmd,arg=0\n\n"
57+
"@p cmd should be an integer value defined by the @c F options. "
58+
"@p arg should be an integer value defined by the @ref mod_os @c O options.");
59+
60+
#define FCNTL_CONST(c) krk_attachNamedValue(&module->fields, #c, INTEGER_VAL(c))
61+
62+
FCNTL_CONST(F_GETFL);
63+
FCNTL_CONST(F_SETFL);
64+
65+
return krk_pop();
66+
}
67+
#endif

src/modules/module_socket.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifdef _WIN32
1010
#include <winsock2.h>
1111
#include <ws2tcpip.h>
12+
#undef AF_UNIX
1213
#else
1314
#include <sys/socket.h>
1415
#include <arpa/inet.h>

tools/gendoc.krk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ let modules = [
115115
'collections',
116116
'string',
117117
'callgrind',
118+
'fcntl',
118119

119120
# Other stuff
120121
'tools.gendoc',

0 commit comments

Comments
 (0)