37 #define DEBUG_LEVEL 12 39 static char *greysock =
"inet:2012@localhost";
58 static greychan_T gChan = {
FALSE, AF_UNSPEC, 0, NULL, NULL, -1, 10, 10 };
60 static pthread_mutex_t grcl_mutex = PTHREAD_MUTEX_INITIALIZER;
62 static int grey_server_disconnect();
63 static int grey_server_connect();
65 static void grey_errors_clear();
67 static bool grey_socket_flush_read();
74 #define GREY_CONN_INC() grey_queue_check_size(1) 75 #define GREY_CONN_DEC() grey_queue_check_size(-1) 76 #define GREY_CONN_CHECK() grey_queue_check_size(0) 79 #define MAX_OPEN_CONN 50 80 static int grey_connections = 0;
83 grey_queue_check_size(n)
86 static pthread_mutex_t wmutex = PTHREAD_MUTEX_INITIALIZER;
90 grey_connections += n;
101 #define SRV_ERR_MAX 4 103 #define SRV_MIN_ERR_DELAY (1 MINUTES) 104 #define SRV_MAX_ERR_DELAY (8 MINUTES) 106 static time_t error_last = (time_t) 0;
107 static int error_count = 0;
110 static pthread_mutex_t err_mutex = PTHREAD_MUTEX_INITIALIZER;
113 grey_server_error_inc_and_check(inc)
116 time_t now = time(NULL);
128 "disabling remote check for %d seconds",
SRV_ERR_MAX,
131 grey_server_disconnect();
135 res = (error_count <
SRV_ERR_MAX) || (error_last + dt_error < now);
153 grey_server_disconnect();
165 grey_socket_check(
sd)
174 memset(&pfd, 0,
sizeof (pfd));
177 pfd.events = POLLIN | POLLOUT;
179 if ((res = poll(&pfd, 1, 0)) < 0)
190 grey_socket_decode(arg)
201 if (strncasecmp(p, s, strlen(s)) == 0) {
204 if ((gChan.
sockname = strdup(p)) == NULL) {
214 if (strncasecmp(p, s, strlen(s)) == 0) {
217 if ((gChan.
sockname = strdup(p)) == NULL) {
227 if (strncasecmp(p, s, strlen(s)) == 0) {
232 n = strspn(p,
"0123456789");
233 if ((n > 0) && (n <
sizeof (tmp))) {
245 gChan.
inethost = strdup(
"localhost");
269 grey_server_disconnect()
277 shutdown(gChan.
sd, SHUT_RDWR);
291 grey_server_connect()
297 if ((env = getenv(
"GREYD_RECV_TIMEOUT")) != NULL) {
304 if ((env = getenv(
"GREYD_SEND_TIMEOUT")) != NULL) {
312 struct sockaddr_in his_sock;
320 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
328 if ((hp = gethostbyname(gChan.
inethost)) == NULL) {
333 memcpy((
char *) &his_sock.sin_addr, hp->h_addr, hp->h_length);
334 his_sock.sin_family = AF_INET;
335 his_sock.sin_port = htons(gChan.
inetport);
339 log_sock_addr(&his_sock);
345 if (
connect_timed(sd, (
struct sockaddr *) &his_sock,
sizeof (his_sock), to)
349 shutdown(sd, SHUT_RDWR);
361 struct sockaddr_un his_sock;
368 if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
376 memset(&his_sock, 0,
sizeof (his_sock));
377 his_sock.sun_family = AF_UNIX;
384 if (connect(sd, (
struct sockaddr *) &his_sock,
sizeof (his_sock)) != 0) {
386 shutdown(sd, SHUT_RDWR);
409 char *scan_arg = NULL;
423 if (!grey_server_error_inc_and_check(
FALSE))
431 gChan.
ok = grey_socket_decode(greysock);
446 (void) grey_server_error_inc_and_check(
TRUE);
451 if (gChan.
sd >= 0 && !grey_socket_check(gChan.
sd))
452 grey_server_disconnect();
457 gChan.
sd = grey_server_connect();
465 sz = recvfrom(gChan.
sd, buf, sizeof (buf), 0, NULL, NULL);
483 (
void) grey_server_error_inc_and_check(
TRUE);
485 return gChan.
sd >= 0;
504 time_t tiw, tfw, tfs;
523 "Not checking ze-greyd server - too many open connections (%d/%d)",
528 tiw = tfw = tfs = time(NULL);
531 tfw = tfs = time(NULL);
533 if (!grey_channel_check())
542 if (!flush_read_socket(gChan.
sd)) {
551 grey_server_disconnect();
564 ti = tf = time(NULL);
566 memset(buf, 0,
sizeof (buf));
585 ZE_LogMsgError(0,
"greyd server sent no data or time out exceeded");
586 grey_server_error_inc_and_check(
TRUE);
598 szok =
sizeof (buf) - strlen(buf) - 1;
599 p = buf + strlen(buf);
601 n = recvfrom(gChan.
sd, p, szok, 0, NULL, NULL);
616 grey_server_error_inc_and_check(
TRUE);
625 grey_server_disconnect();
632 if (strlen(buf) > 0) {
639 while ((sz =
buf_get_line(line,
sizeof (line), p, strlen(p))) > 0) {
647 (line,
"([0-9]+) .*GREYCHECK ANSWER", NULL, NULL,
TRUE))
669 grey_socket_flush_read();
681 if (dts >= 15 || dtw >= 15 || dts + dtw >= 15) {
684 grey_server_disconnect();
715 time_t tiw, tfw, tfs;
733 "Not checking ze-greyd server - too many open connections (%d/%d)",
738 tiw = tfw = tfs = time(NULL);
741 tfw = tfs = time(NULL);
743 if (!grey_channel_check())
750 if (!flush_read_socket(gChan.
sd)) {
759 grey_server_disconnect();
772 ti = tf = time(NULL);
774 memset(buf, 0,
sizeof (buf));
793 ZE_LogMsgError(0,
"greyd server sent no data or time out exceeded");
794 grey_server_error_inc_and_check(
TRUE);
806 szok =
sizeof (buf) - strlen(buf) - 1;
807 p = buf + strlen(buf);
809 n = recvfrom(gChan.
sd, p, szok, 0, NULL, NULL);
824 grey_server_error_inc_and_check(
TRUE);
833 grey_server_disconnect();
838 if (strlen(buf) <= 0) {
842 ZE_LogMsgError(0,
"greyd server sent no data or time out exceeded");
843 grey_server_error_inc_and_check(
TRUE);
849 if (strlen(buf) > 0) {
856 while ((sz =
buf_get_line(line,
sizeof (line), p, strlen(p))) > 0) {
864 (line,
"([0-9]+) .*GREYVALID ANSWER", NULL, NULL,
TRUE))
886 grey_socket_flush_read();
897 if (dts >= 15 || dtw >= 15 || dts + dtw >= 15) {
900 grey_server_disconnect();
926 grey_server_disconnect(gChan.
sd);
943 grey_socket_flush_read()
954 n = recvfrom(gChan.
sd, buf, sizeof (buf), 0, NULL, NULL);
966 grey_server_error_inc_and_check(
TRUE);
975 grey_server_disconnect(gChan.
sd);
bool sd_printf(int sd, char *format,...)
int remote_grey_check(char *ip, char *from, char *to, char *hostname)
#define MUTEX_UNLOCK(mutex)
#define MUTEX_LOCK(mutex)
int buf_get_line(char *, long, char *, long)
int jfd_ready(int, bool, long)
#define ZE_LogMsgError(level,...)
bool zeStrRegex(char *, char *, long *, long *, bool)
int remote_grey_validate(char *ip, char *from, char *to, char *hostname)
int zeStr2Tokens(char *, int, char **, char *)
#define GREY_CONN_CHECK()
#define CF_GREY_CONNECT_TIMEOUT
long zeStr2long(char *s, int *error, long dval)
void grey_channel_error_clear()
int connect_timed(int, struct sockaddr *, socklen_t, int)
#define ZE_MessageInfo(level,...)
#define ZE_MessageWarning(level,...)
#define ZE_LogSysError(...)
#define ZE_MessageError(level,...)
char * cf_get_str(int id)
#define ZE_LogMsgWarning(level,...)
unsigned long zeStr2ulong(char *s, int *error, unsigned long dval)
#define SRV_MAX_ERR_DELAY
#define SRV_MIN_ERR_DELAY