Copyright (C) Stefan Metzmacher 2009
- ** NOTE! The following LGPL license applies to the tevent
+ ** NOTE! The following LGPL license applies to the tsocket
** library. This does NOT imply that all of Samba is released
** under the LGPL
#ifndef _TSOCKET_INTERNAL_H
#define _TSOCKET_INTERNAL_H
-struct tsocket_context_ops {
+#include <unistd.h>
+#include <sys/uio.h>
+
+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 */