#ifndef RAS_SOCKTOOL_H
#define RAS_SOCKTOOL_H

#include <stdbool.h>
#include <sys/types.h>

#define SOCKADDR(x)     ((struct sockaddr*)(x))
#define SOCKADDR_UN(x)  ((struct sockaddr_un*)(x))
#define SOCKADDR_IN(x)  ((struct sockaddr_in*)(x))
#define SOCKADDR_IN6(x) ((struct sockaddr_in6*)(x))

char* ras_socktool_get_sockname (int sockfd);
char* ras_socktool_get_peername (int sockfd);


#define RAS_BUFFER_SIZE  8192

typedef struct {
	char    buf[RAS_BUFFER_SIZE];
	off_t   buf_start;
	off_t   buf_len;
	char*   buf_line;
	ssize_t buf_line_len;
	int     buf_error : 1;
	int     buf_eof   : 1;
} RasBuffer;

void  ras_socktool_buffer_clear (RasBuffer* buf, bool initial);
void  ras_socktool_buffer_free_line (RasBuffer* buf);
char* ras_socktool_getline (int sockfd, RasBuffer* buf, int delim, int* len);
int   ras_socktool_write_string (int sockfd, const char* str, size_t size);

void  ras_socktool_reset_signals (void);
int   ras_socktool_getdtablesize (void);
void  ras_socktool_close_except (int dontclose);

typedef int (*RasSocktoolProgress) (int fd[2], RasBuffer buf[2]);
void  ras_socktool_exchange_data (int fd[2], RasSocktoolProgress prog_cb);

#endif /* RAS_SOCKTOOL_H */