#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" #define ACTION_ID "ActionID" 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]; char use_ssl[5]; int status; /* TODO: have this mean something */ struct ast_server *next; }; struct proxy_user { char username[80]; char secret[80]; char channel[80]; char icontext[80]; char ocontext[80]; struct proxy_user *next; }; struct proxyconfig { struct ast_server *serverlist; struct proxy_user *userlist; char listen_addr[INET_ADDRSTRLEN]; int listen_port; char inputformat[80]; char outputformat[80]; int autofilter; char key[80]; char proc_user[40]; char proc_group[40]; char logfile[256]; int retryinterval; int maxretries; int asteriskwritetimeout; /* ms to wait when writing to asteriskfor ast_carefulwrite */ int clientwritetimeout; /* ms to wait when writing to client ast_carefulwrite */ int sslclhellotimeout; /* ssl client hello timeout -- how long to wait before assuming not ssl */ int acceptencryptedconnection; /* accept encrypted connections? */ int acceptunencryptedconnection; /* accept unencrypted connections? */ char certfile[256]; /* our SERVER-side SSL certificate file */ }; 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; struct proxy_user user; char actionid[MAX_LEN]; char challenge[10]; /*! Authentication challenge */ int writetimeout; /* Timeout for ast_carefulwrite() */ 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); int ast_carefulwrite(int fd, char *s, int len, int timeoutms); extern void *SendError(struct mansession *s, char *errmsg);