diff options
Diffstat (limited to 'otherlibs/unix')
-rw-r--r-- | otherlibs/unix/.depend | 493 | ||||
-rw-r--r-- | otherlibs/unix/Makefile | 7 | ||||
-rw-r--r-- | otherlibs/unix/addrofstr.c | 21 | ||||
-rw-r--r-- | otherlibs/unix/cst2constr.h | 6 | ||||
-rw-r--r-- | otherlibs/unix/getaddrinfo.c | 133 | ||||
-rw-r--r-- | otherlibs/unix/gethost.c | 13 | ||||
-rw-r--r-- | otherlibs/unix/getnameinfo.c | 67 | ||||
-rw-r--r-- | otherlibs/unix/getpeername.c | 2 | ||||
-rw-r--r-- | otherlibs/unix/socket.c | 9 | ||||
-rw-r--r-- | otherlibs/unix/socketaddr.c | 57 | ||||
-rw-r--r-- | otherlibs/unix/socketaddr.h | 19 | ||||
-rw-r--r-- | otherlibs/unix/strofaddr.c | 19 | ||||
-rw-r--r-- | otherlibs/unix/unix.ml | 152 | ||||
-rw-r--r-- | otherlibs/unix/unix.mli | 94 | ||||
-rw-r--r-- | otherlibs/unix/unixLabels.mli | 89 |
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} *) |