summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/unix')
-rw-r--r--otherlibs/unix/.depend493
-rw-r--r--otherlibs/unix/Makefile7
-rw-r--r--otherlibs/unix/addrofstr.c21
-rw-r--r--otherlibs/unix/cst2constr.h6
-rw-r--r--otherlibs/unix/getaddrinfo.c133
-rw-r--r--otherlibs/unix/gethost.c13
-rw-r--r--otherlibs/unix/getnameinfo.c67
-rw-r--r--otherlibs/unix/getpeername.c2
-rw-r--r--otherlibs/unix/socket.c9
-rw-r--r--otherlibs/unix/socketaddr.c57
-rw-r--r--otherlibs/unix/socketaddr.h19
-rw-r--r--otherlibs/unix/strofaddr.c19
-rw-r--r--otherlibs/unix/unix.ml152
-rw-r--r--otherlibs/unix/unix.mli94
-rw-r--r--otherlibs/unix/unixLabels.mli89
15 files changed, 813 insertions, 368 deletions
diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend
index 0de794dad..4179e3e9b 100644
--- a/otherlibs/unix/.depend
+++ b/otherlibs/unix/.depend
@@ -1,346 +1,233 @@
-accept.o: accept.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \
- socketaddr.h
-access.o: access.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h unixsupport.h
-addrofstr.o: addrofstr.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/fail.h \
- unixsupport.h socketaddr.h
-alarm.o: alarm.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+accept.o: accept.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h socketaddr.h
+access.o: access.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+addrofstr.o: addrofstr.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
+alarm.o: alarm.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-bind.o: bind.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+bind.o: bind.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h socketaddr.h
-chdir.o: chdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-chmod.o: chmod.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+chdir.o: chdir.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-chown.o: chown.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+chmod.o: chmod.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-chroot.o: chroot.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+chown.o: chown.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-close.o: close.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+chroot.o: chroot.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+close.o: close.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-closedir.o: closedir.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-connect.o: connect.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/signals.h \
- unixsupport.h socketaddr.h
-cst2constr.o: cst2constr.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/fail.h cst2constr.h
-cstringv.o: cstringv.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
+closedir.o: closedir.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+connect.o: connect.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
+cst2constr.o: cst2constr.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h cst2constr.h
+cstringv.o: cstringv.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+dup2.o: dup2.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-dup2.o: dup2.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+dup.o: dup.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-envir.o: envir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h
-errmsg.o: errmsg.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h
-execv.o: execv.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
- ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h unixsupport.h
-execve.o: execve.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
+envir.o: envir.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h
+errmsg.o: errmsg.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h
+execv.o: execv.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+execve.o: execve.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-execvp.o: execvp.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
+execvp.o: execvp.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-exit.o: exit.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-fchmod.o: fchmod.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+exit.o: exit.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-fchown.o: fchown.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-fcntl.o: fcntl.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-fork.o: fork.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+fchmod.o: fchmod.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+fchown.o: fchown.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+fcntl.o: fcntl.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-ftruncate.o: ftruncate.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/io.h unixsupport.h
-getcwd.o: getcwd.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h unixsupport.h
-getegid.o: getegid.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-geteuid.o: geteuid.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-getgid.o: getgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+fork.o: fork.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-getgr.o: getgr.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/fail.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ftruncate.o: ftruncate.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getaddrinfo.o: getaddrinfo.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h cst2constr.h socketaddr.h
+getcwd.o: getcwd.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getegid.o: getegid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+geteuid.o: geteuid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getgid.o: getgid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getgr.o: getgr.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
-getgroups.o: getgroups.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-gethost.o: gethost.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
- ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \
- ../../byterun/signals.h unixsupport.h socketaddr.h
-gethostname.o: gethostname.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-getlogin.o: getlogin.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-getpeername.o: getpeername.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
-getpid.o: getpid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-getppid.o: getppid.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-getproto.o: getproto.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
- ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \
- unixsupport.h
-getpw.o: getpw.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h
-getserv.o: getserv.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
- ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \
- unixsupport.h
-getsockname.o: getsockname.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
+getgroups.o: getgroups.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+gethost.o: gethost.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h socketaddr.h
+gethostname.o: gethostname.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getlogin.o: getlogin.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getnameinfo.o: getnameinfo.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h socketaddr.h
+getpeername.o: getpeername.c ../../byterun/config.h ../../config/m.h \
../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
-gettimeofday.o: gettimeofday.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-getuid.o: getuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-gmtime.o: gmtime.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
+getpid.o: getpid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getppid.o: getppid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getproto.o: getproto.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-itimer.o: itimer.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
+getpw.o: getpw.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+getserv.o: getserv.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-kill.o: kill.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/fail.h unixsupport.h \
- ../../byterun/signals.h
-link.o: link.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-listen.o: listen.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-lockf.o: lockf.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-lseek.o: lseek.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/io.h \
- unixsupport.h
-mkdir.o: mkdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-mkfifo.o: mkfifo.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-nice.o: nice.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h unixsupport.h
-open.o: open.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
-opendir.o: opendir.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-pipe.o: pipe.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h unixsupport.h
-putenv.o: putenv.c ../../byterun/memory.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/misc.h \
+getsockname.o: getsockname.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
+gettimeofday.o: gettimeofday.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+getuid.o: getuid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+gmtime.o: gmtime.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-read.o: read.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
+itimer.o: itimer.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
-readdir.o: readdir.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/fail.h \
- ../../byterun/alloc.h unixsupport.h
-readlink.o: readlink.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-rename.o: rename.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/minor_gc.h unixsupport.h
+kill.o: kill.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h unixsupport.h
+link.o: link.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-rewinddir.o: rewinddir.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
+listen.o: listen.c ../../byterun/config.h ../../config/m.h \
../../config/s.h ../../byterun/misc.h unixsupport.h
-rmdir.o: rmdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+lockf.o: lockf.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-select.o: select.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
-sendrecv.o: sendrecv.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
- ../../byterun/freelist.h ../../byterun/minor_gc.h \
- ../../byterun/signals.h unixsupport.h socketaddr.h
-setgid.o: setgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+lseek.o: lseek.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-setsid.o: setsid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+mkdir.o: mkdir.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h unixsupport.h
+mkfifo.o: mkfifo.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+nice.o: nice.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-setuid.o: setuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+open.o: open.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+opendir.o: opendir.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+pipe.o: pipe.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-shutdown.o: shutdown.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
+putenv.o: putenv.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/gc.h ../../byterun/mlvalues.h \
+ ../../byterun/misc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h
+read.o: read.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+readdir.o: readdir.c ../../byterun/config.h ../../config/m.h \
../../config/s.h ../../byterun/misc.h unixsupport.h
-signals.o: signals.c ../../byterun/alloc.h ../../byterun/compatibility.h \
- ../../byterun/misc.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/mlvalues.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
-sleep.o: sleep.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/signals.h unixsupport.h
-socket.o: socket.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+readlink.o: readlink.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+rename.o: rename.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+rewinddir.o: rewinddir.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+rmdir.o: rmdir.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-socketaddr.o: socketaddr.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \
- ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \
- socketaddr.h
-socketpair.o: socketpair.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-sockopt.o: sockopt.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h socketaddr.h
-stat.o: stat.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
+select.o: select.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
+ ../../byterun/major_gc.h ../../byterun/freelist.h \
+ ../../byterun/minor_gc.h unixsupport.h
+sendrecv.o: sendrecv.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/alloc.h unixsupport.h \
- cst2constr.h ../../byterun/io.h
-strofaddr.o: strofaddr.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h socketaddr.h
-symlink.o: symlink.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h unixsupport.h
-termios.o: termios.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- unixsupport.h
-time.o: time.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h unixsupport.h
-times.o: times.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
+ ../../byterun/minor_gc.h unixsupport.h socketaddr.h
+setgid.o: setgid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+setsid.o: setsid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+setuid.o: setuid.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+shutdown.o: shutdown.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+signals.o: signals.c ../../byterun/misc.h ../../byterun/config.h \
+ ../../config/m.h ../../config/s.h ../../byterun/mlvalues.h \
../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
../../byterun/minor_gc.h unixsupport.h
-truncate.o: truncate.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/io.h unixsupport.h
-umask.o: umask.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+sleep.o: sleep.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-unixsupport.o: unixsupport.c ../../byterun/mlvalues.h \
- ../../byterun/compatibility.h ../../byterun/config.h ../../config/m.h \
- ../../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \
- ../../byterun/callback.h ../../byterun/memory.h ../../byterun/gc.h \
+socketaddr.o: socketaddr.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h \
+ ../../byterun/minor_gc.h unixsupport.h socketaddr.h
+socket.o: socket.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+socketpair.o: socketpair.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+sockopt.o: sockopt.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
+stat.o: stat.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \
cst2constr.h
-unlink.o: unlink.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+strofaddr.o: strofaddr.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h socketaddr.h
+symlink.o: symlink.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+termios.o: termios.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+time.o: time.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-utimes.o: utimes.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
+times.o: times.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+truncate.o: truncate.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+umask.o: umask.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
../../byterun/misc.h unixsupport.h
-wait.o: wait.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/memory.h \
- ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
-write.o: write.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \
- ../../byterun/config.h ../../config/m.h ../../config/s.h \
- ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \
+unixsupport.o: unixsupport.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h ../../byterun/gc.h \
../../byterun/major_gc.h ../../byterun/freelist.h \
- ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h
+ ../../byterun/minor_gc.h unixsupport.h cst2constr.h
+unlink.o: unlink.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+utimes.o: utimes.c ../../byterun/config.h ../../config/m.h \
+ ../../config/s.h ../../byterun/misc.h unixsupport.h
+wait.o: wait.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
+write.o: write.c ../../byterun/config.h ../../config/m.h ../../config/s.h \
+ ../../byterun/misc.h ../../byterun/gc.h ../../byterun/major_gc.h \
+ ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h
unixLabels.cmi: unix.cmi
-unix.cmo: unix.cmi
-unix.cmx: unix.cmi
unixLabels.cmo: unix.cmi unixLabels.cmi
unixLabels.cmx: unix.cmx unixLabels.cmi
+unix.cmo: unix.cmi
+unix.cmx: unix.cmi
diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile
index 2121ce76d..da701d5dc 100644
--- a/otherlibs/unix/Makefile
+++ b/otherlibs/unix/Makefile
@@ -28,9 +28,10 @@ COMPFLAGS=-warn-error A
OBJS=accept.o access.o addrofstr.o alarm.o bind.o chdir.o chmod.o \
chown.o chroot.o close.o closedir.o connect.o cst2constr.o cstringv.o \
dup.o dup2.o envir.o errmsg.o execv.o execve.o execvp.o exit.o \
- fchmod.o fchown.o fcntl.o fork.o ftruncate.o getcwd.o getegid.o \
- geteuid.o getgid.o getgr.o getgroups.o gethost.o gethostname.o \
- getlogin.o getpeername.o getpid.o getppid.o getproto.o getpw.o \
+ fchmod.o fchown.o fcntl.o fork.o ftruncate.o \
+ getaddrinfo.o getcwd.o getegid.o geteuid.o getgid.o \
+ getgr.o getgroups.o gethost.o gethostname.o getlogin.o \
+ getnameinfo.o getpeername.o getpid.o getppid.o getproto.o getpw.o \
gettimeofday.o getserv.o getsockname.o getuid.o \
gmtime.o itimer.o kill.o link.o listen.o lockf.o lseek.o mkdir.o \
mkfifo.o nice.o open.o opendir.o pipe.o putenv.o read.o \
diff --git a/otherlibs/unix/addrofstr.c b/otherlibs/unix/addrofstr.c
index 140f9c3b0..5dfcf368d 100644
--- a/otherlibs/unix/addrofstr.c
+++ b/otherlibs/unix/addrofstr.c
@@ -23,16 +23,25 @@
CAMLprim value unix_inet_addr_of_string(value s)
{
-#ifdef HAS_INET_ATON
+#if defined(HAS_IPV6)
+ struct in_addr address;
+ struct in6_addr address6;
+ if (inet_pton(AF_INET, String_val(s), &address) > 0)
+ return alloc_inet_addr(&address);
+ else if (inet_pton(AF_INET6, String_val(s), &address6) > 0)
+ return alloc_inet6_addr(&address6);
+ else
+ failwith("inet_addr_of_string");
+#elif defined(HAS_INET_ATON)
struct in_addr address;
if (inet_aton(String_val(s), &address) == 0)
failwith("inet_addr_of_string");
- return alloc_inet_addr(address.s_addr);
+ return alloc_inet_addr(&address);
#else
- unsigned int address;
- address = inet_addr(String_val(s));
- if (address == (unsigned int) -1) failwith("inet_addr_of_string");
- return alloc_inet_addr(address);
+ struct in_addr address;
+ address.s_addr = inet_addr(String_val(s));
+ if (address.s_addr == (uint32) -1) failwith("inet_addr_of_string");
+ return alloc_inet_addr(&address);
#endif
}
diff --git a/otherlibs/unix/cst2constr.h b/otherlibs/unix/cst2constr.h
index 2ee2ce50b..3cb1c1182 100644
--- a/otherlibs/unix/cst2constr.h
+++ b/otherlibs/unix/cst2constr.h
@@ -13,8 +13,4 @@
/* $Id$ */
-#ifdef __STDC__
-value cst_to_constr(int, int *, int, int);
-#else
-value cst_to_constr();
-#endif
+extern value cst_to_constr(int n, int * tbl, int size, int deflt);
diff --git a/otherlibs/unix/getaddrinfo.c b/otherlibs/unix/getaddrinfo.c
new file mode 100644
index 000000000..104f55c49
--- /dev/null
+++ b/otherlibs/unix/getaddrinfo.c
@@ -0,0 +1,133 @@
+/***********************************************************************/
+/* */
+/* Objective Caml */
+/* */
+/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
+/* */
+/* Copyright 2004 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$ */
+
+#include <string.h>
+#include <mlvalues.h>
+#include <alloc.h>
+#include <memory.h>
+#include <fail.h>
+#include <signals.h>
+#include "unixsupport.h"
+#include "cst2constr.h"
+
+#if defined(HAS_SOCKETS) && defined(HAS_IPV6)
+
+#include "socketaddr.h"
+#ifndef _WIN32
+#include <sys/types.h>
+#include <netdb.h>
+#endif
+
+extern int socket_domain_table[]; /* from socket.c */
+extern int socket_type_table[]; /* from socket.c */
+
+static value convert_addrinfo(struct addrinfo * a)
+{
+ CAMLparam0();
+ CAMLlocal3(vres,vaddr,vcanonname);
+ union sock_addr_union sa;
+
+ memcpy(&sa.s_gen, a->ai_addr, sizeof(struct sockaddr));
+ vaddr = alloc_sockaddr(&sa, sizeof(struct sockaddr));
+ vcanonname = copy_string(a->ai_canonname == NULL ? "" : a->ai_canonname);
+ vres = alloc_small(5, 0);
+ Field(vres, 0) = cst_to_constr(a->ai_family, socket_domain_table, 3, 0);
+ Field(vres, 1) = cst_to_constr(a->ai_socktype, socket_type_table, 4, 0);
+ Field(vres, 2) = Val_int(a->ai_protocol);
+ Field(vres, 3) = vaddr;
+ Field(vres, 4) = vcanonname;
+ CAMLreturn(vres);
+}
+
+CAMLprim value unix_getaddrinfo(value vnode, value vserv, value vopts)
+{
+ CAMLparam3(vnode, vserv, vopts);
+ CAMLlocal3(vres, v, e);
+ mlsize_t len;
+ char * node, * serv;
+ struct addrinfo hints;
+ struct addrinfo * res, * r;
+ int retcode;
+
+ /* Extract "node" parameter */
+ len = string_length(vnode);
+ if (len == 0) {
+ node = NULL;
+ } else {
+ node = stat_alloc(len + 1);
+ strcpy(node, String_val(vnode));
+ }
+ /* Extract "service" parameter */
+ len = string_length(vserv);
+ if (len == 0) {
+ serv = NULL;
+ } else {
+ serv = stat_alloc(len + 1);
+ strcpy(serv, String_val(vserv));
+ }
+ /* Parse options, set hints */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ for (/*nothing*/; Is_block(vopts); vopts = Field(vopts, 1)) {
+ v = Field(vopts, 0);
+ if (Is_block(v))
+ switch (Tag_val(v)) {
+ case 0: /* AI_FAMILY of socket_domain */
+ hints.ai_family = socket_domain_table[Int_val(Field(v, 0))];
+ break;
+ case 1: /* AI_SOCKTYPE of socket_type */
+ hints.ai_socktype = socket_type_table[Int_val(Field(v, 0))];
+ break;
+ case 2: /* AI_PROTOCOL of int */
+ hints.ai_protocol = Int_val(Field(v, 0));
+ break;
+ }
+ else
+ switch (Int_val(v)) {
+ case 0: /* AI_NUMERICHOST */
+ hints.ai_flags |= AI_NUMERICHOST; break;
+ case 1: /* AI_CANONNAME */
+ hints.ai_flags |= AI_CANONNAME; break;
+ case 2: /* AI_PASSIVE */
+ hints.ai_flags |= AI_PASSIVE; break;
+ }
+ }
+ /* Do the call */
+ enter_blocking_section();
+ retcode = getaddrinfo(node, serv, &hints, &res);
+ leave_blocking_section();
+ if (node != NULL) stat_free(node);
+ if (serv != NULL) stat_free(serv);
+ /* Convert result */
+ vres = Val_int(0);
+ if (retcode == 0) {
+ for (r = res; r != NULL; r = r->ai_next) {
+ e = convert_addrinfo(r);
+ v = alloc_small(2, 0);
+ Field(v, 0) = e;
+ Field(v, 1) = vres;
+ vres = v;
+ }
+ freeaddrinfo(res);
+ }
+ CAMLreturn(vres);
+}
+
+#else
+
+CAMLprim value unix_getaddrinfo(value vnode, value vserv, value vopts)
+{ invalid_argument("getaddrinfo not implemented"); }
+
+#endif
diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c
index 5b3252d59..3e3e5f971 100644
--- a/otherlibs/unix/gethost.c
+++ b/otherlibs/unix/gethost.c
@@ -43,8 +43,15 @@ extern int socket_domain_table[];
static value alloc_one_addr(char const *a)
{
struct in_addr addr;
- memmove (&addr, a, entry_h_length);
- return alloc_inet_addr(addr.s_addr);
+#ifdef HAS_IPV6
+ struct in6_addr addr6;
+ if (entry_h_length == 16) {
+ memmove(&addr6, a, 16);
+ return alloc_inet6_addr(&addr6);
+ }
+#endif
+ memmove (&addr, a, 4);
+ return alloc_inet_addr(&addr);
}
static value alloc_host_entry(struct hostent *entry)
@@ -75,7 +82,7 @@ static value alloc_host_entry(struct hostent *entry)
CAMLprim value unix_gethostbyaddr(value a)
{
- uint32 adr = GET_INET_ADDR(a);
+ struct in_addr adr = GET_INET_ADDR(a);
struct hostent * hp;
#if HAS_GETHOSTBYADDR_R == 7
struct hostent h;
diff --git a/otherlibs/unix/getnameinfo.c b/otherlibs/unix/getnameinfo.c
new file mode 100644
index 000000000..a8029eb96
--- /dev/null
+++ b/otherlibs/unix/getnameinfo.c
@@ -0,0 +1,67 @@
+/***********************************************************************/
+/* */
+/* Objective Caml */
+/* */
+/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
+/* */
+/* Copyright 2004 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$ */
+
+#include <string.h>
+#include <mlvalues.h>
+#include <alloc.h>
+#include <memory.h>
+#include <fail.h>
+#include <signals.h>
+#include "unixsupport.h"
+
+#if defined(HAS_SOCKETS) && defined(HAS_IPV6)
+
+#include "socketaddr.h"
+#ifndef _WIN32
+#include <sys/types.h>
+#include <netdb.h>
+#endif
+
+static int getnameinfo_flag_table[] = {
+ NI_NOFQDN, NI_NUMERICHOST, NI_NAMEREQD, NI_NUMERICSERV, NI_DGRAM
+};
+
+CAMLprim value unix_getnameinfo(value vaddr, value vopts)
+{
+ CAMLparam0();
+ CAMLlocal3(vhost, vserv, vres);
+ union sock_addr_union addr;
+ socklen_param_type addr_len;
+ char host[4096];
+ char serv[1024];
+ int opts, retcode;
+
+ get_sockaddr(vaddr, &addr, &addr_len);
+ opts = convert_flag_list(vopts, getnameinfo_flag_table);
+ enter_blocking_section();
+ retcode =
+ getnameinfo((const struct sockaddr *) &addr.s_gen, addr_len,
+ host, sizeof(host), serv, sizeof(serv), opts);
+ leave_blocking_section();
+ if (retcode != 0) raise_not_found(); /* TODO: detailed error reporting? */
+ vhost = copy_string(host);
+ vserv = copy_string(serv);
+ vres = alloc_small(2, 0);
+ Field(vres, 0) = vhost;
+ Field(vres, 1) = vserv;
+ CAMLreturn(vres);
+}
+
+#else
+
+CAMLprim value unix_getnameinfo(value vaddr, value vopts)
+{ invalid_argument("getnameinfo not implemented"); }
+
+#endif
diff --git a/otherlibs/unix/getpeername.c b/otherlibs/unix/getpeername.c
index c30615564..d4fc3ee36 100644
--- a/otherlibs/unix/getpeername.c
+++ b/otherlibs/unix/getpeername.c
@@ -26,7 +26,7 @@ CAMLprim value unix_getpeername(value sock)
union sock_addr_union addr;
socklen_param_type addr_len;
- addr_len = sizeof(sock_addr);
+ addr_len = sizeof(addr);
retcode = getpeername(Int_val(sock), &addr.s_gen, &addr_len);
if (retcode == -1) uerror("getpeername", Nothing);
return alloc_sockaddr(&addr, addr_len);
diff --git a/otherlibs/unix/socket.c b/otherlibs/unix/socket.c
index a61a1a309..1723faa27 100644
--- a/otherlibs/unix/socket.c
+++ b/otherlibs/unix/socket.c
@@ -22,7 +22,14 @@
#include <sys/socket.h>
int socket_domain_table[] = {
- PF_UNIX, PF_INET
+ PF_UNIX, PF_INET,
+#if defined(HAS_IPV6)
+ PF_INET6
+#elif defined(PF_UNDEF)
+ PF_UNDEF
+#else
+ 0
+#endif
};
int socket_type_table[] = {
diff --git a/otherlibs/unix/socketaddr.c b/otherlibs/unix/socketaddr.c
index 4be5f1291..932bb9643 100644
--- a/otherlibs/unix/socketaddr.c
+++ b/otherlibs/unix/socketaddr.c
@@ -28,17 +28,29 @@
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
-value alloc_inet_addr(uint32 a)
+CAMLprim value alloc_inet_addr(struct in_addr * a)
{
value res;
/* Use a string rather than an abstract block so that it can be
marshaled safely. Remember that a is in network byte order,
- hence can be marshaled safely. */
- res = alloc_string(sizeof(uint32));
- GET_INET_ADDR(res) = a;
+ hence is marshaled in an endian-independent manner. */
+ res = alloc_string(4);
+ memcpy(String_val(res), a, 4);
return res;
}
+#ifdef HAS_IPV6
+
+CAMLprim value alloc_inet6_addr(struct in6_addr * a)
+{
+ value res;
+ res = alloc_string(16);
+ memcpy(String_val(res), a, 16);
+ return res;
+}
+
+#endif
+
void get_sockaddr(value mladr,
union sock_addr_union * adr /*out*/,
socklen_param_type * adr_len /*out*/)
@@ -62,18 +74,22 @@ void get_sockaddr(value mladr,
}
#endif
case 1: /* ADDR_INET */
- {
- char * p;
- int n;
- for (p = (char *) &adr->s_inet, n = sizeof(adr->s_inet);
- n > 0; p++, n--)
- *p = 0;
- adr->s_inet.sin_family = AF_INET;
- adr->s_inet.sin_addr.s_addr = GET_INET_ADDR(Field(mladr, 0));
- adr->s_inet.sin_port = htons(Int_val(Field(mladr, 1)));
- *adr_len = sizeof(struct sockaddr_in);
+#ifdef HAS_IPV6
+ if (string_length(Field(mladr, 0)) == 16) {
+ memset(&adr->s_inet6, 0, sizeof(struct sockaddr_in6));
+ adr->s_inet6.sin6_family = AF_INET6;
+ adr->s_inet6.sin6_addr = GET_INET6_ADDR(Field(mladr, 0));
+ adr->s_inet6.sin6_port = htons(Int_val(Field(mladr, 1)));
+ *adr_len = sizeof(struct sockaddr_in6);
break;
}
+#endif
+ memset(&adr->s_inet, 0, sizeof(struct sockaddr_in));
+ adr->s_inet.sin_family = AF_INET;
+ adr->s_inet.sin_addr = GET_INET_ADDR(Field(mladr, 0));
+ adr->s_inet.sin_port = htons(Int_val(Field(mladr, 1)));
+ *adr_len = sizeof(struct sockaddr_in);
+ break;
}
}
@@ -93,7 +109,7 @@ value alloc_sockaddr(union sock_addr_union * adr /*in*/,
}
#endif
case AF_INET:
- { value a = alloc_inet_addr(adr->s_inet.sin_addr.s_addr);
+ { value a = alloc_inet_addr(&adr->s_inet.sin_addr);
Begin_root (a);
res = alloc_small(2, 1);
Field(res,0) = a;
@@ -101,6 +117,17 @@ value alloc_sockaddr(union sock_addr_union * adr /*in*/,
End_roots();
break;
}
+#ifdef HAS_IPV6
+ case AF_INET6:
+ { value a = alloc_inet6_addr(&adr->s_inet6.sin6_addr);
+ Begin_root (a);
+ res = alloc_small(2, 1);
+ Field(res,0) = a;
+ Field(res,1) = Val_int(ntohs(adr->s_inet6.sin6_port));
+ End_roots();
+ break;
+ }
+#endif
default:
unix_error(EAFNOSUPPORT, "", Nothing);
}
diff --git a/otherlibs/unix/socketaddr.h b/otherlibs/unix/socketaddr.h
index 9788a1009..0cabfcc6d 100644
--- a/otherlibs/unix/socketaddr.h
+++ b/otherlibs/unix/socketaddr.h
@@ -24,21 +24,26 @@ union sock_addr_union {
struct sockaddr s_gen;
struct sockaddr_un s_unix;
struct sockaddr_in s_inet;
+#ifdef HAS_IPV6
+ struct sockaddr_in6 s_inet6;
+#endif
};
-extern union sock_addr_union sock_addr;
-
#ifdef HAS_SOCKLEN_T
typedef socklen_t socklen_param_type;
#else
typedef int socklen_param_type;
#endif
-void get_sockaddr (value mladdr,
- union sock_addr_union * addr /*out*/,
- socklen_param_type * addr_len /*out*/);
+extern void get_sockaddr (value mladdr,
+ union sock_addr_union * addr /*out*/,
+ socklen_param_type * addr_len /*out*/);
CAMLprim value alloc_sockaddr (union sock_addr_union * addr /*in*/,
socklen_param_type addr_len);
-CAMLprim value alloc_inet_addr (uint32 inaddr);
+CAMLprim value alloc_inet_addr (struct in_addr * inaddr);
+#define GET_INET_ADDR(v) (*((struct in_addr *) (v)))
-#define GET_INET_ADDR(v) (*((uint32 *) (v)))
+#ifdef HAS_IPV6
+CAMLprim value alloc_inet6_addr (struct in6_addr * inaddr);
+#define GET_INET6_ADDR(v) (*((struct in6_addr *) (v)))
+#endif
diff --git a/otherlibs/unix/strofaddr.c b/otherlibs/unix/strofaddr.c
index f5a594d52..90ffd9749 100644
--- a/otherlibs/unix/strofaddr.c
+++ b/otherlibs/unix/strofaddr.c
@@ -23,9 +23,22 @@
CAMLprim value unix_string_of_inet_addr(value a)
{
- struct in_addr address;
- address.s_addr = GET_INET_ADDR(a);
- return copy_string(inet_ntoa(address));
+ char * res;
+#ifdef HAS_IPV6
+ char buffer[64];
+ if (string_length(a) == 16)
+ res = (char *)
+ inet_ntop(AF_INET6, (const void *) &GET_INET6_ADDR(a),
+ buffer, sizeof(buffer));
+ else
+ res = (char *)
+ inet_ntop(AF_INET, (const void *) &GET_INET_ADDR(a),
+ buffer, sizeof(buffer));
+#else
+ res = inet_ntoa(GET_INET_ADDR(a));
+#endif
+ if (res == NULL) uerror("string_of_inet_addr", Nothing);
+ return copy_string(res);
}
#else
diff --git a/otherlibs/unix/unix.ml b/otherlibs/unix/unix.ml
index d68a1216f..c01aef9ac 100644
--- a/otherlibs/unix/unix.ml
+++ b/otherlibs/unix/unix.ml
@@ -374,7 +374,9 @@ external getgrnam : string -> group_entry = "unix_getgrnam"
external getpwuid : int -> passwd_entry = "unix_getpwuid"
external getgrgid : int -> group_entry = "unix_getgrgid"
-type inet_addr
+type inet_addr = string
+
+let is_inet6_addr s = String.length s = 16
external inet_addr_of_string : string -> inet_addr
= "unix_inet_addr_of_string"
@@ -382,10 +384,16 @@ 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"
+let inet_addr_loopback = inet_addr_of_string "127.0.0.1"
+let inet6_addr_any =
+ try inet_addr_of_string "::" with Failure _ -> inet_addr_any
+let inet6_addr_loopback =
+ try inet_addr_of_string "::1" with Failure _ -> inet_addr_loopback
type socket_domain =
PF_UNIX
| PF_INET
+ | PF_INET6
type socket_type =
SOCK_STREAM
@@ -397,6 +405,10 @@ type sockaddr =
ADDR_UNIX of string
| ADDR_INET of inet_addr * int
+let domain_of_sockaddr = function
+ ADDR_UNIX _ -> PF_UNIX
+ | ADDR_INET(a, _) -> if is_inet6_addr a then PF_INET6 else PF_INET
+
type shutdown_command =
SHUTDOWN_RECEIVE
| SHUTDOWN_SEND
@@ -518,6 +530,136 @@ external getservbyname : string -> string -> service_entry
= "unix_getservbyname"
external getservbyport : int -> string -> service_entry
= "unix_getservbyport"
+
+type addr_info =
+ { ai_family : socket_domain;
+ ai_socktype : socket_type;
+ ai_protocol : int;
+ ai_addr : sockaddr;
+ ai_canonname : string }
+
+type getaddrinfo_option =
+ AI_FAMILY of socket_domain
+ | AI_SOCKTYPE of socket_type
+ | AI_PROTOCOL of int
+ | AI_NUMERICHOST
+ | AI_CANONNAME
+ | AI_PASSIVE
+
+external getaddrinfo_system
+ : string -> string -> getaddrinfo_option list -> addr_info list
+ = "unix_getaddrinfo"
+
+let getaddrinfo_emulation node service opts =
+ (* Parse options *)
+ let opt_socktype = ref None
+ and opt_protocol = ref 0
+ and opt_passive = ref false in
+ List.iter
+ (function AI_SOCKTYPE s -> opt_socktype := Some s
+ | AI_PROTOCOL p -> opt_protocol := p
+ | AI_PASSIVE -> opt_passive := true
+ | _ -> ())
+ opts;
+ (* Determine socket types and port numbers *)
+ let get_port ty kind =
+ if service = "" then [ty, 0] else
+ try
+ [ty, int_of_string service]
+ with Failure _ ->
+ try
+ [ty, (getservbyname service kind).s_port]
+ with Not_found -> []
+ in
+ let ports =
+ match !opt_socktype with
+ | None ->
+ get_port SOCK_STREAM "tcp" @ get_port SOCK_DGRAM "udp"
+ | Some SOCK_STREAM ->
+ get_port SOCK_STREAM "tcp"
+ | Some SOCK_DGRAM ->
+ get_port SOCK_DGRAM "udp"
+ | Some ty ->
+ if service = "" then [ty, 0] else [] in
+ (* Determine IP addresses *)
+ let addresses =
+ if node = "" then
+ if List.mem AI_PASSIVE opts
+ then [inet_addr_any, "0.0.0.0"]
+ else [inet_addr_loopback, "127.0.0.1"]
+ else
+ try
+ [inet_addr_of_string node, node]
+ with Failure _ ->
+ try
+ let he = gethostbyname node in
+ List.map
+ (fun a -> (a, he.h_name))
+ (Array.to_list he.h_addr_list)
+ with Not_found ->
+ [] in
+ (* Cross-product of addresses and ports *)
+ List.flatten
+ (List.map
+ (fun (ty, port) ->
+ List.map
+ (fun (addr, name) ->
+ { ai_family = PF_INET;
+ ai_socktype = ty;
+ ai_protocol = !opt_protocol;
+ ai_addr = ADDR_INET(addr, port);
+ ai_canonname = name })
+ addresses)
+ ports)
+
+let getaddrinfo node service opts =
+ try
+ List.rev(getaddrinfo_system node service opts)
+ with Invalid_argument _ ->
+ getaddrinfo_emulation node service opts
+
+type name_info =
+ { ni_hostname : string;
+ ni_service : string }
+
+type getnameinfo_option =
+ NI_NOFQDN
+ | NI_NUMERICHOST
+ | NI_NAMEREQD
+ | NI_NUMERICSERV
+ | NI_DGRAM
+
+external getnameinfo_system
+ : sockaddr -> getnameinfo_option list -> name_info
+ = "unix_getnameinfo"
+
+let getnameinfo_emulation addr opts =
+ match addr with
+ | ADDR_UNIX f ->
+ { ni_hostname = ""; ni_service = f } (* why not? *)
+ | ADDR_INET(a, p) ->
+ let hostname =
+ try
+ if List.mem NI_NUMERICHOST opts then raise Not_found;
+ (gethostbyaddr a).h_name
+ with Not_found ->
+ if List.mem NI_NAMEREQD opts then raise Not_found;
+ string_of_inet_addr a in
+ let service =
+ try
+ if List.mem NI_NUMERICSERV opts then raise Not_found;
+ let kind = if List.mem NI_DGRAM opts then "udp" else "tcp" in
+ (getservbyport p kind).s_name
+ with Not_found ->
+ string_of_int p in
+ { ni_hostname = hostname; ni_service = service }
+
+let getnameinfo addr opts =
+ try
+ getnameinfo_system addr opts
+ with Invalid_argument _ ->
+ getnameinfo_emulation addr opts
+
type terminal_io = {
mutable c_ignbrk: bool;
mutable c_brkint: bool;
@@ -737,10 +879,8 @@ let close_process_full (inchan, outchan, errchan) =
(* 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
+ socket (domain_of_sockaddr sockaddr) SOCK_STREAM 0 in
try
connect sock sockaddr;
(in_channel_of_descr sock, out_channel_of_descr sock)
@@ -751,10 +891,8 @@ let shutdown_connection inchan =
shutdown (descr_of_in_channel inchan) SHUTDOWN_SEND
let establish_server server_fun sockaddr =
- let domain =
- match sockaddr with ADDR_UNIX _ -> PF_UNIX | ADDR_INET(_,_) -> PF_INET in
let sock =
- socket domain SOCK_STREAM 0 in
+ socket (domain_of_sockaddr sockaddr) SOCK_STREAM 0 in
setsockopt sock SO_REUSEADDR true;
bind sock sockaddr;
listen sock 5;
diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli
index b1d1cd4b6..d44036738 100644
--- a/otherlibs/unix/unix.mli
+++ b/otherlibs/unix/unix.mli
@@ -841,24 +841,40 @@ type inet_addr
(** The abstract type of Internet addresses. *)
val inet_addr_of_string : string -> inet_addr
-(** Conversions between string with the format [XXX.YYY.ZZZ.TTT]
- and Internet addresses. [inet_addr_of_string] raises [Failure]
- when given a string that does not match this format. *)
+(** Conversion from the printable representation of an Internet
+ address to its internal representation. The argument string
+ consists of 4 numbers separated by periods ([XXX.YYY.ZZZ.TTT])
+ for IPv4 addresses, and up to 8 numbers separated by colons
+ for IPv6 addresses. Raise [Failure] when given a string that
+ does not match these formats. *)
val string_of_inet_addr : inet_addr -> string
-(** See {!Unix.inet_addr_of_string}. *)
+(** Return the printable representation of the given Internet address.
+ See {!Unix.inet_addr_of_string} for a description of the
+ printable representation. *)
val inet_addr_any : inet_addr
-(** A special Internet address, for use only with [bind], representing
+(** A special IPv4 address, for use only with [bind], representing
all the Internet addresses that the host machine possesses. *)
+val inet_addr_loopback : inet_addr
+(** A special IPv4 address representing the host machine ([127.0.0.1]). *)
+
+val inet6_addr_any : inet_addr
+(** A special IPv6 address, for use only with [bind], representing
+ all the Internet addresses that the host machine possesses. *)
+
+val inet6_addr_loopback : inet_addr
+(** A special IPv6 address representing the host machine ([::1]). *)
+
(** {6 Sockets} *)
type socket_domain =
PF_UNIX (** Unix domain *)
- | PF_INET (** Internet domain *)
+ | PF_INET (** Internet domain (IPv4) *)
+ | PF_INET6 (** Internet domain (IPv6) *)
(** The type of socket domains. *)
type socket_type =
@@ -881,6 +897,9 @@ val socket : socket_domain -> socket_type -> int -> file_descr
given kind. The third argument is the protocol type; 0 selects
the default protocol for that kind of sockets. *)
+val domain_of_sockaddr: sockaddr -> socket_domain
+(** Return the socket domain adequate for the given socket address. *)
+
val socketpair :
socket_domain -> socket_type -> int -> file_descr * file_descr
(** Create a pair of unnamed sockets, connected together. *)
@@ -1023,8 +1042,8 @@ external setsockopt_float :
val open_connection : sockaddr -> in_channel * out_channel
(** Connect to a server at the given address.
Return a pair of buffered channels connected to the server.
- Remember to call {!Pervasives.flush} on the output channel at the right times
- to ensure correct synchronization. *)
+ Remember to call {!Pervasives.flush} on the output channel at the right
+ times to ensure correct synchronization. *)
val shutdown_connection : in_channel -> unit
(** ``Shut down'' a connection established with {!Unix.open_connection};
@@ -1092,6 +1111,65 @@ val getservbyport : int -> string -> service_entry
(** Find an entry in [services] with the given service number,
or raise [Not_found]. *)
+type addr_info =
+ { ai_family : socket_domain; (** Socket domain *)
+ ai_socktype : socket_type; (** Socket type *)
+ ai_protocol : int; (** Socket protocol number *)
+ ai_addr : sockaddr; (** Address *)
+ ai_canonname : string (** Canonical host name *)
+ }
+(** Address information returned by {!Unix.getaddrinfo}. *)
+
+type getaddrinfo_option =
+ AI_FAMILY of socket_domain (** Impose the given socket domain *)
+ | AI_SOCKTYPE of socket_type (** Impose the given socket type *)
+ | AI_PROTOCOL of int (** Impose the given protocol *)
+ | AI_NUMERICHOST (** Do not call name resolver,
+ expect numeric IP address *)
+ | AI_CANONNAME (** Fill the [ai_canonname] field
+ of the result *)
+ | AI_PASSIVE (** Set address to ``any'' address
+ for use with {!Unix.bind} *)
+(** Options to {!Unix.getaddrinfo}. *)
+
+val getaddrinfo:
+ string -> string -> getaddrinfo_option list -> addr_info list
+(** [getaddrinfo host service opts] returns a list of {!Unix.addr_info}
+ records describing socket parameters and addresses suitable for
+ communicating with the given host and service. The empty list is
+ returned if the host or service names are unknown, or the constraints
+ expressed in [opts] cannot be satisfied.
+
+ [host] is either a host name or the string representation of an IP
+ address. [host] can be given as the empty string; in this case,
+ the ``any'' address or the ``loopback'' address are used,
+ depending whether [opts] contains [AI_PASSIVE].
+ [service] is either a service name or the string representation of
+ a port number. [service] can be given as the empty string;
+ in this case, the port field of the returned addresses is set to 0.
+ [opts] is a possibly empty list of options that allows the caller
+ to force a particular socket domain (e.g. IPv6 only or IPv4 only)
+ or a particular socket type (e.g. TCP only or UDP only). *)
+
+type name_info =
+ { ni_hostname : string; (** Name or IP address of host *)
+ ni_service : string } (** Name of service or port number *)
+(** Host and service information returned by {!Unix.getnameinfo}. *)
+
+type getnameinfo_option =
+ NI_NOFQDN (** Do not qualify local host names *)
+ | NI_NUMERICHOST (** Always return host as IP address *)
+ | NI_NAMEREQD (** Fail if host name cannot be determined *)
+ | NI_NUMERICSERV (** Always return service as port number *)
+ | NI_DGRAM (** Consider the service as UDP-based
+ instead of the default TCP *)
+(** Options to {!Unix.getnameinfo}. *)
+
+val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
+(** [getnameinfo addr opts] returns the host name and service name
+ corresponding to the socket address [addr]. [opts] is a possibly
+ empty list of options that governs how these names are obtained.
+ Raise [Not_found] if an error occurs. *)
(** {6 Terminal interface} *)
diff --git a/otherlibs/unix/unixLabels.mli b/otherlibs/unix/unixLabels.mli
index 9cf0fe7e9..3ab7e6289 100644
--- a/otherlibs/unix/unixLabels.mli
+++ b/otherlibs/unix/unixLabels.mli
@@ -856,17 +856,32 @@ type inet_addr = Unix.inet_addr
(** The abstract type of Internet addresses. *)
val inet_addr_of_string : string -> inet_addr
-(** Conversions between string with the format [XXX.YYY.ZZZ.TTT]
- and Internet addresses. [inet_addr_of_string] raises [Failure]
- when given a string that does not match this format. *)
+(** Conversion from the printable representation of an Internet
+ address to its internal representation. The argument string
+ consists of 4 numbers separated by periods ([XXX.YYY.ZZZ.TTT])
+ for IPv4 addresses, and up to 8 numbers separated by colons
+ for IPv6 addresses. Raise [Failure] when given a string that
+ does not match these formats. *)
val string_of_inet_addr : inet_addr -> string
-(** See {!UnixLabels.inet_addr_of_string}. *)
+(** Return the printable representation of the given Internet address.
+ See {!Unix.inet_addr_of_string} for a description of the
+ printable representation. *)
val inet_addr_any : inet_addr
-(** A special Internet address, for use only with [bind], representing
+(** A special IPv4 address, for use only with [bind], representing
all the Internet addresses that the host machine possesses. *)
+val inet_addr_loopback : inet_addr
+(** A special IPv4 address representing the host machine ([127.0.0.1]). *)
+
+val inet6_addr_any : inet_addr
+(** A special IPv6 address, for use only with [bind], representing
+ all the Internet addresses that the host machine possesses. *)
+
+val inet6_addr_loopback : inet_addr
+(** A special IPv6 address representing the host machine ([::1]). *)
+
(** {6 Sockets} *)
@@ -875,6 +890,7 @@ type socket_domain =
Unix.socket_domain =
PF_UNIX (** Unix domain *)
| PF_INET (** Internet domain *)
+ | PF_INET6 (** Internet domain (IPv6) *)
(** The type of socket domains. *)
type socket_type =
@@ -896,6 +912,9 @@ type sockaddr =
domain; [addr] is the Internet address of the machine, and
[port] is the port number. *)
+val domain_of_sockaddr: sockaddr -> socket_domain
+(** Return the socket domain adequate for the given socket address. *)
+
val socket :
domain:socket_domain -> kind:socket_type -> protocol:int -> file_descr
(** Create a new socket in the given domain, and with the
@@ -1125,7 +1144,65 @@ val getservbyport : int -> protocol:string -> service_entry
(** Find an entry in [services] with the given service number,
or raise [Not_found]. *)
-
+type addr_info =
+ { ai_family : socket_domain; (** Socket domain *)
+ ai_socktype : socket_type; (** Socket type *)
+ ai_protocol : int; (** Socket protocol number *)
+ ai_addr : sockaddr; (** Address *)
+ ai_canonname : string (** Canonical host name *)
+ }
+(** Address information returned by {!Unix.getaddrinfo}. *)
+
+type getaddrinfo_option =
+ AI_FAMILY of socket_domain (** Impose the given socket domain *)
+ | AI_SOCKTYPE of socket_type (** Impose the given socket type *)
+ | AI_PROTOCOL of int (** Impose the given protocol *)
+ | AI_NUMERICHOST (** Do not call name resolver,
+ expect numeric IP address *)
+ | AI_CANONNAME (** Fill the [ai_canonname] field
+ of the result *)
+ | AI_PASSIVE (** Set address to ``any'' address
+ for use with {!Unix.bind} *)
+(** Options to {!Unix.getaddrinfo}. *)
+
+val getaddrinfo:
+ string -> string -> getaddrinfo_option list -> addr_info list
+(** [getaddrinfo host service opts] returns a list of {!Unix.addr_info}
+ records describing socket parameters and addresses suitable for
+ communicating with the given host and service. The empty list is
+ returned if the host or service names are unknown, or the constraints
+ expressed in [opts] cannot be satisfied.
+
+ [host] is either a host name or the string representation of an IP
+ address. [host] can be given as the empty string; in this case,
+ the ``any'' address or the ``loopback'' address are used,
+ depending whether [opts] contains [AI_PASSIVE].
+ [service] is either a service name or the string representation of
+ a port number. [service] can be given as the empty string;
+ in this case, the port field of the returned addresses is set to 0.
+ [opts] is a possibly empty list of options that allows the caller
+ to force a particular socket domain (e.g. IPv6 only, or IPv4 only)
+ or a particular socket type (e.g. TCP only or UDP only). *)
+
+type name_info =
+ { ni_hostname : string; (** Name or IP address of host *)
+ ni_service : string } (** Name of service or port number *)
+(** Host and service information returned by {!Unix.getnameinfo}. *)
+
+type getnameinfo_option =
+ NI_NOFQDN (** Do not qualify local host names *)
+ | NI_NUMERICHOST (** Always return host as IP address *)
+ | NI_NAMEREQD (** Fail if host name cannot be determined *)
+ | NI_NUMERICSERV (** Always return service as port number *)
+ | NI_DGRAM (** Consider the service as UDP-based
+ instead of the default TCP *)
+(** Options to {!Unix.getnameinfo}. *)
+
+val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
+(** [getnameinfo addr opts] returns the host name and service name
+ corresponding to the socket address [addr]. [opts] is a possibly
+ empty list of options that governs how these names are obtained.
+ Raise [Not_found] if an error occurs. *)
(** {6 Terminal interface} *)