50
50
* great in the sys/unified module */
51
51
#ifndef JANET_WINDOWS
52
52
#include <errno.h> /* errno */
53
- #include <unistd.h> /* chdir(2) chown(2) chroot(2) dup2(2) fork(2)
53
+ #include <unistd.h> /* chown(2) chroot(2) dup2(2) fork(2)
54
54
* setegid(2) seteuid(2) setgid(2)
55
55
* setuid(2) setsid(2) */
56
56
#include <fcntl.h> /* F_GETLK F_SETLK - fcntl(2) open(2) */
57
57
#include <pwd.h> /* struct passwd - getpwnam_r(3) */
58
58
#include <grp.h> /* struct group - getgrnam(3) */
59
+ #include <stdio.h> /* fileno(3) */
59
60
#endif
60
61
61
62
/*============================================================================
111
112
#define GETGRNAM_R_NETBSD GETGRGID_R_NETBSD
112
113
#endif
113
114
114
- /* TODO: Trim down, we only care about *BSD, MacOS, Linux (glibc, musl), and
115
- * Windows! */
116
115
#define UCLIBC_PREREQ (M , m , p ) \
117
116
(__UCLIBC__ && \
118
117
(__UCLIBC_MAJOR__ > M || \
155
154
* Forward declarations *
156
155
===========================================================================*/
157
156
/* *nix: unistd.h, *: ? */
158
- JANET_CFUN (cfun_chdir ); /* TODO: remove, os/cd already exists! */
159
157
JANET_CFUN (cfun_chown );
160
158
JANET_CFUN (cfun_chroot );
161
159
JANET_CFUN (cfun_dup2 );
@@ -175,39 +173,15 @@ JANET_CFUN(cfun_getpwnam);
175
173
/* *nix: grp.h, *: ? */
176
174
JANET_CFUN (cfun_getgrnam );
177
175
178
- /* *nix: $this */
179
- /* JANET_CFUN(cfun_file_handle); */ /* See later TODO */
180
- /* int file_from_handle (Janet *argv , int idx, FILE **handle) */
176
+ /* *nix: stdio.h */
177
+ JANET_CFUN (cfun_file_handle ); /* See later TODO */
178
+ int file_to_fd (Janet * , int );
181
179
182
180
/*============================================================================
183
181
* Function definitions
184
182
===========================================================================*/
185
183
#ifndef JANET_WINDOWS /* *nix */
186
184
/* *nix: unistd.h, *: ? */
187
- JANET_FN (cfun_chdir , SYS_FUSAGE ("chdir" , " path-or-file" ),
188
- "-> _true|throws error_\n\n"
189
- "\t`path-or-file` **:string|:core/file**\n\n"
190
- "Changes the current working directory to `path-or-file`." ) {
191
- janet_fixarity (argc , 1 );
192
-
193
- if (janet_checktype (argv [0 ], JANET_ABSTRACT )) {
194
- FILE * f = ((JanetFile * )
195
- janet_getabstract (argv , 0 , & janet_file_type ))-> file ;
196
- if (0 != fchdir (fileno (f ))) {
197
- sys_errno ("Failed to chdir with file handle" );
198
- return janet_wrap_boolean (0 );
199
- }
200
- } else {
201
- const char * where = (char * )janet_getstring (argv , 0 );
202
- if (0 != chdir (where )) {
203
- sys_errnof ("Failed to chdir with path: %s" , where );
204
- return janet_wrap_boolean (0 );
205
- }
206
- }
207
-
208
- return janet_wrap_boolean (1 );
209
- }
210
-
211
185
JANET_FN (cfun_chown , SYS_FUSAGE ("chown" , " uid gid path-or-file" ),
212
186
"-> _true|throws error_\n\n"
213
187
"\t`uid` **:number**\n\n"
@@ -222,16 +196,19 @@ JANET_FN(cfun_chown, SYS_FUSAGE("chown", " uid gid path-or-file"),
222
196
gid_t gid = janet_getinteger (argv , 1 );
223
197
224
198
if (janet_checktype (argv [0 ], JANET_ABSTRACT )) {
225
- FILE * f = ((JanetFile * )
226
- janet_getabstract (argv , 0 , & janet_file_type ))-> file ;
227
- if (0 != fchown (fileno (f ), uid , gid )) {
228
- sys_errno ("Failed to chdir with file handle" );
229
- return janet_wrap_boolean (0 );
199
+ int fd ;
200
+ if (-1 != (fd = file_to_fd (argv , 0 ))) {
201
+ if (0 != fchown (fd , uid , gid )) {
202
+ sys_errno ("Failed to chown with file handle" );
203
+ return janet_wrap_boolean (0 );
204
+ }
205
+ } else {
206
+ janet_panic ("Invalid file handle" );
230
207
}
231
208
} else {
232
209
const char * where = (char * )janet_getstring (argv , 0 );
233
210
if (0 != chown (where , uid , gid )) {
234
- sys_errnof ("Failed to chdir with path: %s" , where );
211
+ sys_errnof ("Failed to chown with path: %s" , where );
235
212
return janet_wrap_boolean (0 );
236
213
}
237
214
}
@@ -412,9 +389,6 @@ JANET_FN(cfun_dup2, SYS_FUSAGE("dup2", "fd-to fd-from"),
412
389
return janet_wrap_boolean (1 );
413
390
}
414
391
415
- /* TODO: need a Janet function to turn a stream into an integer File
416
- * Descriptor */
417
-
418
392
JANET_FN (cfun_fork , SYS_FUSAGE0 ("fork" ),
419
393
"-> _:number pid|throws error_\n\n"
420
394
"Creates a fork of this proccess." ) {
@@ -531,18 +505,22 @@ JANET_FN(cfun_fcntl, SYS_FUSAGE("fcntl", " file flag"),
531
505
janet_fixarity (argc , 2 );
532
506
533
507
if (janet_checktype (argv [0 ], JANET_ABSTRACT )) {
534
- int fd = fileno (((JanetFile * )
535
- janet_getabstract (argv , 0 , & janet_file_type ))-> file );
536
508
int op = 0 ;
537
- if (janet_keyeq (argv [1 ], "get-lock" ))
538
- op = F_GETLK ;
539
- else if (janet_keyeq (argv [1 ], "set-lock" ))
540
- op = F_SETLK ;
541
- else if (janet_keyeq (argv [1 ], "wait-lock" ))
542
- op = F_SETLKW ;
543
- else {
544
- janet_panic ("Slot #2 must be a keyword equal to :get-lock "
545
- "| :set-lock | :wait-lock" );
509
+ int fd ;
510
+ if (-1 != (fd = file_to_fd (argv , 0 ))) {
511
+ if (janet_keyeq (argv [1 ], "get-lock" ))
512
+ op = F_GETLK ;
513
+ else if (janet_keyeq (argv [1 ], "set-lock" ))
514
+ op = F_SETLK ;
515
+ else if (janet_keyeq (argv [1 ], "wait-lock" ))
516
+ op = F_SETLKW ;
517
+ else {
518
+ janet_panic ("Slot #2 must be a keyword equal to :get-lock "
519
+ "| :set-lock | :wait-lock" );
520
+ return janet_wrap_boolean (0 );
521
+ }
522
+ } else {
523
+ janet_panic ("Invalid File Handle" );
546
524
return janet_wrap_boolean (0 );
547
525
}
548
526
@@ -861,9 +839,27 @@ JANET_FN(cfun_getgrnam, SYS_FUSAGE("getgrnam", " id-or-groupname"),
861
839
862
840
return janet_wrap_struct (r );
863
841
}
842
+
843
+ /* nix: stdio.h, *: ?*/
844
+ int file_to_fd (Janet * argv , int idx ) {
845
+ if (janet_checkfile (argv [idx ]))
846
+ return fileno (janet_unwrapfile (argv [idx ], NULL ));
847
+ return -1 ;
848
+ }
849
+
850
+ JANET_FN (cfun_fileno , SYS_FUSAGE ("fileno" , " file" ),
851
+ "-> _:number|throws error\n\n"
852
+ "\t`file` **:core/file**\n\n"
853
+ "Returns the integer file descriptor from a :core/file." ) {
854
+ int ret ;
855
+ if (-1 != (ret = file_to_fd (argv , 0 )))
856
+ return janet_wrap_integer (ret );
857
+
858
+ janet_panic ("Invalid File Handle" );
859
+ return janet_wrap_boolean (0 );
860
+ }
864
861
#else /* Windows */
865
862
/* *nix: unistd.h, *: ? */
866
- DEF_NOT_IMPL (cfun_chdir , "sys/windows/chdir" );
867
863
DEF_NOT_IMPL (cfun_chown , "sys/windows/chown" );
868
864
DEF_NOT_IMPL (cfun_chroot , "sys/windows/chroot" );
869
865
DEF_NOT_IMPL (cfun_dup2 , "sys/windows/dup2" );
@@ -882,6 +878,9 @@ DEF_NOT_IMPL(cfun_getpwnam, "sys/windows/getpwnam");
882
878
883
879
/* *nix: grp.h, *: ? */
884
880
DEF_NOT_IMPL (cfun_getgrnam , "sys/windows/getgrnam" );
881
+
882
+ /* *nix: stdio.h, *: ? */
883
+ DEF_NOT_IMPL (cfun_fileno , "sys/windows/fileno" );
885
884
#endif
886
885
887
886
/*============================================================================
@@ -892,25 +891,27 @@ DEF_NOT_IMPL(cfun_getgrnam, "sys/windows/getgrnam");
892
891
JANET_MODULE_ENTRY (JanetTable * env ) {
893
892
janet_cfuns_ext (env , "sys" , (JanetRegExt []) {
894
893
/* *nix: unistd.h, *: ? */
895
- JANET_REG (SYS_IMPL "/chdir" , cfun_chdir ),
896
- JANET_REG (SYS_IMPL "/chown" , cfun_chown ),
897
- JANET_REG (SYS_IMPL "/chroot" , cfun_chroot ),
898
- JANET_REG (SYS_IMPL "/dup2" , cfun_dup2 ),
899
- JANET_REG (SYS_IMPL "/fork" , cfun_fork ),
900
- JANET_REG (SYS_IMPL "/setegid" , cfun_setegid ),
901
- JANET_REG (SYS_IMPL "/seteuid" , cfun_seteuid ),
902
- JANET_REG (SYS_IMPL "/setgid" , cfun_setgid ),
903
- JANET_REG (SYS_IMPL "/setuid" , cfun_setuid ),
904
- JANET_REG (SYS_IMPL "/setsid" , cfun_setsid ),
905
-
906
- /* *nix: fcntl.h, *: ? */
907
- JANET_REG (SYS_IMPL "/fcntl" , cfun_fcntl ),
908
-
909
- /* *nix: pwd.h, *: ? */
910
- JANET_REG (SYS_IMPL "/getpwnam" , cfun_getpwnam ),
911
-
912
- /* *nix: grp.h, *: ? */
913
- JANET_REG (SYS_IMPL "/getgrnam" , cfun_getgrnam ),
914
- JANET_REG_END
894
+ JANET_REG (SYS_IMPL "/chown" , cfun_chown ),
895
+ JANET_REG (SYS_IMPL "/chroot" , cfun_chroot ),
896
+ JANET_REG (SYS_IMPL "/dup2" , cfun_dup2 ),
897
+ JANET_REG (SYS_IMPL "/fork" , cfun_fork ),
898
+ JANET_REG (SYS_IMPL "/setegid" , cfun_setegid ),
899
+ JANET_REG (SYS_IMPL "/seteuid" , cfun_seteuid ),
900
+ JANET_REG (SYS_IMPL "/setgid" , cfun_setgid ),
901
+ JANET_REG (SYS_IMPL "/setuid" , cfun_setuid ),
902
+ JANET_REG (SYS_IMPL "/setsid" , cfun_setsid ),
903
+
904
+ /* *nix: fcntl.h, *: ? */
905
+ JANET_REG (SYS_IMPL "/fcntl" , cfun_fcntl ),
906
+
907
+ /* *nix: pwd.h, *: ? */
908
+ JANET_REG (SYS_IMPL "/getpwnam" , cfun_getpwnam ),
909
+
910
+ /* *nix: grp.h, *: ? */
911
+ JANET_REG (SYS_IMPL "/getgrnam" , cfun_getgrnam ),
912
+
913
+ /* *nix: stdio.h, *: ? */
914
+ JANET_REG (SYS_IMPL "/fileno" , cfun_fileno ),
915
+ JANET_REG_END
915
916
});
916
917
}
0 commit comments