#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __APPLE__ #include "dlfcn-compat.h" #include "poll-compat.h" #else #include #include #endif #define BUFSIZE 150 #define MAX_HEADERS 256 #define MAX_LEN 150 #define PROXY_BANNER "Asterisk Call Manager Proxy" #define PROXY_SHUTDOWN "ProxyMessage: Proxy Shutting Down" struct ast_server { char nickname[80]; char ast_host[40]; char ast_port[10]; char ast_user[80]; char ast_pass[80]; char ast_events[10]; int status; /* TODO: have this mean something */ struct ast_server *next; }; struct proxyconfig { struct ast_server *serverlist; char listen_addr[INET_ADDRSTRLEN]; int listen_port; char inputformat[80]; char outputformat[80]; int autofilter; char key[80]; char proc_user[30]; char proc_group[30]; char logfile[80]; int retryinterval; int maxretries; }; struct iohandler { int (*read) (); int (*write) (); int (*onconnect) (); int *(*autodisconnect)(void); char formatname[80]; void *dlhandle; struct iohandler *next; }; struct mansession { pthread_t t; pthread_mutex_t lock; struct sockaddr_in sin; int fd; char inbuf[MAX_LEN]; int inlen; struct iohandler *input; struct iohandler *output; int autofilter; int inputcomplete; int authenticated; int connected; struct ast_server *server; char actionid[MAX_LEN]; struct mansession *next; }; struct message { int hdrcount; char headers[MAX_HEADERS][MAX_LEN]; int in_command; struct mansession *session; }; struct proxyconfig pc; extern int debug; /* Common Function Prototypes */ void debugmsg (const char *, ...); const char *ast_inet_ntoa(char *buf, int bufsiz, struct in_addr ia); int AddHeader(struct message *m, const char *fmt, ...); void debugmsg (const char *fmt, ...); void logmsg (const char *fmt, ...); int StartServer(struct ast_server *srv); int WriteAsterisk(struct message *m); char *astman_get_header(struct message *m, char *var); int proxyerror_do(struct mansession *s, char *err); int get_input(struct mansession *s, char *output); int SetIOHandlers(struct mansession *s, char *ifmt, char *ofmt); void destroy_session(struct mansession *s); int connect_nonb(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec);