1 #include <opensrf/utils.h>
2 #include <opensrf/log.h>
10 //---------------------------------------------------------------
12 //---------------------------------------------------------------
17 #include <sys/socket.h>
18 #include <arpa/inet.h>
20 #include <netinet/in.h>
21 #include <netinet/tcp.h>
26 #ifndef SOCKET_BUNDLE_H
27 #define SOCKET_BUNDLE_H
30 #define SERVER_SOCKET 1
31 #define CLIENT_SOCKET 2
37 /* models a single socket connection */
38 struct socket_node_struct {
39 int endpoint; /* SERVER_SOCKET or CLIENT_SOCKET */
40 int addr_type; /* INET or UNIX */
42 int parent_id; /* if we're a new client for a server socket,
43 this points to the server socket we spawned from */
44 struct socket_node_struct* next;
46 typedef struct socket_node_struct socket_node;
49 /* Maintains the socket set */
50 struct socket_manager_struct {
51 /* callback for passing up any received data. sock_fd is the socket
52 that read the data. parent_id (if > 0) is the socket id of the
53 server that this socket spawned from (i.e. it's a new client connection) */
55 (void* blob, struct socket_manager_struct*,
56 int sock_fd, char* data, int parent_id);
58 void (*on_socket_closed) (void* blob, int sock_fd);
63 typedef struct socket_manager_struct socket_manager;
65 void socket_manager_free(socket_manager* mgr);
67 /* creates a new server socket node and adds it to the socket set.
68 returns socket id on success. -1 on failure.
69 socket_type is one of INET or UNIX */
70 int socket_open_tcp_server(socket_manager*, int port, char* listen_ip );
72 int socket_open_unix_server(socket_manager* mgr, char* path);
74 int socket_open_udp_server( socket_manager* mgr, int port, char* listen_ip );
76 /* creates a client TCP socket and adds it to the socket set.
77 returns 0 on success. -1 on failure. */
78 int socket_open_tcp_client(socket_manager*, int port, char* dest_addr);
80 /* creates a client UNIX socket and adds it to the socket set.
81 returns 0 on success. -1 on failure. */
82 int socket_open_unix_client(socket_manager*, char* sock_path);
84 int socket_open_udp_client( socket_manager* mgr, int port, char* dest_addr);
86 /* sends the given data to the given socket. returns 0 on success, -1 otherwise */
87 int socket_send(int sock_fd, const char* data);
89 /* waits at most usecs microseconds for the socket buffer to
91 int socket_send_timeout( int sock_fd, const char* data, int usecs );
93 /* disconnects the node with the given sock_fd and removes
94 it from the socket set */
95 void socket_disconnect(socket_manager*, int sock_fd);
97 /* XXX This only works if 'sock_fd' is a client socket... */
98 int socket_wait(socket_manager* mgr, int timeout, int sock_fd);
100 /* waits on all sockets for incoming data.
101 timeout == -1 | block indefinitely
102 timeout == 0 | don't block, just read any available data off all sockets
103 timeout == x | block for at most x seconds */
104 int socket_wait_all(socket_manager* mgr, int timeout);
106 /* utility function for displaying the currently attached sockets */
107 void _socket_print_list(socket_manager* mgr);
109 int socket_connected(int sock_fd);