diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2003-01-06 14:52:57 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2003-01-06 14:52:57 +0000 |
commit | 5ba5d54bd13b2aaa6a25c2b417eec029ae97c60d (patch) | |
tree | 12508a09005982191c864954c04d2d88d1fc8718 /otherlibs/win32unix/channels.c | |
parent | 22649ba49d07a90212117bb4779dd3c60be0845c (diff) |
Lorsqu'un file_descr provient d'un fd du CRT, s'en souvenir et en tenir compte quand on fait Unix.dup2 (PR#1509). Remplacement de stdhandle par filedescr_of_fd.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5370 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/channels.c')
-rw-r--r-- | otherlibs/win32unix/channels.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/otherlibs/win32unix/channels.c b/otherlibs/win32unix/channels.c index 62b428e77..176aab9f5 100644 --- a/otherlibs/win32unix/channels.c +++ b/otherlibs/win32unix/channels.c @@ -18,14 +18,26 @@ #include "unixsupport.h" #include <fcntl.h> +extern long _get_osfhandle(int); +extern int _open_osfhandle(long, int); + CAMLprim value win_fd_handle(value handle) { - int fd = _open_osfhandle((long) Handle_val(handle), O_BINARY); - if (fd == -1) uerror("channel_of_descr", Nothing); + int fd; + if (CRT_fd_val(handle) != NO_CRT_FD) { + fd = CRT_fd_val(handle); + } else { + fd = _open_osfhandle((long) Handle_val(handle), O_BINARY); + if (fd == -1) uerror("channel_of_descr", Nothing); + CRT_fd_val(handle) = fd; + } return Val_int(fd); } -CAMLprim value win_handle_fd(value fd) +CAMLprim value win_handle_fd(value vfd) { - return win_alloc_handle_or_socket((HANDLE) _get_osfhandle(Int_val(fd))); + int crt_fd = Int_val(vfd); + value res = win_alloc_handle_or_socket((HANDLE) _get_osfhandle(crt_fd)); + CRT_fd_val(res) = crt_fd; + return res; } |