Skip to content

Commit f7b0f73

Browse files
committed
Move fchmodat to unix
1 parent f236d31 commit f7b0f73

File tree

6 files changed

+27
-18
lines changed

6 files changed

+27
-18
lines changed

lib_eio/unix/eio_unix.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ module Private : sig
107107

108108
val read_link : Fd.t option -> string -> string
109109
val read_link_unix : Unix.file_descr option -> string -> string
110+
val chmod : Fd.t -> string -> flags:int -> mode:int -> unit
111+
val chmod_unix : Unix.file_descr -> string -> flags:int -> mode:int -> unit
110112
end
111113

112114
module Pi = Pi

lib_eio/unix/primitives.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ CAMLprim value eio_unix_fork_fchdir(value);
99
CAMLprim value eio_unix_fork_dups(value);
1010
CAMLprim value eio_unix_cap_enter(value);
1111
CAMLprim value eio_unix_readlinkat(value, value, value);
12+
CAMLprim value eio_unix_fchmodat(value, value, value, value);
1213
CAMLprim value eio_unix_is_blocking(value);

lib_eio/unix/private.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,10 @@ let read_link_unix fd path =
3333
aux 1024
3434

3535
let read_link fd path = Fd.use_exn_opt "readlink" fd (fun fd -> read_link_unix fd path)
36+
37+
external eio_fchmodat : Unix.file_descr -> string -> int -> int -> unit = "eio_unix_fchmodat"
38+
39+
let chmod_unix fd path ~flags ~mode = eio_fchmodat fd path mode flags
40+
41+
let chmod fd path ~flags ~mode =
42+
Fd.use_exn "chmod" fd (fun fd -> chmod_unix ~flags ~mode fd path)

lib_eio/unix/stubs.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <unistd.h>
44
#include <fcntl.h>
55
#include <errno.h>
6+
#include <sys/stat.h>
67

78
#include <caml/mlvalues.h>
89
#include <caml/unixsupport.h>
@@ -52,3 +53,17 @@ CAMLprim value eio_unix_readlinkat(value v_fd, value v_path, value v_cs) {
5253
CAMLreturn(Val_int(ret));
5354
#endif
5455
}
56+
57+
CAMLprim value eio_unix_fchmodat(value v_fd, value v_path, value v_mode, value v_flags) {
58+
CAMLparam1(v_path);
59+
char *path;
60+
int ret;
61+
caml_unix_check_path(v_path, "fchmodat");
62+
path = caml_stat_strdup(String_val(v_path));
63+
caml_enter_blocking_section();
64+
ret = fchmodat(Int_val(v_fd), path, Int_val(v_mode), Int_val(v_flags));
65+
caml_leave_blocking_section();
66+
caml_stat_free_preserving_errno(path);
67+
if (ret == -1) uerror("fchmodat", v_path);
68+
CAMLreturn(Val_unit);
69+
}

lib_eio_posix/eio_posix_stubs.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -405,20 +405,6 @@ CAMLprim value caml_eio_posix_symlinkat(value v_old_path, value v_new_fd, value
405405
CAMLreturn(Val_unit);
406406
}
407407

408-
CAMLprim value caml_eio_posix_fchmodat(value v_fd, value v_path, value v_mode, value v_flags) {
409-
CAMLparam1(v_path);
410-
char *path;
411-
int ret;
412-
caml_unix_check_path(v_path, "fchmodat");
413-
path = caml_stat_strdup(String_val(v_path));
414-
caml_enter_blocking_section();
415-
ret = fchmodat(Int_val(v_fd), path, Int_val(v_mode), Int_val(v_flags));
416-
caml_leave_blocking_section();
417-
caml_stat_free_preserving_errno(path);
418-
if (ret == -1) uerror("fchmodat", v_path);
419-
CAMLreturn(Val_unit);
420-
}
421-
422408
CAMLprim value caml_eio_posix_spawn(value v_errors, value v_actions) {
423409
CAMLparam1(v_actions);
424410
pid_t child_pid;

lib_eio_posix/low_level.ml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -423,14 +423,12 @@ let symlink ~link_to new_dir new_path =
423423
let new_dir = Option.value new_dir ~default:at_fdcwd in
424424
eio_symlinkat link_to new_dir new_path
425425

426-
external eio_fchmodat : Unix.file_descr -> string -> int -> int -> unit = "caml_eio_posix_fchmodat"
427-
428426
let chmod ~follow ~mode dir path =
429427
in_worker_thread "chmod" @@ fun () ->
428+
let flags = if follow then 0 else Config.at_symlink_nofollow in
430429
Resolve.with_parent "chmod" dir path @@ fun dir path ->
431430
let new_dir = Option.value dir ~default:at_fdcwd in
432-
let flags = if follow then 0 else Config.at_symlink_nofollow in
433-
eio_fchmodat new_dir path mode flags
431+
Eio_unix.Private.chmod_unix new_dir path ~mode ~flags
434432

435433
let read_link dirfd path =
436434
in_worker_thread "read_link" @@ fun () ->

0 commit comments

Comments
 (0)