Documentation updates
[runtime.git] / lib / silcutil / silcnet.h
index 717e918c28ecc4d776569b3558fad5080ab27a0d..d791784e4feb9b25548e717dfd7774caa5e53dd4 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2007 Pekka Riikonen
+  Copyright (C) 1997 - 2008 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 
 */
 
-/****h* silcutil/SILC Net Interface
+/****h* silcutil/Network Interface
  *
  * DESCRIPTION
  *
- * SILC Net API provides various network routines for applications. It
- * can be used to create TCP/IP and UDP/IP connections and listeners.
- * Various utility functions for resolving various information is also
- * provided.
+ * SILC Net API provides various network routines for applications. It can
+ * be used to create TCP/IP and UDP/IP connections and listeners.  Various
+ * utility functions for resolving various information is also provided.
+ * The interface supports both IPv4 and IPv6.
  *
- * On WIN32 systems the SILC Net API must initialized by calling the
- * silc_net_win32_init and uninitialized when the application ends by
- * calling the silc_net_win32_uninit function. The initializing must be
- * done in order to assure that the SILC Net API works correctly.
+ * EXAMPLE
+ *
+ * // Create TCP connection to example.com at port 25
+ * silc_net_tcp_connect(NULL, "example.com", 25, schedule, connected_cb, ctx);
+ *
+ * // Create UDP listener on local interface 10.2.1.7 on port 500
+ * SilcStream udpstream;
+ *
+ * udpstream = silc_net_udp_connect("10.2.1.7", 500, NULL, 0, schedule);
+ * silc_stream_set_notifier(udpstream, schedule, receive_callback, ctx);
  *
  ***/
 
@@ -38,7 +44,7 @@
 
 /* Prototypes */
 
-/****s* silcutil/SilcNetAPI/SilcNetListener
+/****s* silcutil/SilcNetListener
  *
  * NAME
  *
  * DESCRIPTION
  *
  *    The network listenr context.  This context is created with the
- *    silc_net_create_listener function and destroyed with
+ *    silc_net_tcp_create_listener function and destroyed with
  *    silc_net_close_listener function.
  *
  ***/
 typedef struct SilcNetListenerStruct *SilcNetListener;
 
-/****d* silcutil/SilcNetAPI/SilcNetStatus
- *
- * NAME
- *
- *    typedef enum { ... } SilcNetStatus;
- *
- * DESCRIPTION
- *
- *    Status to indicate the result of the network operation creation.  This
- *    type is returned in the SilcNetCallback callback function.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_NET_OK,                        /* Everything Ok */
-  SILC_NET_UNKNOWN_IP,                /* Unknown IP address */
-  SILC_NET_UNKNOWN_HOST,              /* Unknown hostname */
-  SILC_NET_HOST_UNREACHABLE,          /* Destination unreachable */
-  SILC_NET_CONNECTION_REFUSED,        /* Connection refused */
-  SILC_NET_CONNECTION_TIMEOUT,        /* Connection timedout */
-  SILC_NET_NO_MEMORY,                 /* System out of memory */
-  SILC_NET_ERROR,                     /* Unknown error */
-} SilcNetStatus;
-/***/
-
-/****f* silcutil/SilcNetAPI/SilcNetCallback
+/****f* silcutil/SilcNetCallback
  *
  * SYNOPSIS
  *
- *    typedef void (*SilcNetCallback)(SilcNetStatus status,
+ *    typedef void (*SilcNetCallback)(SilcResult status,
  *                                    SilcStream stream, void *context);
  *
  * DESCRIPTION
@@ -100,10 +81,10 @@ typedef enum {
  *    the `stream'.
  *
  ***/
-typedef void (*SilcNetCallback)(SilcNetStatus status,
+typedef void (*SilcNetCallback)(SilcResult status,
                                SilcStream stream, void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_tcp_create_listener
+/****f* silcutil/silc_net_tcp_create_listener
  *
  * SYNOPSIS
  *
@@ -128,7 +109,8 @@ typedef void (*SilcNetCallback)(SilcNetStatus status,
  *    is zero (0), operating system will define it automatically.
  *
  *    The `callback' always delivers valid new stream.  It is not called
- *    with an error status.
+ *    with an error status.  If `schedule' is NULL this will call
+ *    silc_schedule_get_global to try to get global scheduler.
  *
  ***/
 SilcNetListener
@@ -138,11 +120,52 @@ silc_net_tcp_create_listener(const char **local_ip_addr,
                             SilcSchedule schedule,
                             SilcNetCallback callback, void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_listener_get_port
+/****f* silcutil/silc_net_tcp_create_listener2
+ *
+ * SYNOPSIS
+ *
+ *    SilcNetListener
+ *    silc_net_tcp_create_listener2(const char *local_ip_addr, int *ports,
+ *                                  SilcUInt32 port_count,
+ *                                  SilcBool ignore_port_error,
+ *                                  SilcBool lookup, SilcBool require_fqdn,
+ *                                  SilcSchedule schedule,
+ *                                  SilcNetCallback callback, void *context);
+ *
+ * DESCRIPTION
+ *
+ *    This function creates TCP listener.  This is used to create network
+ *    listener for incoming connections, and `callback' will be called
+ *    everytime new connection is received.  If `local_ip_addr' is NULL 'any'
+ *    address is used.  If `ports' is NULL or it contains a zero (0) port,
+ *    operating system will define it automatically.  This function can be
+ *    used to bind to many ports at the same time.  If `ignore_port_error'
+ *    is TRUE this won't return NULL if at least one of the ports could
+ *    be bound.  Otherwise, NULL will be returned on error.
+ *
+ *    If `require_fqdn' is TRUE the listener will require that the incoming
+ *    connection has FQDN to be able to connect.  If the `lookup' is TRUE
+ *    then the incoming connection hostname will be resolved.
+ *
+ *    The `callback' always delivers valid new stream.  It is not called
+ *    with an error status.  If `schedule' is NULL this will call
+ *    silc_schedule_get_global to try to get global scheduler.
+ *
+ ***/
+SilcNetListener
+silc_net_tcp_create_listener2(const char *local_ip_addr, int *ports,
+                             SilcUInt32 port_count,
+                             SilcBool ignore_port_error,
+                             SilcBool lookup, SilcBool require_fqdn,
+                             SilcSchedule schedule,
+                             SilcNetCallback callback, void *context);
+
+/****f* silcutil/silc_net_listener_get_port
  *
  * SYNOPSIS
  *
- *    SilcUInt16 silc_net_listener_get_port(SilcNetListener listener);
+ *    SilcUInt16 *silc_net_listener_get_port(SilcNetListener listener,
+ *                                           SilcUInt32 *port_count);
  *
  * DESCRIPTION
  *
@@ -150,13 +173,14 @@ silc_net_tcp_create_listener(const char **local_ip_addr,
  *    to get the port if none was specified in silc_net_tcp_create_listener.
  *    Returns an array of ports of size of `port_count'.  The caller must
  *    free the array with silc_free.  There are as many ports in the array
- *    as there were IP addresses provided in silc_net_tcp_create_listener.
+ *    as there were IP addresses provided in silc_net_tcp_create_listener,
+ *    or as there were ports provided in silc_net_tcp_create_listener2.
  *
  ***/
 SilcUInt16 *silc_net_listener_get_port(SilcNetListener listener,
                                       SilcUInt32 *port_count);
 
-/****f* silcutil/SilcNetAPI/silc_net_listener_get_ip
+/****f* silcutil/silc_net_listener_get_ip
  *
  * SYNOPSIS
  *
@@ -166,14 +190,14 @@ SilcUInt16 *silc_net_listener_get_port(SilcNetListener listener,
  * DESCRIPTION
  *
  *    Returns the IP's to where the `listener' is bound.  Returns an array
- *    of IP addresses of size of `port_count'.  The caller must free the
+ *    of IP addresses of size of `ip_count'.  The caller must free the
  *    array and its strings with silc_free.
  *
  ***/
 char **silc_net_listener_get_ip(SilcNetListener listener,
                                SilcUInt32 *ip_count);
 
-/****f* silcutil/SilcNetAPI/silc_net_listener_get_hostname
+/****f* silcutil/silc_net_listener_get_hostname
  *
  * SYNOPSIS
  *
@@ -183,14 +207,14 @@ char **silc_net_listener_get_ip(SilcNetListener listener,
  * DESCRIPTION
  *
  *    Returns the hostnames to where the `listener' is bound.  Returns an
- *    array of hostnames of size of `port_count'.  The caller must free the
- *    array and its strings with silc_free.
+ *    array of hostnames of size of `hostname_count'.  The caller must free
+ *    the array and its strings with silc_free.
  *
  ***/
 char **silc_net_listener_get_hostname(SilcNetListener listener,
                                      SilcUInt32 *hostname_count);
 
-/****f* silcutil/SilcNetAPI/silc_net_close_listener
+/****f* silcutil/silc_net_close_listener
  *
  * SYNOPSIS
  *
@@ -203,7 +227,7 @@ char **silc_net_listener_get_hostname(SilcNetListener listener,
  ***/
 void silc_net_close_listener(SilcNetListener listener);
 
-/****f* silcutil/SilcNetAPI/silc_net_tcp_connect
+/****f* silcutil/silc_net_tcp_connect
  *
  * SYNOPSIS
  *
@@ -228,7 +252,8 @@ void silc_net_close_listener(SilcNetListener listener);
  *    The returned SilcAsyncOperation context can be used to control the
  *    asynchronous connecting, such as to abort it.  If it is aborted
  *    using silc_async_abort the `callback' will not be called.  If NULL
- *    is returned the operation cannot be aborted.
+ *    is returned the operation cannot be aborted.  If `schedule' is NULL
+ *    this will call silc_schedule_get_global to try to get global scheduler.
  *
  ***/
 SilcAsyncOperation silc_net_tcp_connect(const char *local_ip_addr,
@@ -238,7 +263,7 @@ SilcAsyncOperation silc_net_tcp_connect(const char *local_ip_addr,
                                        SilcNetCallback callback,
                                        void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_udp_connect
+/****f* silcutil/silc_net_udp_connect
  *
  * SYNOPSIS
  *
@@ -263,11 +288,12 @@ SilcAsyncOperation silc_net_tcp_connect(const char *local_ip_addr,
  *
  *    To receive packets the silc_stream_set_notifier must be called for the
  *    returned SilcStream.  The packets are always received in the notifier
- *    callback when the SILC_STREAM_CAN_READ is returned to the callback
- *    To read the packet use silc_stream_read if the remote address was
+ *    callback when the SILC_STREAM_CAN_READ is returned to the callback.
+ *    To read the packet use silc_stream_read if the `remote_ip_addr' was
  *    provided, and silc_net_udp_receive if it was not.
  *
- *    Supports IPv6 if the platform supports it.
+ *    Supports IPv6 if the platform supports it.  If `schedule' is NULL this
+ *    will call silc_schedule_get_global to try to get global scheduler.
  *
  * EXAMPLE
  *
@@ -291,7 +317,7 @@ SilcStream silc_net_udp_connect(const char *local_ip_addr, int local_port,
                                const char *remote_ip_addr, int remote_port,
                                SilcSchedule schedule);
 
-/****f* silcutil/SilcNetAPI/silc_net_udp_receive
+/****f* silcutil/silc_net_udp_receive
  *
  * SYNOPSIS
  *
@@ -307,13 +333,16 @@ SilcStream silc_net_udp_connect(const char *local_ip_addr, int local_port,
  *    pointer.  The packet data is returned into the `ret_data' buffer.
  *
  *    Returns the length of the packet, or -1 on error or 0 in case of EOF.
+ *    In case of error the silc_errno will indicate the error.  If the
+ *    error is SILC_ERR_WOULD_BLOCK data is not currently available from the
+ *    `stream'.
  *
  ***/
 int silc_net_udp_receive(SilcStream stream, char *remote_ip_addr,
                         SilcUInt32 remote_ip_addr_size, int *remote_port,
                         unsigned char *ret_data, SilcUInt32 data_size);
 
-/****f* silcutil/SilcNetAPI/silc_net_udp_send
+/****f* silcutil/silc_net_udp_send
  *
  * SYNOPSIS
  *
@@ -325,9 +354,11 @@ int silc_net_udp_receive(SilcStream stream, char *remote_ip_addr,
  *
  *    Sends an UDP packet to remote host `remote_ip_addr' on `remote_port'.
  *    This may be used with UDP streams that are not connected to any
- *    specific remote host.  With those stream silc_stream_write cannot be
- *    used.  In those cases, this function must be used.  This may also be
- *    used even if the stream is connected.
+ *    specific remote host.  With those streams silc_stream_write cannot be
+ *    used.  In those cases, this function must be used.  However, this may
+ *    also be used even if the stream is in connected state.
+ *
+ *    You can create the `stream' by calling silc_net_udp_connect.
  *
  *    Returns the amount of data written, -1 if data could not be written
  *    at this moment, or -2 if error occurred.  If -1 is returned the
@@ -339,20 +370,7 @@ int silc_net_udp_send(SilcStream stream,
                      const char *remote_ip_addr, int remote_port,
                      const unsigned char *data, SilcUInt32 data_len);
 
-/****f* silcutil/SilcNetAPI/silc_net_get_error_string
- *
- * SYNOPSIS
- *
- *    const char silc_net_get_error_string(SilcNetStatus error);
- *
- * DESCRIPTION
- *
- *    Return `error' as a string.
- *
- ***/
-const char *silc_net_get_error_string(SilcNetStatus error);
-
-/****f* silcutil/SilcNetAPI/silc_net_close_connection
+/****f* silcutil/silc_net_close_connection
  *
  * SYNOPSIS
  *
@@ -366,7 +384,7 @@ const char *silc_net_get_error_string(SilcNetStatus error);
  ***/
 void silc_net_close_connection(int sock);
 
-/****f* silcutil/SilcNetAPI/silc_net_accept_connection
+/****f* silcutil/silc_net_accept_connection
  *
  * SYNOPSIS
  *
@@ -381,7 +399,7 @@ void silc_net_close_connection(int sock);
  ***/
 int silc_net_accept_connection(int sock);
 
-/****f* silcutil/SilcNetAPI/silc_net_set_socket_opt
+/****f* silcutil/silc_net_set_socket_opt
  *
  * SYNOPSIS
  *
@@ -397,7 +415,7 @@ int silc_net_accept_connection(int sock);
  ***/
 int silc_net_set_socket_opt(int sock, int level, int option, int on);
 
-/****f* silcutil/SilcNetAPI/silc_net_get_socket_opt
+/****f* silcutil/silc_net_get_socket_opt
  *
  * SYNOPSIS
  *
@@ -414,7 +432,7 @@ int silc_net_set_socket_opt(int sock, int level, int option, int on);
 int silc_net_get_socket_opt(int sock, int level, int option,
                            void *optval, int *opt_len);
 
-/****f* silcutil/SilcNetAPI/silc_net_set_socket_nonblock
+/****f* silcutil/silc_net_set_socket_nonblock
  *
  * SYNOPSIS
  *
@@ -427,7 +445,7 @@ int silc_net_get_socket_opt(int sock, int level, int option,
  ***/
 int silc_net_set_socket_nonblock(SilcSocket sock);
 
-/****f* silcutil/SilcNetAPI/silc_net_is_ip4
+/****f* silcutil/silc_net_is_ip4
  *
  * SYNOPSIS
  *
@@ -440,7 +458,7 @@ int silc_net_set_socket_nonblock(SilcSocket sock);
  ***/
 SilcBool silc_net_is_ip4(const char *addr);
 
-/****f* silcutil/SilcNetAPI/silc_net_is_ip6
+/****f* silcutil/silc_net_is_ip6
  *
  * SYNOPSIS
  *
@@ -453,7 +471,7 @@ SilcBool silc_net_is_ip4(const char *addr);
  ***/
 SilcBool silc_net_is_ip6(const char *addr);
 
-/****f* silcutil/SilcNetAPI/silc_net_is_ip
+/****f* silcutil/silc_net_is_ip
  *
  * SYNOPSIS
  *
@@ -467,7 +485,7 @@ SilcBool silc_net_is_ip6(const char *addr);
  ***/
 SilcBool silc_net_is_ip(const char *addr);
 
-/****f* silcutil/SilcNetAPI/silc_net_addr2bin
+/****f* silcutil/silc_net_addr2bin
  *
  * SYNOPSIS
  *
@@ -483,7 +501,23 @@ SilcBool silc_net_is_ip(const char *addr);
  ***/
 SilcBool silc_net_addr2bin(const char *addr, void *bin, SilcUInt32 bin_len);
 
-/****f* silcutil/SilcNetAPI/SilcNetResolveCallback
+/****f* silcutil/silc_net_bin2addr
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_net_bin2addr(const void *bin, SilcUInt32 bin_len,
+ *                               char *addr, SilcUInt32 addr_size);
+ *
+ * DESCRIPTION
+ *
+ *    Converts network byte ordered IP address into a numbers-and-dots
+ *    string notation.  The `bin' address can be either IPv4 or IPv6 address.
+ *
+ ***/
+SilcBool silc_net_bin2addr(const void *bin, SilcUInt32 bin_len,
+                          char *addr, SilcUInt32 addr_size);
+
+/****f* silcutil/SilcNetResolveCallback
  *
  * SYNOPSIS
  *
@@ -499,12 +533,12 @@ SilcBool silc_net_addr2bin(const char *addr, void *bin, SilcUInt32 bin_len);
  ***/
 typedef void (*SilcNetResolveCallback)(const char *result, void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_gethostbyname
+/****f* silcutil/silc_net_gethostbyname
  *
  * SYNOPSIS
  *
  *    SilcBool silc_net_gethostbyname(const char *name, SilcBool prefer_ipv6,
- *                                char *address, SilcUInt32 address_len);
+ *                                    char *address, SilcUInt32 address_len);
  *
  * DESCRIPTION
  *
@@ -520,7 +554,7 @@ typedef void (*SilcNetResolveCallback)(const char *result, void *context);
 SilcBool silc_net_gethostbyname(const char *name, SilcBool prefer_ipv6,
                                char *address, SilcUInt32 address_len);
 
-/****f* silcutil/SilcNetAPI/silc_net_gethostbyname_async
+/****f* silcutil/silc_net_gethostbyname_async
  *
  * SYNOPSIS
  *
@@ -535,7 +569,8 @@ SilcBool silc_net_gethostbyname(const char *name, SilcBool prefer_ipv6,
  *    Asynchronously resolves the IP address of the hostname indicated
  *    by the `name'.  This function returns immediately, and the
  *    `completion' callback will be called after the resolving is
- *    completed.
+ *    completed.  If `schedule' is NULL this will call silc_schedule_get_global
+ *    to try to get global scheduler.
  *
  *    If the `prefer_ipv6' is TRUE then this will return IPv6 address if it
  *    finds.  If FALSE if returns IPv4 address even if it found IPv6
@@ -548,12 +583,12 @@ void silc_net_gethostbyname_async(const char *name,
                                  SilcNetResolveCallback completion,
                                  void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_gethostbyaddr
+/****f* silcutil/silc_net_gethostbyaddr
  *
  * SYNOPSIS
  *
  *   SilcBool silc_net_gethostbyaddr(const char *addr, char *name,
- *                               SilcUInt32 name_len);
+ *                                   SilcUInt32 name_len);
  *
  * DESCRIPTION
  *
@@ -566,7 +601,7 @@ void silc_net_gethostbyname_async(const char *name,
 SilcBool silc_net_gethostbyaddr(const char *addr, char *name,
                                SilcUInt32 name_len);
 
-/****f* silcutil/SilcNetAPI/silc_net_gethostbyaddr_async
+/****f* silcutil/silc_net_gethostbyaddr_async
  *
  * SYNOPSIS
  *
@@ -580,7 +615,8 @@ SilcBool silc_net_gethostbyaddr(const char *addr, char *name,
  *    Asynchronously resolves the hostname for the IP address indicated
  *    by the `addr'.  This function returns immediately, and the
  *    `completion' callback will be called after the resolving is
- *    completed.
+ *    completed.  If `schedule' is NULL this will call silc_schedule_get_global
+ *    to try to get global scheduler.
  *
  ***/
 void silc_net_gethostbyaddr_async(const char *addr,
@@ -588,7 +624,7 @@ void silc_net_gethostbyaddr_async(const char *addr,
                                  SilcNetResolveCallback completion,
                                  void *context);
 
-/****f* silcutil/SilcNetAPI/silc_net_check_host_by_sock
+/****f* silcutil/silc_net_check_host_by_sock
  *
  * SYNOPSIS
  *
@@ -604,7 +640,7 @@ void silc_net_gethostbyaddr_async(const char *addr,
 SilcBool silc_net_check_host_by_sock(SilcSocket sock, char **hostname,
                                     char **ip);
 
-/****f* silcutil/SilcNetAPI/silc_net_check_local_by_sock
+/****f* silcutil/silc_net_check_local_by_sock
  *
  * SYNOPSIS
  *
@@ -620,7 +656,7 @@ SilcBool silc_net_check_host_by_sock(SilcSocket sock, char **hostname,
 SilcBool silc_net_check_local_by_sock(SilcSocket sock, char **hostname,
                                      char **ip);
 
-/****f* silcutil/SilcNetAPI/silc_net_get_remote_port
+/****f* silcutil/silc_net_get_remote_port
  *
  * SYNOPSIS
  *
@@ -633,7 +669,7 @@ SilcBool silc_net_check_local_by_sock(SilcSocket sock, char **hostname,
  ***/
 SilcUInt16 silc_net_get_remote_port(SilcSocket sock);
 
-/****f* silcutil/SilcNetAPI/silc_net_get_local_port
+/****f* silcutil/silc_net_get_local_port
  *
  * SYNOPSIS
  *
@@ -646,7 +682,7 @@ SilcUInt16 silc_net_get_remote_port(SilcSocket sock);
  ***/
 SilcUInt16 silc_net_get_local_port(SilcSocket sock);
 
-/****f* silcutil/SilcNetAPI/silc_net_localhost
+/****f* silcutil/silc_net_localhost
  *
  * SYNOPSIS
  *
@@ -662,7 +698,7 @@ SilcUInt16 silc_net_get_local_port(SilcSocket sock);
  ***/
 char *silc_net_localhost(void);
 
-/****f* silcutil/SilcNetAPI/silc_net_localip
+/****f* silcutil/silc_net_localip
  *
  * SYNOPSIS
  *
@@ -675,6 +711,58 @@ char *silc_net_localhost(void);
  ***/
 char *silc_net_localip(void);
 
+/****f* silcutil/silc_htonl
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_htonl(SilcUInt32 host);
+ *
+ * DESCRIPTION
+ *
+ *    Converts integer `host' from host byte order to network byte order.
+ *
+ ***/
+SilcUInt32 silc_htonl(SilcUInt32 host);
+
+/****f* silcutil/silc_ntohl
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_ntohl(SilcUInt32 net);
+ *
+ * DESCRIPTION
+ *
+ *    Converts integer `net' from network byte order to host byte order.
+ *
+ ***/
+SilcUInt32 silc_ntohl(SilcUInt32 net);
+
+/****f* silcutil/silc_htons
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt16 silc_htons(SilcUInt16 host);
+ *
+ * DESCRIPTION
+ *
+ *    Converts integer `host' from host byte order to network byte order.
+ *
+ ***/
+SilcUInt16 silc_htons(SilcUInt16 host);
+
+/****f* silcutil/silc_ntohs
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt16 silc_ntohs(SilcUInt16 net);
+ *
+ * DESCRIPTION
+ *
+ *    Converts integer `net' from network byte order to host byte order.
+ *
+ ***/
+SilcUInt16 silc_ntohs(SilcUInt16 net);
+
 #include "silcnet_i.h"
 
 #endif /* SILCNET_H */