lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
/*
 *  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_ */