/*
* socket_efuns.h -- definitions and prototypes for socket_efuns.c
* 5-92 : Dwayne Fontenot : original coding.
* 10-92 : Dave Richards : less original coding.
*/
#ifndef _SOCKET_EFUNS_H_
#define _SOCKET_EFUNS_H_
#include "interpret.h"
#include "comm.h"
/* basic modes */
#define S_STREAM 0
#define S_DATAGRAM 1
/* stream minor modes */
#define S_BUFFERED_OUTPUT 16
#define S_BUFFERED_INPUT 32
#define S_MODE_MASK 15
enum socket_state { CLOSED, UNBOUND, BOUND, LISTEN, DATA_XFER };
#define ADDR_BUF_SIZE 200
#define BUF_SIZE 2048 /* max reliable packet size */
struct lpc_socket
{
int fd;
short flags;
short mode;
enum socket_state state;
struct sockaddr_in l_addr;
struct sockaddr_in r_addr;
struct object * owner_ob;
struct object * release_ob;
struct svalue read_callback;
struct svalue write_callback;
struct svalue close_callback;
char * r_buf;
int r_off;
long r_len;
char * w_buf;
int w_off;
int w_len;
};
#define S_RELEASE 0x01
#define S_BLOCKED 0x02
#define S_HEADER 0x04
#define S_WACCEPT 0x08
#define S_MORE_LINES 0x10
#define S_CLOSING 0x20
int socket_create PROT((int socket_mode, struct svalue *, struct svalue *));
int socket_close(int,int);
void close_referencing_sockets(struct object *ob);
void socket_read_select_handler(int fd);
void socket_write_select_handler(int fd);
void handle_line_sockets(void);
INLINE int set_socket_nonblocking(int fd,int which);
INLINE int set_socket_owner(int fd,int which);
int get_socket_address(int fd,char *addr,int *port);
int socket_bind(int fd,int port);
struct object *get_socket_owner(int fd);
int socket_listen(int fd,struct svalue *callback);
int socket_accept(int fd,
struct svalue *read_callback,
struct svalue * write_callback);
int socket_connect(int fd,
char *name,
struct svalue *read_callback,
struct svalue *write_callback);
int socket_write(int fd,struct svalue *message,char *name);
int socket_release(int fd,struct svalue *callback);
int socket_acquire(int fd,
struct svalue *read_callback,
struct svalue *write_callback,
struct svalue *close_callback);
char *dump_socket_status(void);
int socket_from_stdin(void);
void assign_socket_owner(struct svalue *sv,struct object *ob);
#endif /* _SOCKET_EFUNS_H_ */