/** Create log stamp */ void tport_stamp(tport_t const *self, msg_t *msg, char stamp[128], char const *what, size_t n, char const *via, su_time_t now) { char label[24] = ""; char *comp = ""; char name[SU_ADDRSIZE] = ""; su_sockaddr_t const *su; unsigned short second, minute, hour; /* should check for ifdef HAVE_LOCALTIME_R instead -_- */ #if defined(HAVE_GETTIMEOFDAY) || defined(HAVE_CLOCK_MONOTONIC) struct tm nowtm = { 0 }; time_t nowtime = (now.tv_sec - SU_TIME_EPOCH); /* see su_time0.c 'now' is not really 'now', so we decrease it by SU_TIME_EPOCH */ #endif assert(self); assert(msg); #if defined(HAVE_GETTIMEOFDAY) || defined(HAVE_CLOCK_MONOTONIC) localtime_r(&nowtime, &nowtm); second = nowtm.tm_sec; minute = nowtm.tm_min; hour = nowtm.tm_hour; #else second = (unsigned short)(now.tv_sec % 60); minute = (unsigned short)((now.tv_sec / 60) % 60); hour = (unsigned short)((now.tv_sec / 3600) % 24); #endif su = msg_addr(msg); #if SU_HAVE_IN6 if (su->su_family == AF_INET6) { if (su->su_sin6.sin6_flowinfo) snprintf(label, sizeof(label), "/%u", ntohl(su->su_sin6.sin6_flowinfo)); } #endif if (msg_addrinfo(msg)->ai_flags & TP_AI_COMPRESSED) comp = ";comp=sigcomp"; su_inet_ntop(su->su_family, SU_ADDR(su), name, sizeof(name)); snprintf(stamp, 128, "%s "MOD_ZU" bytes %s %s/[%s]:%u%s%s at %02u:%02u:%02u.%06lu:\n", what, (size_t)n, via, self->tp_name->tpn_proto, name, ntohs(su->su_port), label[0] ? label : "", comp, hour, minute, second, now.tv_usec); }
/** Create log stamp */ void tport_stamp(tport_t const *self, msg_t *msg, char stamp[128], char const *what, size_t n, char const *via, su_time_t now) { char label[24] = ""; char *comp = ""; char name[SU_ADDRSIZE] = ""; su_sockaddr_t const *su; unsigned short second, minute, hour; assert(self); assert(msg); second = (unsigned short)(now.tv_sec % 60); minute = (unsigned short)((now.tv_sec / 60) % 60); hour = (unsigned short)((now.tv_sec / 3600) % 24); su = msg_addr(msg); #if SU_HAVE_IN6 if (su->su_family == AF_INET6) { if (su->su_sin6.sin6_flowinfo) snprintf(label, sizeof(label), "/%u", ntohl(su->su_sin6.sin6_flowinfo)); } #endif if (msg_addrinfo(msg)->ai_flags & TP_AI_COMPRESSED) comp = ";comp=sigcomp"; su_inet_ntop(su->su_family, SU_ADDR(su), name, sizeof(name)); snprintf(stamp, 128, "%s "MOD_ZU" bytes %s %s/[%s]:%u%s%s at %02u:%02u:%02u.%06lu:\n", what, (size_t)n, via, self->tp_name->tpn_proto, name, ntohs(su->su_port), label[0] ? label : "", comp, hour, minute, second, now.tv_usec); }
/** Capture the data from the iovec */ void tport_capt_msg(tport_t const *self, msg_t *msg, size_t n, su_iovec_t const iov[], size_t iovused, char const *what) { int buflen = 0, error; su_sockaddr_t const *su, *su_self; struct hep_hdr hep_header; #if __sun__ struct hep_iphdr hep_ipheader = {{{{0}}}}; #else struct hep_iphdr hep_ipheader = {{0}}; #endif #if SU_HAVE_IN6 struct hep_ip6hdr hep_ip6header = {{{{0}}}}; #endif int eth_frame_len = 8000; char* buffer; size_t i, dst = 0; tport_master_t *mr; assert(self); assert(msg); su = msg_addr(msg); su_self = self->tp_pri->pri_primary->tp_addr; mr = self->tp_master; /* If we don't have socket, go out */ if (!mr->mr_capt_sock) { su_log("error: capture socket is not open\n"); return; } /*buffer for ethernet frame*/ buffer = (void*)malloc(eth_frame_len); /* VOIP Header */ hep_header.hp_v = 1; hep_header.hp_f = su->su_family; /* Header Length */ hep_header.hp_l = sizeof(struct hep_hdr); /* PROTOCOL */ if(strcmp(self->tp_name->tpn_proto, "tcp") == 0) hep_header.hp_p = IPPROTO_TCP; else if(strcmp(self->tp_name->tpn_proto, "tls") == 0) hep_header.hp_p = IPPROTO_IDP; /* FAKE*/ else if(strcmp(self->tp_name->tpn_proto, "sctp") == 0) hep_header.hp_p = IPPROTO_SCTP; else if(strcmp(self->tp_name->tpn_proto, "ws") == 0) hep_header.hp_p = IPPROTO_TCP; else if(strcmp(self->tp_name->tpn_proto, "wss") == 0) hep_header.hp_p = IPPROTO_TCP; else hep_header.hp_p = IPPROTO_UDP; /* DEFAULT UDP */ /* Check destination */ if(strncmp("sent", what, 4) == 0) dst = 1; /* copy destination and source IPs*/ if(su->su_family == AF_INET) { memcpy(dst ? &hep_ipheader.hp_dst : &hep_ipheader.hp_src, &su->su_sin.sin_addr.s_addr, sizeof(su->su_sin.sin_addr.s_addr)); memcpy(dst ? &hep_ipheader.hp_src : &hep_ipheader.hp_dst, &su_self->su_sin.sin_addr.s_addr, sizeof(su_self->su_sin.sin_addr.s_addr)); hep_header.hp_l += sizeof(struct hep_iphdr); } #if SU_HAVE_IN6 else { memcpy(dst ? &hep_ip6header.hp6_dst : &hep_ip6header.hp6_src, &su->su_sin.sin_addr.s_addr, sizeof(su->su_sin.sin_addr.s_addr)); memcpy(dst ? &hep_ip6header.hp6_src : &hep_ip6header.hp6_dst, &su_self->su_sin.sin_addr.s_addr, sizeof(su_self->su_sin.sin_addr.s_addr)); hep_header.hp_l += sizeof(struct hep_ip6hdr); } #endif hep_header.hp_dport = dst ? su->su_port : su_self->su_port; hep_header.hp_sport = dst ? su_self->su_port : su->su_port; /* Copy hepheader */ memset(buffer, '\0', eth_frame_len); memcpy(buffer, &hep_header, sizeof(struct hep_hdr)); buflen = sizeof(struct hep_hdr); if(su->su_family == AF_INET) { memcpy(buffer + buflen, &hep_ipheader, sizeof(struct hep_iphdr)); buflen += sizeof(struct hep_iphdr); } #if SU_HAVE_IN6 else if(su->su_family == AF_INET6) { memcpy(buffer+buflen, &hep_ip6header, sizeof(struct hep_ip6hdr)); buflen += sizeof(struct hep_ip6hdr); } #endif else { su_perror("error: tport_logging: capture: unsupported protocol family"); goto done; } for (i = 0; i < iovused && n > 0; i++) { size_t len = iov[i].mv_len; if (len > n) len = n; /* if the packet too big for us */ if((buflen + len) > eth_frame_len) break; memcpy(buffer + buflen , (void*)iov[i].mv_base, len); buflen +=len; n -= len; } /* check if we have error i.e. capture server is down */ if ((error = su_soerror(mr->mr_capt_sock))) { su_perror("error: tport_logging: capture socket error"); goto done; } su_send(mr->mr_capt_sock, buffer, buflen, 0); done: /* Now we release it */ if(buffer) free(buffer); return; }
int eval(struct expr *e, struct mailinfo *m) { switch (e->op) { case EXPR_OR: return eval(e->a.expr, m) || eval(e->b.expr, m); case EXPR_AND: return eval(e->a.expr, m) && eval(e->b.expr, m); case EXPR_NOT: return !eval(e->a.expr, m); return 1; case EXPR_PRUNE: prune = 1; return 1; case EXPR_PRINT: return 1; case EXPR_LT: case EXPR_LE: case EXPR_EQ: case EXPR_NEQ: case EXPR_GE: case EXPR_GT: case EXPR_ALLSET: case EXPR_ANYSET: { long v = 0, n; if (!m->sb && ( e->a.prop == PROP_ATIME || e->a.prop == PROP_CTIME || e->a.prop == PROP_MTIME || e->a.prop == PROP_SIZE) && (m->sb = calloc(1, sizeof *m->sb)) && stat(m->fpath, m->sb) != 0) { fprintf(stderr, "stat"); exit(2); } n = e->b.num; if (e->extra) switch (e->b.var) { case VAR_CUR: if (!cur_idx) n = (e->op == EXPR_LT || e->op == EXPR_LE) ? LONG_MAX : -1; else n = cur_idx; break; } switch (e->a.prop) { case PROP_ATIME: if (m->sb) v = m->sb->st_atime; break; case PROP_CTIME: if (m->sb) v = m->sb->st_ctime; break; case PROP_MTIME: if (m->sb) v = m->sb->st_mtime; break; case PROP_KEPT: v = kept; break; case PROP_REPLIES: v = m->replies; break; case PROP_SIZE: if (m->sb) v = m->sb->st_size; break; case PROP_DATE: v = msg_date(m); break; case PROP_FLAG: v = m->flags; break; case PROP_INDEX: v = m->index; break; case PROP_DEPTH: v = m->depth; break; default: parse_error("unknown property"); } switch (e->op) { case EXPR_LT: return v < n; case EXPR_LE: return v <= n; case EXPR_EQ: return v == n; case EXPR_NEQ: return v != n; case EXPR_GE: return v >= n; case EXPR_GT: return v > n; case EXPR_ALLSET: return (v & n) == n; case EXPR_ANYSET: return (v & n) > 0; default: parse_error("invalid operator"); } } case EXPR_STREQ: case EXPR_STREQI: case EXPR_GLOB: case EXPR_GLOBI: case EXPR_REGEX: case EXPR_REGEXI: { const char *s = ""; switch (e->a.prop) { case PROP_PATH: s = m->fpath; break; case PROP_FROM: s = msg_addr(m, "from", e->extra); break; case PROP_TO: s = msg_addr(m, "to", e->extra); break; default: s = msg_hdr(m, e->a.string); break; } switch (e->op) { case EXPR_STREQ: return strcmp(e->b.string, s) == 0; case EXPR_STREQI: return strcasecmp(e->b.string, s) == 0; case EXPR_GLOB: return fnmatch(e->b.string, s, 0) == 0; case EXPR_GLOBI: return fnmatch(e->b.string, s, FNM_CASEFOLD) == 0; case EXPR_REGEX: case EXPR_REGEXI: return regexec(e->b.regex, s, 0, 0, 0) == 0; } } } return 0; }