static void ses_vsl_socket(struct sess *sp, const char *lsockname) { struct sockaddr_storage ss; socklen_t sl; char laddr[ADDR_BUFSIZE]; char lport[PORT_BUFSIZE]; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); AN(lsockname); AN(sp->addrs); sl = sizeof ss; AZ(getsockname(sp->fd, (void*)&ss, &sl)); AN(VSA_Build(sess_local_addr(sp), &ss, sl)); assert(VSA_Sane(sess_local_addr(sp))); VTCP_name(sess_remote_addr(sp), laddr, sizeof laddr, lport, sizeof lport); sp->client_addr_str = WS_Copy(sp->ws, laddr, -1); sp->client_port_str = WS_Copy(sp->ws, lport, -1); VTCP_name(sess_local_addr(sp), laddr, sizeof laddr, lport, sizeof lport); VSL(SLT_Begin, sp->vxid, "sess 0 HTTP/1"); VSL(SLT_SessOpen, sp->vxid, "%s %s %s %s %s %.6f %d", sp->client_addr_str, sp->client_port_str, lsockname, laddr, lport, sp->t_open, sp->fd); }
int vtc_send_proxy(int fd, int version, const struct suckaddr *sac, const struct suckaddr *sas) { struct vsb *vsb; char hc[VTCP_ADDRBUFSIZE]; char pc[VTCP_PORTBUFSIZE]; char hs[VTCP_ADDRBUFSIZE]; char ps[VTCP_PORTBUFSIZE]; int i, len; int proto; AN(sac); AN(sas); assert(version == 1 || version == 2); vsb = VSB_new_auto(); AN(vsb); proto = VSA_Get_Proto(sas); assert(proto == PF_INET6 || proto == PF_INET); if (version == 1) { VSB_bcat(vsb, vpx1_sig, sizeof(vpx1_sig)); if (proto == PF_INET6) VSB_printf(vsb, " TCP6 "); else if (proto == PF_INET) VSB_printf(vsb, " TCP4 "); VTCP_name(sac, hc, sizeof(hc), pc, sizeof(pc)); VTCP_name(sas, hs, sizeof(hs), ps, sizeof(ps)); VSB_printf(vsb, "%s %s %s %s\r\n", hc, hs, pc, ps); } else if (version == 2) { VSB_bcat(vsb, vpx2_sig, sizeof(vpx2_sig)); VSB_putc(vsb, 0x21); if (proto == PF_INET6) { VSB_putc(vsb, 0x21); VSB_putc(vsb, 0x00); VSB_putc(vsb, 0x24); } else if (proto == PF_INET) { VSB_putc(vsb, 0x11); VSB_putc(vsb, 0x00); VSB_putc(vsb, 0x0c); } vpx_enc_addr(vsb, proto, sac); vpx_enc_addr(vsb, proto, sas); vpx_enc_port(vsb, sac); vpx_enc_port(vsb, sas); } else WRONG("Wrong proxy version"); AZ(VSB_finish(vsb)); len = VSB_len(vsb); i = write(fd, VSB_data(vsb), len); VSB_delete(vsb); return (i != len); }
static void vcc_suckaddr(struct vcc *tl, const char *host, const struct suckaddr *vsa, const char **ip, const char **ip_ascii, const char **p_ascii) { char a[VTCP_ADDRBUFSIZE]; char p[VTCP_PORTBUFSIZE]; const int sz = sizeof(unsigned long long); const unsigned n = (vsa_suckaddr_len + sz - 1) / sz; unsigned long long b[n]; int len; char *q; VTCP_name(vsa, a, sizeof a, p, sizeof p); Fh(tl, 0, "\n/* \"%s\" -> %s */\n", host, a); if (ip_ascii != NULL) *ip_ascii = TlDup(tl, a); if (p_ascii != NULL && *p_ascii == NULL) *p_ascii = TlDup(tl, p); Fh(tl, 0, "static const unsigned long long"); Fh(tl, 0, " suckaddr_%u[%d] = {\n", tl->unique, n); memcpy(b, vsa, vsa_suckaddr_len); for (len = 0; len < n; len++) Fh(tl, 0, "%s 0x%0*llxULL", len ? ",\n" : "", sz * 2, b[len]); Fh(tl, 0, "\n};\n"); q = TlAlloc(tl, 40); AN(q); assert(snprintf(q, 40, "(const void*)suckaddr_%u", tl->unique) < 40); *ip = q; tl->unique++; }
void VTCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen) { struct sockaddr_storage addr_s; socklen_t l; l = sizeof addr_s; AZ(getsockname(sock, (void *)&addr_s, &l)); VTCP_name(&addr_s, l, abuf, alen, pbuf, plen); }
char * VRT_IP_string(const struct vrt_ctx *ctx, VCL_IP ip) { char *p; unsigned len; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); len = WS_Reserve(ctx->ws, 0); p = ctx->ws->f; VTCP_name(ip, p, len, NULL, 0); WS_Release(ctx->ws, strlen(p) + 1); return (p); }
void VTCP_hisname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen) { struct sockaddr_storage addr_s; socklen_t l; l = sizeof addr_s; if (!getpeername(sock, (void*)&addr_s, &l)) VTCP_name(&addr_s, l, abuf, alen, pbuf, plen); else { (void)snprintf(abuf, alen, "<none>"); (void)snprintf(pbuf, plen, "<none>"); } }
char * VRT_IP_string(VRT_CTX, VCL_IP ip) { char *p; unsigned len; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); if (ip == NULL) return (NULL); len = WS_Reserve(ctx->ws, 0); if (len == 0) { WS_Release(ctx->ws, 0); return (NULL); } p = ctx->ws->f; VTCP_name(ip, p, len, NULL, 0); WS_Release(ctx->ws, strlen(p) + 1); return (p); }