tsocket: add tstream_readv_pdu_queue_send/recv()
[ira/wip.git] / lib / tsocket / tsocket_internal.h
index e4a4908f3ea14d9f2904795d9cd54a222d5976ba..55bbe9f4cb76e22b2fdc39dcae165544fe2bc68b 100644 (file)
 #ifndef _TSOCKET_INTERNAL_H
 #define _TSOCKET_INTERNAL_H
 
-struct tsocket_context_ops {
+struct tsocket_address_ops {
        const char *name;
 
-       /* event handling */
-       int (*set_event_context)(struct tsocket_context *sock,
-                                struct tevent_context *ev);
-       int (*set_read_handler)(struct tsocket_context *sock,
-                               tsocket_event_handler_t handler,
-                               void *private_data);
-       int (*set_write_handler)(struct tsocket_context *sock,
-                                tsocket_event_handler_t handler,
-                                void *private_data);
-
-       /* client ops */
-       int (*connect_to)(struct tsocket_context *sock,
-                         const struct tsocket_address *remote_addr);
-
-       /* server ops */
-       int (*listen_on)(struct tsocket_context *sock,
-                        int queue_size);
-       int (*accept_new)(struct tsocket_context *sock,
-                         TALLOC_CTX *mem_ctx,
-                         struct tsocket_context **new_sock,
-                         const char *location);
-
-       /* general ops */
-       ssize_t (*pending_data)(struct tsocket_context *sock);
-
-       int (*readv_data)(struct tsocket_context *sock,
-                         const struct iovec *vector, size_t count);
-       int (*writev_data)(struct tsocket_context *sock,
-                          const struct iovec *vector, size_t count);
-
-       ssize_t (*recvfrom_data)(struct tsocket_context *sock,
-                                uint8_t *data, size_t len,
-                                TALLOC_CTX *addr_ctx,
-                                struct tsocket_address **remote_addr);
-       ssize_t (*sendto_data)(struct tsocket_context *sock,
-                              const uint8_t *data, size_t len,
-                              const struct tsocket_address *remote_addr);
-
-       /* info */
-       int (*get_status)(const struct tsocket_context *sock);
-       int (*get_local_address)(const struct tsocket_context *sock,
-                               TALLOC_CTX *mem_ctx,
-                               struct tsocket_address **local_addr,
-                               const char *location);
-       int (*get_remote_address)(const struct tsocket_context *sock,
-                                 TALLOC_CTX *mem_ctx,
-                                 struct tsocket_address **remote_addr,
-                                 const char *location);
-
-       /* options */
-       int (*get_option)(const struct tsocket_context *sock,
-                         const char *option,
-                         TALLOC_CTX *mem_ctx,
-                         char **value);
-       int (*set_option)(const struct tsocket_context *sock,
-                         const char *option,
-                         bool force,
-                         const char *value);
-
-       /* close/disconnect */
-       void (*disconnect)(struct tsocket_context *sock);
+       char *(*string)(const struct tsocket_address *addr,
+                       TALLOC_CTX *mem_ctx);
+
+       struct tsocket_address *(*copy)(const struct tsocket_address *addr,
+                                       TALLOC_CTX *mem_ctx,
+                                       const char *location);
 };
 
-struct tsocket_context {
+struct tsocket_address {
        const char *location;
-       const struct tsocket_context_ops *ops;
+       const struct tsocket_address_ops *ops;
 
        void *private_data;
-
-       struct {
-               struct tevent_context *ctx;
-               void *read_private;
-               tsocket_event_handler_t read_handler;
-               void *write_private;
-               tsocket_event_handler_t write_handler;
-       } event;
 };
 
-struct tsocket_context *_tsocket_context_create(TALLOC_CTX *mem_ctx,
-                                       const struct tsocket_context_ops *ops,
+struct tsocket_address *_tsocket_address_create(TALLOC_CTX *mem_ctx,
+                                       const struct tsocket_address_ops *ops,
                                        void *pstate,
                                        size_t psize,
                                        const char *type,
                                        const char *location);
-#define tsocket_context_create(mem_ctx, ops, state, type, location) \
-       _tsocket_context_create(mem_ctx, ops, state, sizeof(type), \
+#define tsocket_address_create(mem_ctx, ops, state, type, location) \
+       _tsocket_address_create(mem_ctx, ops, state, sizeof(type), \
                                #type, location)
 
-struct tsocket_address_ops {
+struct tdgram_context_ops {
        const char *name;
 
-       char *(*string)(const struct tsocket_address *addr,
-                       TALLOC_CTX *mem_ctx);
+       struct tevent_req *(*recvfrom_send)(TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct tdgram_context *dgram);
+       ssize_t (*recvfrom_recv)(struct tevent_req *req,
+                                int *perrno,
+                                TALLOC_CTX *mem_ctx,
+                                uint8_t **buf,
+                                struct tsocket_address **src);
+
+       struct tevent_req *(*sendto_send)(TALLOC_CTX *mem_ctx,
+                                         struct tevent_context *ev,
+                                         struct tdgram_context *dgram,
+                                         const uint8_t *buf, size_t len,
+                                         const struct tsocket_address *dst);
+       ssize_t (*sendto_recv)(struct tevent_req *req,
+                              int *perrno);
+
+       struct tevent_req *(*disconnect_send)(TALLOC_CTX *mem_ctx,
+                                             struct tevent_context *ev,
+                                             struct tdgram_context *dgram);
+       int (*disconnect_recv)(struct tevent_req *req,
+                              int *perrno);
+};
 
-       struct tsocket_address *(*copy)(const struct tsocket_address *addr,
-                                       TALLOC_CTX *mem_ctx,
+struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx,
+                                       const struct tdgram_context_ops *ops,
+                                       void *pstate,
+                                       size_t psize,
+                                       const char *type,
                                        const char *location);
+#define tdgram_context_create(mem_ctx, ops, state, type, location) \
+       _tdgram_context_create(mem_ctx, ops, state, sizeof(type), \
+                               #type, location)
 
-       int (*create_socket)(const struct tsocket_address *addr,
-                            enum tsocket_type,
-                            TALLOC_CTX *mem_ctx,
-                            struct tsocket_context **sock,
-                            const char *location);
-};
+void *_tdgram_context_data(struct tdgram_context *dgram);
+#define tdgram_context_data(_req, _type) \
+       talloc_get_type_abort(_tdgram_context_data(_req), _type)
 
-struct tsocket_address {
-       const char *location;
-       const struct tsocket_address_ops *ops;
+struct tstream_context_ops {
+       const char *name;
 
-       void *private_data;
+       ssize_t (*pending_bytes)(struct tstream_context *stream);
+
+       struct tevent_req *(*readv_send)(TALLOC_CTX *mem_ctx,
+                                        struct tevent_context *ev,
+                                        struct tstream_context *stream,
+                                        struct iovec *vector,
+                                        size_t count);
+       int (*readv_recv)(struct tevent_req *req,
+                         int *perrno);
+
+       struct tevent_req *(*writev_send)(TALLOC_CTX *mem_ctx,
+                                         struct tevent_context *ev,
+                                         struct tstream_context *stream,
+                                         const struct iovec *vector,
+                                         size_t count);
+       int (*writev_recv)(struct tevent_req *req,
+                          int *perrno);
+
+       struct tevent_req *(*disconnect_send)(TALLOC_CTX *mem_ctx,
+                                             struct tevent_context *ev,
+                                             struct tstream_context *stream);
+       int (*disconnect_recv)(struct tevent_req *req,
+                              int *perrno);
 };
 
-struct tsocket_address *_tsocket_address_create(TALLOC_CTX *mem_ctx,
-                                       const struct tsocket_address_ops *ops,
+struct tstream_context *_tstream_context_create(TALLOC_CTX *mem_ctx,
+                                       const struct tstream_context_ops *ops,
                                        void *pstate,
                                        size_t psize,
                                        const char *type,
                                        const char *location);
-#define tsocket_address_create(mem_ctx, ops, state, type, location) \
-       _tsocket_address_create(mem_ctx, ops, state, sizeof(type), \
+#define tstream_context_create(mem_ctx, ops, state, type, location) \
+       _tstream_context_create(mem_ctx, ops, state, sizeof(type), \
                                #type, location)
 
-int tsocket_error_from_errno(int ret, int sys_errno, bool *retry);
+void *_tstream_context_data(struct tstream_context *stream);
+#define tstream_context_data(_req, _type) \
+       talloc_get_type_abort(_tstream_context_data(_req), _type)
+
 int tsocket_simple_int_recv(struct tevent_req *req, int *perrno);
-int tsocket_common_prepare_fd(int fd, bool high_fd);
 
 #endif /* _TSOCKET_H */