summaryrefslogtreecommitdiff
path: root/otherlibs/win32unix/unix.ml
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/win32unix/unix.ml')
-rw-r--r--otherlibs/win32unix/unix.ml797
1 files changed, 0 insertions, 797 deletions
diff --git a/otherlibs/win32unix/unix.ml b/otherlibs/win32unix/unix.ml
deleted file mode 100644
index f7a7e9ee7c..0000000000
--- a/otherlibs/win32unix/unix.ml
+++ /dev/null
@@ -1,797 +0,0 @@
-(***********************************************************************)
-(* *)
-(* Objective Caml *)
-(* *)
-(* Xavier Leroy and Pascal Cuoq, projet Cristal, INRIA Rocquencourt *)
-(* *)
-(* Copyright 1996 Institut National de Recherche en Informatique et *)
-(* en Automatique. All rights reserved. This file is distributed *)
-(* under the terms of the GNU Library General Public License, with *)
-(* the special exception on linking described in file ../../LICENSE. *)
-(* *)
-(***********************************************************************)
-
-(* $Id$ *)
-
-(* Initialization *)
-
-external startup: unit -> unit = "win_startup"
-external cleanup: unit -> unit = "win_cleanup"
-
-let _ = startup(); at_exit cleanup
-
-(* Errors *)
-
-type error =
- (* Errors defined in the POSIX standard *)
- E2BIG (* Argument list too long *)
- | EACCES (* Permission denied *)
- | EAGAIN (* Resource temporarily unavailable; try again *)
- | EBADF (* Bad file descriptor *)
- | EBUSY (* Resource unavailable *)
- | ECHILD (* No child process *)
- | EDEADLK (* Resource deadlock would occur *)
- | EDOM (* Domain error for math functions, etc. *)
- | EEXIST (* File exists *)
- | EFAULT (* Bad address *)
- | EFBIG (* File too large *)
- | EINTR (* Function interrupted by signal *)
- | EINVAL (* Invalid argument *)
- | EIO (* Hardware I/O error *)
- | EISDIR (* Is a directory *)
- | EMFILE (* Too many open files by the process *)
- | EMLINK (* Too many links *)
- | ENAMETOOLONG (* Filename too long *)
- | ENFILE (* Too many open files in the system *)
- | ENODEV (* No such device *)
- | ENOENT (* No such file or directory *)
- | ENOEXEC (* Not an executable file *)
- | ENOLCK (* No locks available *)
- | ENOMEM (* Not enough memory *)
- | ENOSPC (* No space left on device *)
- | ENOSYS (* Function not supported *)
- | ENOTDIR (* Not a directory *)
- | ENOTEMPTY (* Directory not empty *)
- | ENOTTY (* Inappropriate I/O control operation *)
- | ENXIO (* No such device or address *)
- | EPERM (* Operation not permitted *)
- | EPIPE (* Broken pipe *)
- | ERANGE (* Result too large *)
- | EROFS (* Read-only file system *)
- | ESPIPE (* Invalid seek e.g. on a pipe *)
- | ESRCH (* No such process *)
- | EXDEV (* Invalid link *)
- (* Additional errors, mostly BSD *)
- | EWOULDBLOCK (* Operation would block *)
- | EINPROGRESS (* Operation now in progress *)
- | EALREADY (* Operation already in progress *)
- | ENOTSOCK (* Socket operation on non-socket *)
- | EDESTADDRREQ (* Destination address required *)
- | EMSGSIZE (* Message too long *)
- | EPROTOTYPE (* Protocol wrong type for socket *)
- | ENOPROTOOPT (* Protocol not available *)
- | EPROTONOSUPPORT (* Protocol not supported *)
- | ESOCKTNOSUPPORT (* Socket type not supported *)
- | EOPNOTSUPP (* Operation not supported on socket *)
- | EPFNOSUPPORT (* Protocol family not supported *)
- | EAFNOSUPPORT (* Address family not supported by protocol family *)
- | EADDRINUSE (* Address already in use *)
- | EADDRNOTAVAIL (* Can't assign requested address *)
- | ENETDOWN (* Network is down *)
- | ENETUNREACH (* Network is unreachable *)
- | ENETRESET (* Network dropped connection on reset *)
- | ECONNABORTED (* Software caused connection abort *)
- | ECONNRESET (* Connection reset by peer *)
- | ENOBUFS (* No buffer space available *)
- | EISCONN (* Socket is already connected *)
- | ENOTCONN (* Socket is not connected *)
- | ESHUTDOWN (* Can't send after socket shutdown *)
- | ETOOMANYREFS (* Too many references: can't splice *)
- | ETIMEDOUT (* Connection timed out *)
- | ECONNREFUSED (* Connection refused *)
- | EHOSTDOWN (* Host is down *)
- | EHOSTUNREACH (* No route to host *)
- | ELOOP (* Too many levels of symbolic links *)
- | EOVERFLOW
- (* All other errors are mapped to EUNKNOWNERR *)
- | EUNKNOWNERR of int (* Unknown error *)
-
-exception Unix_error of error * string * string
-
-let _ = Callback.register_exception "Unix.Unix_error"
- (Unix_error(E2BIG, "", ""))
-
-external error_message : error -> string = "unix_error_message"
-
-let handle_unix_error f arg =
- try
- f arg
- with Unix_error(err, fun_name, arg) ->
- prerr_string Sys.argv.(0);
- prerr_string ": \"";
- prerr_string fun_name;
- prerr_string "\" failed";
- if String.length arg > 0 then begin
- prerr_string " on \"";
- prerr_string arg;
- prerr_string "\""
- end;
- prerr_string ": ";
- prerr_endline (error_message err);
- exit 2
-
-external environment : unit -> string array = "unix_environment"
-external getenv: string -> string = "sys_getenv"
-external putenv: string -> string -> unit = "unix_putenv"
-
-type process_status =
- WEXITED of int
- | WSIGNALED of int
- | WSTOPPED of int
-
-type wait_flag =
- WNOHANG
- | WUNTRACED
-
-type file_descr
-
-external execv : string -> string array -> unit = "unix_execv"
-external execve : string -> string array -> string array -> unit = "unix_execve"
-external execvp : string -> string array -> unit = "unix_execvp"
-external execvpe : string -> string array -> string array -> unit = "unix_execvpe"
-
-external waitpid : wait_flag list -> int -> int * process_status
- = "win_waitpid"
-external getpid : unit -> int = "unix_getpid"
-
-let fork () = invalid_arg "Unix.fork not implemented"
-let wait () = invalid_arg "Unix.wait not implemented"
-let getppid () = invalid_arg "Unix.getppid not implemented"
-let nice prio = invalid_arg "Unix.nice not implemented"
-
-(* Basic file input/output *)
-
-external filedescr_of_fd : int -> file_descr = "win_handle_fd"
-
-let stdin = filedescr_of_fd 0
-let stdout = filedescr_of_fd 1
-let stderr = filedescr_of_fd 2
-
-type open_flag =
- O_RDONLY
- | O_WRONLY
- | O_RDWR
- | O_NONBLOCK
- | O_APPEND
- | O_CREAT
- | O_TRUNC
- | O_EXCL
- | O_NOCTTY
- | O_DSYNC
- | O_SYNC
- | O_RSYNC
-
-type file_perm = int
-
-external openfile : string -> open_flag list -> file_perm -> file_descr
- = "unix_open"
-external close : file_descr -> unit = "unix_close"
-external unsafe_read : file_descr -> string -> int -> int -> int
- = "unix_read"
-external unsafe_write : file_descr -> string -> int -> int -> int
- = "unix_write"
-
-let read fd buf ofs len =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.read"
- else unsafe_read fd buf ofs len
-let write fd buf ofs len =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.write"
- else unsafe_write fd buf ofs len
-
-(* Interfacing with the standard input/output library *)
-
-external open_read_descriptor : int -> in_channel = "caml_open_descriptor_in"
-external open_write_descriptor : int -> out_channel = "caml_open_descriptor_out"
-external fd_of_in_channel : in_channel -> int = "channel_descriptor"
-external fd_of_out_channel : out_channel -> int = "channel_descriptor"
-
-external open_handle : file_descr -> int = "win_fd_handle"
-
-let in_channel_of_descr handle =
- open_read_descriptor(open_handle handle)
-let out_channel_of_descr handle =
- open_write_descriptor(open_handle handle)
-
-let descr_of_in_channel inchan =
- filedescr_of_fd(fd_of_in_channel inchan)
-let descr_of_out_channel outchan =
- filedescr_of_fd(fd_of_out_channel outchan)
-
-(* Seeking and truncating *)
-
-type seek_command =
- SEEK_SET
- | SEEK_CUR
- | SEEK_END
-
-external lseek : file_descr -> int -> seek_command -> int = "unix_lseek"
-
-let truncate name len = invalid_arg "Unix.truncate not implemented"
-let ftruncate fd len = invalid_arg "Unix.ftruncate not implemented"
-
-(* File statistics *)
-
-type file_kind =
- S_REG
- | S_DIR
- | S_CHR
- | S_BLK
- | S_LNK
- | S_FIFO
- | S_SOCK
-
-type stats =
- { st_dev : int;
- st_ino : int;
- st_kind : file_kind;
- st_perm : file_perm;
- st_nlink : int;
- st_uid : int;
- st_gid : int;
- st_rdev : int;
- st_size : int;
- st_atime : float;
- st_mtime : float;
- st_ctime : float }
-
-external stat : string -> stats = "unix_stat"
-let lstat = stat
-let fstat fd = invalid_arg "Unix.fstat not implemented"
-
-(* Operations on file names *)
-
-external unlink : string -> unit = "unix_unlink"
-external rename : string -> string -> unit = "unix_rename"
-external link : string -> string -> unit = "unix_link"
-
-(* Operations on large files *)
-
-module LargeFile =
- struct
- external lseek : file_descr -> int64 -> seek_command -> int64 = "unix_lseek_64"
- let truncate name len = invalid_arg "Unix.LargeFile.truncate not implemented"
- let ftruncate name len = invalid_arg "Unix.LargeFile.ftruncate not implemented"
- type stats =
- { st_dev : int;
- st_ino : int;
- st_kind : file_kind;
- st_perm : file_perm;
- st_nlink : int;
- st_uid : int;
- st_gid : int;
- st_rdev : int;
- st_size : int64;
- st_atime : float;
- st_mtime : float;
- st_ctime : float;
- }
- external stat : string -> stats = "unix_stat_64"
- let lstat = stat
- let fstat fd = invalid_arg "Unix.LargeFile.fstat not implemented"
- end
-
-(* File permissions and ownership *)
-
-type access_permission =
- R_OK
- | W_OK
- | X_OK
- | F_OK
-
-external chmod : string -> file_perm -> unit = "unix_chmod"
-let fchmod fd perm = invalid_arg "Unix.fchmod not implemented"
-let chown file perm = invalid_arg "Unix.chown not implemented"
-let fchown fd perm = invalid_arg "Unix.fchown not implemented"
-let umask msk = invalid_arg "Unix.umask not implemented"
-
-external access : string -> access_permission list -> unit = "unix_access"
-
-(* Operations on file descriptors *)
-
-external dup : file_descr -> file_descr = "unix_dup"
-external dup2 : file_descr -> file_descr -> unit = "unix_dup2"
-
-external set_nonblock : file_descr -> unit = "unix_set_nonblock"
-external clear_nonblock : file_descr -> unit = "unix_clear_nonblock"
-
-external set_close_on_exec : file_descr -> unit = "win_set_close_on_exec"
-external clear_close_on_exec : file_descr -> unit = "win_clear_close_on_exec"
-
-(* Directories *)
-
-external mkdir : string -> file_perm -> unit = "unix_mkdir"
-external rmdir : string -> unit = "unix_rmdir"
-external chdir : string -> unit = "unix_chdir"
-external getcwd : unit -> string = "unix_getcwd"
-let chroot _ = invalid_arg "Unix.chroot not implemented"
-
-type dir_entry =
- Dir_empty
- | Dir_read of string
- | Dir_toread
-
-type dir_handle =
- { dirname: string; mutable handle: int; mutable entry_read: dir_entry }
-
-external findfirst : string -> string * int = "win_findfirst"
-external findnext : int -> string= "win_findnext"
-
-let opendir dirname =
- try
- let (first_entry, handle) = findfirst (dirname ^ "\\*.*") in
- { dirname = dirname; handle = handle; entry_read = Dir_read first_entry }
- with End_of_file ->
- { dirname = dirname; handle = 0; entry_read = Dir_empty }
-
-let readdir d =
- match d.entry_read with
- Dir_empty -> raise End_of_file
- | Dir_read name -> d.entry_read <- Dir_toread; name
- | Dir_toread -> findnext d.handle
-
-external win_findclose : int -> unit = "win_findclose"
-
-let closedir d =
- match d.entry_read with
- Dir_empty -> ()
- | _ -> win_findclose d.handle
-
-let rewinddir d =
- closedir d;
- try
- let (first_entry, handle) = findfirst (d.dirname ^ "\\*.*") in
- d.handle <- handle; d.entry_read <- Dir_read first_entry
- with End_of_file ->
- d.handle <- 0; d.entry_read <- Dir_empty
-
-(* Pipes *)
-
-external pipe : unit -> file_descr * file_descr = "unix_pipe"
-
-let mkfifo name perm = invalid_arg "Unix.mkfifo not implemented"
-
-(* Symbolic links *)
-
-let readlink path = invalid_arg "Unix.readlink not implemented"
-let symlink path1 path2 = invalid_arg "Unix.symlink not implemented"
-
-(* Locking *)
-
-type lock_command =
- F_ULOCK
- | F_LOCK
- | F_TLOCK
- | F_TEST
- | F_RLOCK
- | F_TRLOCK
-
-external lockf : file_descr -> lock_command -> int -> unit = "unix_lockf"
-let kill pid signo = invalid_arg "Unix.kill not implemented"
-type sigprocmask_command = SIG_SETMASK | SIG_BLOCK | SIG_UNBLOCK
-let sigprocmask cmd sigs = invalid_arg "Unix.sigprocmask not implemented"
-let sigpending () = invalid_arg "Unix.sigpending not implemented"
-let sigsuspend sigs = invalid_arg "Unix.sigsuspend not implemented"
-let pause () = invalid_arg "Unix.pause not implemented"
-
-(* Time functions *)
-
-type process_times =
- { tms_utime : float;
- tms_stime : float;
- tms_cutime : float;
- tms_cstime : float }
-
-type tm =
- { tm_sec : int;
- tm_min : int;
- tm_hour : int;
- tm_mday : int;
- tm_mon : int;
- tm_year : int;
- tm_wday : int;
- tm_yday : int;
- tm_isdst : bool }
-
-external time : unit -> float = "unix_time"
-external gettimeofday : unit -> float = "unix_gettimeofday"
-external gmtime : float -> tm = "unix_gmtime"
-external localtime : float -> tm = "unix_localtime"
-external mktime : tm -> float * tm = "unix_mktime"
-let alarm n = invalid_arg "Unix.alarm not implemented"
-external sleep : int -> unit = "unix_sleep"
-let times () =
- { tms_utime = Sys.time(); tms_stime = 0.0;
- tms_cutime = 0.0; tms_cstime = 0.0 }
-external utimes : string -> float -> float -> unit = "unix_utimes"
-
-type interval_timer =
- ITIMER_REAL
- | ITIMER_VIRTUAL
- | ITIMER_PROF
-
-type interval_timer_status =
- { it_interval: float;
- it_value: float }
-
-let getitimer it = invalid_arg "Unix.getitimer not implemented"
-let setitimer it tm = invalid_arg "Unix.setitimer not implemented"
-
-(* User id, group id *)
-
-let getuid () = 1
-let geteuid = getuid
-let setuid id = invalid_arg "Unix.setuid not implemented"
-
-let getgid () = 1
-let getegid = getgid
-let setgid id = invalid_arg "Unix.setgid not implemented"
-
-let getgroups () = [|1|]
-
-type passwd_entry =
- { pw_name : string;
- pw_passwd : string;
- pw_uid : int;
- pw_gid : int;
- pw_gecos : string;
- pw_dir : string;
- pw_shell : string }
-
-type group_entry =
- { gr_name : string;
- gr_passwd : string;
- gr_gid : int;
- gr_mem : string array }
-
-let getlogin () = try Sys.getenv "USERNAME" with Not_found -> ""
-let getpwnam x = raise Not_found
-let getgrnam = getpwnam
-let getpwuid = getpwnam
-let getgrgid = getpwnam
-
-(* Internet addresses *)
-
-type inet_addr
-
-external inet_addr_of_string : string -> inet_addr
- = "unix_inet_addr_of_string"
-external string_of_inet_addr : inet_addr -> string
- = "unix_string_of_inet_addr"
-
-let inet_addr_any = inet_addr_of_string "0.0.0.0"
-
-(* Sockets *)
-
-type socket_domain =
- PF_UNIX
- | PF_INET
-
-type socket_type =
- SOCK_STREAM
- | SOCK_DGRAM
- | SOCK_RAW
- | SOCK_SEQPACKET
-
-type sockaddr =
- ADDR_UNIX of string
- | ADDR_INET of inet_addr * int
-
-type shutdown_command =
- SHUTDOWN_RECEIVE
- | SHUTDOWN_SEND
- | SHUTDOWN_ALL
-
-type msg_flag =
- MSG_OOB
- | MSG_DONTROUTE
- | MSG_PEEK
-
-type socket_bool_option =
- SO_DEBUG
- | SO_BROADCAST
- | SO_REUSEADDR
- | SO_KEEPALIVE
- | SO_DONTROUTE
- | SO_OOBINLINE
- | SO_ACCEPTCONN
-
-type socket_int_option =
- SO_SNDBUF
- | SO_RCVBUF
- | SO_ERROR
- | SO_TYPE
- | SO_RCVLOWAT
- | SO_SNDLOWAT
-
-type socket_optint_option = SO_LINGER
-
-type socket_float_option =
- SO_RCVTIMEO
- | SO_SNDTIMEO
-
-external socket : socket_domain -> socket_type -> int -> file_descr
- = "unix_socket"
-let socketpair dom ty proto = invalid_arg "Unix.socketpair not implemented"
-external accept : file_descr -> file_descr * sockaddr = "unix_accept"
-external bind : file_descr -> sockaddr -> unit = "unix_bind"
-external connect : file_descr -> sockaddr -> unit = "unix_connect"
-external listen : file_descr -> int -> unit = "unix_listen"
-external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown"
-external getsockname : file_descr -> sockaddr = "unix_getsockname"
-external getpeername : file_descr -> sockaddr = "unix_getpeername"
-
-external unsafe_recv :
- file_descr -> string -> int -> int -> msg_flag list -> int
- = "unix_recv"
-external unsafe_recvfrom :
- file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr
- = "unix_recvfrom"
-external unsafe_send :
- file_descr -> string -> int -> int -> msg_flag list -> int
- = "unix_send"
-external unsafe_sendto :
- file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int
- = "unix_sendto" "unix_sendto_native"
-
-let recv fd buf ofs len flags =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.recv"
- else unsafe_recv fd buf ofs len flags
-let recvfrom fd buf ofs len flags =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.recvfrom"
- else unsafe_recvfrom fd buf ofs len flags
-let send fd buf ofs len flags =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.send"
- else unsafe_send fd buf ofs len flags
-let sendto fd buf ofs len flags addr =
- if ofs < 0 || len < 0 || ofs > String.length buf - len
- then invalid_arg "Unix.sendto"
- else unsafe_sendto fd buf ofs len flags addr
-
-external getsockopt : file_descr -> socket_bool_option -> bool
- = "unix_getsockopt_bool"
-external setsockopt : file_descr -> socket_bool_option -> bool -> unit
- = "unix_setsockopt_bool"
-external getsockopt_int : file_descr -> socket_int_option -> int
- = "unix_getsockopt_int"
-external setsockopt_int : file_descr -> socket_int_option -> int -> unit
- = "unix_setsockopt_int"
-external getsockopt_optint : file_descr -> socket_optint_option -> int option
- = "unix_getsockopt_optint"
-external setsockopt_optint : file_descr -> socket_optint_option -> int option -> unit
- = "unix_setsockopt_optint"
-external getsockopt_float : file_descr -> socket_float_option -> float
- = "unix_getsockopt_float"
-external setsockopt_float : file_descr -> socket_float_option -> float -> unit
- = "unix_setsockopt_float"
-
-(* Host and protocol databases *)
-
-type host_entry =
- { h_name : string;
- h_aliases : string array;
- h_addrtype : socket_domain;
- h_addr_list : inet_addr array }
-
-type protocol_entry =
- { p_name : string;
- p_aliases : string array;
- p_proto : int }
-
-type service_entry =
- { s_name : string;
- s_aliases : string array;
- s_port : int;
- s_proto : string }
-
-external gethostname : unit -> string = "unix_gethostname"
-external gethostbyname : string -> host_entry = "unix_gethostbyname"
-external gethostbyaddr : inet_addr -> host_entry = "unix_gethostbyaddr"
-external getprotobyname : string -> protocol_entry
- = "unix_getprotobyname"
-external getprotobynumber : int -> protocol_entry
- = "unix_getprotobynumber"
-
-external getservbyname : string -> string -> service_entry
- = "unix_getservbyname"
-external getservbyport : int -> string -> service_entry
- = "unix_getservbyport"
-
-(* High-level process management (system, popen) *)
-
-external win_create_process : string -> string -> string option ->
- file_descr -> file_descr -> file_descr -> int
- = "win_create_process" "win_create_process_native"
-
-let create_process prog args fd1 fd2 fd3 =
- win_create_process prog (String.concat " " (Array.to_list args)) None
- fd1 fd2 fd3
-
-let create_process_env prog args env fd1 fd2 fd3 =
- win_create_process prog (String.concat " " (Array.to_list args))
- (Some(String.concat "\000" (Array.to_list env) ^ "\000"))
- fd1 fd2 fd3
-
-external system: string -> process_status = "win_system"
-
-type popen_process =
- Process of in_channel * out_channel
- | Process_in of in_channel
- | Process_out of out_channel
- | Process_full of in_channel * out_channel * in_channel
-
-let popen_processes = (Hashtbl.create 7 : (popen_process, int) Hashtbl.t)
-
-let open_proc cmd optenv proc input output error =
- let shell =
- try Sys.getenv "COMSPEC"
- with Not_found -> raise(Unix_error(ENOEXEC, "open_proc", cmd)) in
- let pid =
- win_create_process shell (shell ^ " /c " ^ cmd) optenv
- input output error in
- Hashtbl.add popen_processes proc pid
-
-let open_process_in cmd =
- let (in_read, in_write) = pipe() in
- set_close_on_exec in_read;
- let inchan = in_channel_of_descr in_read in
- open_proc cmd None (Process_in inchan) stdin in_write stderr;
- close in_write;
- inchan
-
-let open_process_out cmd =
- let (out_read, out_write) = pipe() in
- set_close_on_exec out_write;
- let outchan = out_channel_of_descr out_write in
- open_proc cmd None (Process_out outchan) out_read stdout stderr;
- close out_read;
- outchan
-
-let open_process cmd =
- let (in_read, in_write) = pipe() in
- let (out_read, out_write) = pipe() in
- set_close_on_exec in_read;
- set_close_on_exec out_write;
- let inchan = in_channel_of_descr in_read in
- let outchan = out_channel_of_descr out_write in
- open_proc cmd None (Process(inchan, outchan)) out_read in_write stderr;
- close out_read; close in_write;
- (inchan, outchan)
-
-let open_process_full cmd env =
- let (in_read, in_write) = pipe() in
- let (out_read, out_write) = pipe() in
- let (err_read, err_write) = pipe() in
- set_close_on_exec in_read;
- set_close_on_exec out_write;
- set_close_on_exec err_read;
- let inchan = in_channel_of_descr in_read in
- let outchan = out_channel_of_descr out_write in
- let errchan = in_channel_of_descr err_read in
- open_proc cmd (Some(String.concat "\000" (Array.to_list env) ^ "\000"))
- (Process_full(inchan, outchan, errchan))
- out_read in_write err_write;
- close out_read; close in_write; close err_write;
- (inchan, outchan, errchan)
-
-let find_proc_id fun_name proc =
- try
- let pid = Hashtbl.find popen_processes proc in
- Hashtbl.remove popen_processes proc;
- pid
- with Not_found ->
- raise(Unix_error(EBADF, fun_name, ""))
-
-let close_process_in inchan =
- let pid = find_proc_id "close_process_in" (Process_in inchan) in
- close_in inchan;
- snd(waitpid [] pid)
-
-let close_process_out outchan =
- let pid = find_proc_id "close_process_out" (Process_out outchan) in
- close_out outchan;
- snd(waitpid [] pid)
-
-let close_process (inchan, outchan) =
- let pid = find_proc_id "close_process" (Process(inchan, outchan)) in
- close_in inchan; close_out outchan;
- snd(waitpid [] pid)
-
-let close_process_full (inchan, outchan, errchan) =
- let pid =
- find_proc_id "close_process_full"
- (Process_full(inchan, outchan, errchan)) in
- close_in inchan; close_out outchan; close_in errchan;
- snd(waitpid [] pid)
-
-(* Polling *)
-
-external select :
- file_descr list -> file_descr list -> file_descr list -> float ->
- file_descr list * file_descr list * file_descr list = "unix_select"
-
-(* High-level network functions *)
-
-let open_connection sockaddr =
- let domain =
- match sockaddr with ADDR_UNIX _ -> PF_UNIX | ADDR_INET(_,_) -> PF_INET in
- let sock =
- socket domain SOCK_STREAM 0 in
- connect sock sockaddr;
- (in_channel_of_descr sock, out_channel_of_descr sock)
-
-let shutdown_connection inchan =
- shutdown (descr_of_in_channel inchan) SHUTDOWN_SEND
-
-let establish_server server_fun sockaddr =
- invalid_arg "Unix.establish_server not implmented"
-
-(* Terminal interface *)
-
-type terminal_io = {
- mutable c_ignbrk: bool;
- mutable c_brkint: bool;
- mutable c_ignpar: bool;
- mutable c_parmrk: bool;
- mutable c_inpck: bool;
- mutable c_istrip: bool;
- mutable c_inlcr: bool;
- mutable c_igncr: bool;
- mutable c_icrnl: bool;
- mutable c_ixon: bool;
- mutable c_ixoff: bool;
- mutable c_opost: bool;
- mutable c_obaud: int;
- mutable c_ibaud: int;
- mutable c_csize: int;
- mutable c_cstopb: int;
- mutable c_cread: bool;
- mutable c_parenb: bool;
- mutable c_parodd: bool;
- mutable c_hupcl: bool;
- mutable c_clocal: bool;
- mutable c_isig: bool;
- mutable c_icanon: bool;
- mutable c_noflsh: bool;
- mutable c_echo: bool;
- mutable c_echoe: bool;
- mutable c_echok: bool;
- mutable c_echonl: bool;
- mutable c_vintr: char;
- mutable c_vquit: char;
- mutable c_verase: char;
- mutable c_vkill: char;
- mutable c_veof: char;
- mutable c_veol: char;
- mutable c_vmin: int;
- mutable c_vtime: int;
- mutable c_vstart: char;
- mutable c_vstop: char
- }
-
-type setattr_when = TCSANOW | TCSADRAIN | TCSAFLUSH
-
-let tcgetattr fd = invalid_arg "Unix.tcgetattr not implemented"
-let tcsetattr fd wh = invalid_arg "Unix.tcsetattr not implemented"
-let tcsendbreak fd n = invalid_arg "Unix.tcsendbreak not implemented"
-let tcdrain fd = invalid_arg "Unix.tcdrain not implemented"
-
-type flush_queue = TCIFLUSH | TCOFLUSH | TCIOFLUSH
-let tcflush fd q = invalid_arg "Unix.tcflush not implemented"
-type flow_action = TCOOFF | TCOON | TCIOFF | TCION
-let tcflow fd fl = invalid_arg "Unix.tcflow not implemented"
-let setsid () = invalid_arg "Unix.setsid not implemented"