s4: fix various warnings (not "const" related ones)
[sfrench/samba-autobuild/.git] / source4 / lib / socket / socket.h
index 165fbb63777ecb31dec6920518ef9f3c4c9d181b..02872457b589c96d4943f8880a3971364bd7e003 100644 (file)
@@ -5,7 +5,7 @@
    
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifndef _SAMBA_SOCKET_H
 #define _SAMBA_SOCKET_H
 
+struct tevent_context;
+struct tevent_fd;
 struct socket_context;
 
 enum socket_type {
@@ -28,6 +29,14 @@ enum socket_type {
        SOCKET_TYPE_DGRAM
 };
 
+struct socket_address {
+       const char *family;
+       char *addr;
+       int port;
+       struct sockaddr *sockaddr;
+       size_t sockaddrlen;
+};
+
 struct socket_ops {
        const char *name;
 
@@ -35,9 +44,9 @@ struct socket_ops {
 
        /* client ops */
        NTSTATUS (*fn_connect)(struct socket_context *sock,
-                               const char *my_address, int my_port,
-                               const char *server_address, int server_port,
-                               uint32_t flags);
+                              const struct socket_address *my_address,
+                              const struct socket_address *server_address,
+                              uint32_t flags);
 
        /* complete a non-blocking connect */
        NTSTATUS (*fn_connect_complete)(struct socket_context *sock,
@@ -45,21 +54,23 @@ struct socket_ops {
 
        /* server ops */
        NTSTATUS (*fn_listen)(struct socket_context *sock,
-                               const char *my_address, int port, int queue_size, uint32_t flags);
-       NTSTATUS (*fn_accept)(struct socket_context *sock,      struct socket_context **new_sock);
+                             const struct socket_address *my_address, 
+                             int queue_size, uint32_t flags);
+       NTSTATUS (*fn_accept)(struct socket_context *sock,      
+                             struct socket_context **new_sock);
 
        /* general ops */
        NTSTATUS (*fn_recv)(struct socket_context *sock, void *buf,
-                           size_t wantlen, size_t *nread, uint32_t flags);
+                           size_t wantlen, size_t *nread);
        NTSTATUS (*fn_send)(struct socket_context *sock, 
-                           const DATA_BLOB *blob, size_t *sendlen, uint32_t flags);
+                           const DATA_BLOB *blob, size_t *sendlen);
 
        NTSTATUS (*fn_sendto)(struct socket_context *sock, 
-                             const DATA_BLOB *blob, size_t *sendlen, uint32_t flags,
-                             const char *dest_addr, int dest_port);
+                             const DATA_BLOB *blob, size_t *sendlen,
+                             const struct socket_address *dest_addr);
        NTSTATUS (*fn_recvfrom)(struct socket_context *sock, 
-                               void *buf, size_t wantlen, size_t *nread, uint32_t flags,
-                               const char **src_addr, int *src_port);
+                               void *buf, size_t wantlen, size_t *nread,
+                               TALLOC_CTX *addr_ctx, struct socket_address **src_addr);
        NTSTATUS (*fn_pending)(struct socket_context *sock, size_t *npending);      
 
        void (*fn_close)(struct socket_context *sock);
@@ -67,10 +78,8 @@ struct socket_ops {
        NTSTATUS (*fn_set_option)(struct socket_context *sock, const char *option, const char *val);
 
        char *(*fn_get_peer_name)(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-       char *(*fn_get_peer_addr)(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-       int (*fn_get_peer_port)(struct socket_context *sock);
-       char *(*fn_get_my_addr)(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-       int (*fn_get_my_port)(struct socket_context *sock);
+       struct socket_address *(*fn_get_peer_addr)(struct socket_context *sock, TALLOC_CTX *mem_ctx);
+       struct socket_address *(*fn_get_my_addr)(struct socket_context *sock, TALLOC_CTX *mem_ctx);
 
        int (*fn_get_fd)(struct socket_context *sock);
 };
@@ -92,6 +101,15 @@ enum socket_state {
 #define SOCKET_FLAG_BLOCK        0x00000001
 #define SOCKET_FLAG_PEEK         0x00000002
 #define SOCKET_FLAG_TESTNONBLOCK 0x00000004
+#define SOCKET_FLAG_ENCRYPT      0x00000008 /* This socket
+                                            * implementation requires
+                                            * that re-sends be
+                                            * consistant, because it
+                                            * is encrypting data.
+                                            * This modifies the
+                                            * TESTNONBLOCK case */
+#define SOCKET_FLAG_NOCLOSE      0x00000010 /* don't auto-close on free */
+
 
 struct socket_context {
        enum socket_type type;
@@ -103,72 +121,98 @@ struct socket_context {
        void *private_data;
        const struct socket_ops *ops;
        const char *backend_name;
+
+       /* specific to the ip backend */
+       int family;
 };
 
+struct resolve_context;
 
 /* prototypes */
+NTSTATUS socket_create_with_ops(TALLOC_CTX *mem_ctx, const struct socket_ops *ops,
+                               struct socket_context **new_sock, 
+                               enum socket_type type, uint32_t flags);
 NTSTATUS socket_create(const char *name, enum socket_type type, 
                       struct socket_context **new_sock, uint32_t flags);
 NTSTATUS socket_connect(struct socket_context *sock,
-                       const char *my_address, int my_port,
-                       const char *server_address, int server_port,
+                       const struct socket_address *my_address, 
+                       const struct socket_address *server_address,
                        uint32_t flags);
 NTSTATUS socket_connect_complete(struct socket_context *sock, uint32_t flags);
-NTSTATUS socket_listen(struct socket_context *sock, const char *my_address, int port, int queue_size, uint32_t flags);
+NTSTATUS socket_listen(struct socket_context *sock, 
+                      const struct socket_address *my_address, 
+                      int queue_size, uint32_t flags);
 NTSTATUS socket_accept(struct socket_context *sock, struct socket_context **new_sock);
 NTSTATUS socket_recv(struct socket_context *sock, void *buf, 
-                    size_t wantlen, size_t *nread, uint32_t flags);
+                    size_t wantlen, size_t *nread);
 NTSTATUS socket_recvfrom(struct socket_context *sock, void *buf, 
-                        size_t wantlen, size_t *nread, uint32_t flags,
-                        const char **src_addr, int *src_port);
+                        size_t wantlen, size_t *nread, 
+                        TALLOC_CTX *addr_ctx, struct socket_address **src_addr);
 NTSTATUS socket_send(struct socket_context *sock, 
-                    const DATA_BLOB *blob, size_t *sendlen, uint32_t flags);
+                    const DATA_BLOB *blob, size_t *sendlen);
 NTSTATUS socket_sendto(struct socket_context *sock, 
-                      const DATA_BLOB *blob, size_t *sendlen, uint32_t flags,
-                      const char *dest_addr, int dest_port);
+                      const DATA_BLOB *blob, size_t *sendlen,
+                      const struct socket_address *dest_addr);
 NTSTATUS socket_pending(struct socket_context *sock, size_t *npending);
 NTSTATUS socket_set_option(struct socket_context *sock, const char *option, const char *val);
 char *socket_get_peer_name(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-char *socket_get_peer_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-int socket_get_peer_port(struct socket_context *sock);
-char *socket_get_my_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
-int socket_get_my_port(struct socket_context *sock);
+struct socket_address *socket_get_peer_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
+struct socket_address *socket_get_my_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
 int socket_get_fd(struct socket_context *sock);
 NTSTATUS socket_dup(struct socket_context *sock);
+struct socket_address *socket_address_from_strings(TALLOC_CTX *mem_ctx,
+                                                  const char *type, 
+                                                  const char *host,
+                                                  int port);
+struct socket_address *socket_address_from_sockaddr(TALLOC_CTX *mem_ctx, 
+                                                   struct sockaddr *sockaddr, 
+                                                   size_t addrlen);
+struct socket_address *socket_address_copy(TALLOC_CTX *mem_ctx,
+                                          const struct socket_address *oaddr);
 const struct socket_ops *socket_getops_byname(const char *name, enum socket_type type);
-BOOL allow_access(TALLOC_CTX *mem_ctx,
+bool allow_access(TALLOC_CTX *mem_ctx,
                  const char **deny_list, const char **allow_list,
                  const char *cname, const char *caddr);
-BOOL socket_check_access(struct socket_context *sock, 
+bool socket_check_access(struct socket_context *sock, 
                         const char *service_name,
                         const char **allow_list, const char **deny_list);
 
 struct composite_context *socket_connect_send(struct socket_context *sock,
-                                             const char *my_address,
-                                             int my_port,
-                                             const char *server_address,
-                                             int server_port,
+                                             struct socket_address *my_address,
+                                             struct socket_address *server_address, 
                                              uint32_t flags,
-                                             struct event_context *event_ctx);
+                                             struct tevent_context *event_ctx);
 NTSTATUS socket_connect_recv(struct composite_context *ctx);
 NTSTATUS socket_connect_ev(struct socket_context *sock,
-                          const char *my_address, int my_port,
-                          const char *server_address, int server_port,
-                          uint32_t flags, struct event_context *ev);
+                          struct socket_address *my_address,
+                          struct socket_address *server_address, 
+                          uint32_t flags, 
+                          struct tevent_context *ev);
 
 struct composite_context *socket_connect_multi_send(TALLOC_CTX *mem_ctx,
                                                    const char *server_address,
                                                    int num_server_ports,
                                                    uint16_t *server_ports,
-                                                   struct event_context *event_ctx);
+                                                   struct resolve_context *resolve_ctx,
+                                                   struct tevent_context *event_ctx);
 NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
                                   TALLOC_CTX *mem_ctx,
                                   struct socket_context **result,
                                   uint16_t *port);
 NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx, const char *server_address,
                              int num_server_ports, uint16_t *server_ports,
-                             struct event_context *event_ctx,
+                             struct resolve_context *resolve_ctx,
+                             struct tevent_context *event_ctx,
                              struct socket_context **result,
                              uint16_t *port);
+void set_socket_options(int fd, const char *options);
+void socket_set_flags(struct socket_context *sock, unsigned flags);
+
+void socket_tevent_fd_close_fn(struct tevent_context *ev,
+                              struct tevent_fd *fde,
+                              int fd,
+                              void *private_data);
+
+extern bool testnonblock;
 
 #endif /* _SAMBA_SOCKET_H */