struct vsb * vtc_hex_to_bin(struct vtclog *vl, const char *arg) { struct vsb *vsb; unsigned sh = 4; unsigned c, b = 0; vsb = VSB_new_auto(); AN(vsb); for (; *arg != '\0'; arg++) { if (vct_issp(*arg) || *arg == '\n') continue; c = (uint8_t)*arg; if (c >= '0' && c <= '9') b |= (c - 48U) << sh; else if (c >= 'A' && c <= 'F') b |= (c - 55U) << sh; else if (c >= 'a' && c <= 'f') b |= (c - 87U) << sh; else vtc_fatal(vl,"Illegal hex string"); sh = 4 - sh; if (sh == 4) { VSB_putc(vsb, b); b = 0; } } if (sh != 4) VSB_putc(vsb, b); AZ(VSB_finish(vsb)); return (vsb); }
static char *vbackends_show_json(char *raw) { char *out1 = NULL, *out2 = NULL, *out3 = NULL ; struct vsb *final= VSB_new_auto(); char *tokens = NULL, *ptr = NULL; char tmp[1000]; int raw_len = 0; int state = 0; int cont = 0; int sum = 0; raw_len = strlen(raw); tokens = strtok(raw, "\n"); sum = sum + strlen(tokens); while(tokens != NULL){ strcpy(tmp, (tokens)); tokens = strtok(NULL, "\n"); sum = sum + strlen(tmp); if(cont > 0){ ptr = format_line(tmp); VSB_cat(final, ptr); if(sum < raw_len) VSB_cat(final, ",\n"); free(ptr); } cont++; }
int http_process(struct vtclog *vl, const char *spec, int sock, int *sfd) { struct http *hp; char *s, *q; int retval; (void)sfd; ALLOC_OBJ(hp, HTTP_MAGIC); AN(hp); hp->fd = sock; hp->timeout = 15000; hp->nrxbuf = 2048*1024; hp->vsb = VSB_new_auto(); hp->rxbuf = malloc(hp->nrxbuf); /* XXX */ hp->sfd = sfd; hp->vl = vl; hp->gziplevel = 0; hp->gzipresidual = -1; AN(hp->rxbuf); AN(hp->vsb); s = strdup(spec); q = strchr(s, '\0'); assert(q > s); AN(s); parse_string(s, http_cmds, hp, vl); retval = hp->fd; VSB_delete(hp->vsb); free(hp->rxbuf); free(hp); return (retval); }
struct vep_state * VEP_Init(struct vfp_ctx *vc, const struct http *req, vep_callback_t *cb, void *cb_priv) { struct vep_state *vep; CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC); CHECK_OBJ_NOTNULL(req, HTTP_MAGIC); vep = WS_Alloc(vc->http->ws, sizeof *vep); AN(vep); INIT_OBJ(vep, VEP_MAGIC); vep->url = req->hd[HTTP_HDR_URL].b; vep->vc = vc; vep->vsb = VSB_new_auto(); AN(vep->vsb); if (cb != NULL) { vep->dogzip = 1; /* XXX */ VSB_printf(vep->vsb, "%c", VEC_GZ); vep->cb = cb; vep->cb_priv = cb_priv; } else { vep->cb = vep_default_cb; vep->cb_priv = &vep->cb_x; } vep->state = VEP_START; vep->crc = crc32(0L, Z_NULL, 0); vep->crcp = crc32(0L, Z_NULL, 0); vep->startup = 1; return (vep); }
static void vbp_build_req(struct vbp_target *vt, const struct vrt_backend_probe *vbp, const struct backend *be) { struct vsb *vsb; vsb = VSB_new_auto(); AN(vsb); VSB_clear(vsb); if (vbp->request != NULL) { VSB_cat(vsb, vbp->request); } else { VSB_printf(vsb, "GET %s HTTP/1.1\r\n", vbp->url != NULL ? vbp->url : "/"); if (be->hosthdr != NULL) VSB_printf(vsb, "Host: %s\r\n", be->hosthdr); VSB_printf(vsb, "Connection: close\r\n"); VSB_printf(vsb, "\r\n"); } AZ(VSB_finish(vsb)); vt->req = strdup(VSB_data(vsb)); AN(vt->req); vt->req_len = VSB_len(vsb); VSB_destroy(&vsb); }
static enum req_fsm_nxt cnt_synth(struct worker *wrk, struct req *req) { char date[40]; struct http *h; double now; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC); wrk->stats.s_synth++; now = W_TIM_real(wrk); VSLb_ts_req(req, "Process", now); if (req->err_code < 100 || req->err_code > 999) req->err_code = 501; HTTP_Setup(req->resp, req->ws, req->vsl, SLT_RespMethod); h = req->resp; VTIM_format(now, date); http_PrintfHeader(h, "Date: %s", date); http_SetHeader(h, "Server: Varnish"); http_PrintfHeader(req->resp, "X-Varnish: %u", VXID(req->vsl->wid)); http_PutResponse(h, "HTTP/1.1", req->err_code, req->err_reason); AZ(req->synth_body); req->synth_body = VSB_new_auto(); AN(req->synth_body); VCL_synth_method(req->vcl, wrk, req, NULL, req->http->ws); http_Unset(h, H_Content_Length); AZ(VSB_finish(req->synth_body)); if (wrk->handling == VCL_RET_RESTART) { HTTP_Setup(h, req->ws, req->vsl, SLT_RespMethod); VSB_delete(req->synth_body); req->synth_body = NULL; req->req_step = R_STP_RESTART; return (REQ_FSM_MORE); } assert(wrk->handling == VCL_RET_DELIVER); if (http_HdrIs(req->resp, H_Connection, "close")) req->doclose = SC_RESP_CLOSE; V1D_Deliver_Synth(req); VSLb_ts_req(req, "Resp", W_TIM_real(wrk)); VSB_delete(req->synth_body); req->synth_body = NULL; req->err_code = 0; req->err_reason = NULL; return (REQ_FSM_DONE); }
static int h_order(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len, unsigned spec, const char *ptr, uint64_t bm) { char type; struct vlog_priv_t *vlog = priv; /* XXX: Just ignore any fd not inside the bitmap */ if (fd >= sizeof vlog->bitmap / sizeof vlog->bitmap[0]) return (0); vlog->bitmap[fd] |= bm; type = (spec & VSL_S_CLIENT) ? 'c' : (spec & VSL_S_BACKEND) ? 'b' : '-'; if (!(spec & (VSL_S_CLIENT|VSL_S_BACKEND))) { (void)local_print(vlog, tag, fd, len, spec, ptr, bm); return (0); } if (vlog->ob[fd] == NULL) { vlog->ob[fd] = VSB_new_auto(); assert(vlog->ob[fd] != NULL); } if ((tag == SLT_BackendOpen || tag == SLT_SessionOpen || (tag == SLT_ReqStart && vlog->last[fd] != SLT_SessionOpen && vlog->last[fd] != SLT_VCL_acl) || (tag == SLT_BackendXID && vlog->last[fd] != SLT_BackendOpen)) && VSB_len(vlog->ob[fd]) != 0) { /* * This is the start of a new request, yet we haven't seen * the end of the previous one. Spit it out anyway before * starting on the new one. */ if (vlog->last[fd] != SLT_SessionClose) VSB_printf(vlog->ob[fd], "{ \"fd\": \"%d\"," "\"tag\": \"%s\", \"type\":\"%c\"," "\"value\":\"%s\"},\n", fd, "Interrupted", type, VSL_tags[tag]); h_order_finish(vlog, fd); } vlog->last[fd] = tag; print_entry(vlog, fd, tag, type, ptr, len); switch (tag) { case SLT_ReqEnd: case SLT_BackendClose: case SLT_BackendReuse: case SLT_StatSess: h_order_finish(vlog, fd); break; default: break; } return (0); }
void mgt_sandbox_init(void) { struct passwd *pwd; struct group *grp; struct vsb *sb; unsigned subs; /* Pick a sandbox */ #ifdef HAVE_SETPPRIV mgt_sandbox = mgt_sandbox_solaris; #else mgt_sandbox = mgt_sandbox_unix; #endif /* Test it */ sb = VSB_new_auto(); subs = VSUB_run(sb, run_sandbox_test, NULL, "SANDBOX-test", 10); VSB_delete(sb); if (subs) { MGT_complain(C_SECURITY, "Platform-specific sandbox failed - sandboxing disabled"); MGT_complain(C_SECURITY, "Varnish runs with elevated privileges"); mgt_sandbox = mgt_sandbox_null; } MCF_AddParams(mgt_parspec_sandbox); /* * If we have nobody/nogroup, use them as defaults for sandboxes, * else fall back to whoever we run as. */ if (getpwnam("nobody") != NULL) { MCF_SetDefault("user", "nobody"); } else { pwd = getpwuid(getuid()); if (pwd == NULL) ARGV_ERR("Neither user 'nobody' or my uid (%jd)" " found in password database.\n", (intmax_t)getuid()); MCF_SetDefault("user", pwd->pw_name); } endpwent(); if (getgrnam("nogroup") != NULL) { MCF_SetDefault("group", "nogroup"); } else { grp = getgrgid(getgid()); if (grp == NULL) ARGV_ERR("Neither group 'nogroup' or my gid (%jd)" " found in password database.\n", (intmax_t)getgid()); MCF_SetDefault("group", grp->gr_name); } endgrent(); }
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 vstat_init_ctx(struct agent_core_t *core, struct vstat_thread_ctx_t *t_ctx) { t_ctx->vd = VSM_New(); t_ctx->vsb = VSB_new_auto(); t_ctx->curl = ipc_register(core,"curl"); t_ctx->logger = ipc_register(core,"logger"); if (core->config->n_arg) VSC_Arg(t_ctx->vd, 'n', core->config->n_arg); }
static struct varnish * varnish_new(const char *name) { struct varnish *v; struct vsb *vsb; char buf[1024]; AN(name); ALLOC_OBJ(v, VARNISH_MAGIC); AN(v); REPLACE(v->name, name); v->vl = vtc_logopen(name); AN(v->vl); bprintf(buf, "${tmpdir}/%s", name); vsb = macro_expand(v->vl, buf); AN(vsb); v->workdir = strdup(VSB_data(vsb)); AN(v->workdir); VSB_delete(vsb); bprintf(buf, "rm -rf %s ; mkdir -p %s ; echo ' %ld' > %s/_S", v->workdir, v->workdir, random(), v->workdir); AZ(system(buf)); if (*v->name != 'v') vtc_log(v->vl, 0, "Varnish name must start with 'v'"); v->args = VSB_new_auto(); v->storage = VSB_new_auto(); VSB_printf(v->storage, "-sfile,%s,10M", v->workdir); AZ(VSB_finish(v->storage)); v->cli_fd = -1; VTAILQ_INSERT_TAIL(&varnishes, v, list); return (v); }
static struct expr * vcc_new_expr(void) { struct expr *e; /* XXX: use TlAlloc() ? */ ALLOC_OBJ(e, EXPR_MAGIC); AN(e); e->vsb = VSB_new_auto(); e->fmt = VOID; return (e); }
char * mgt_VccCompile(struct cli *cli, const char *vclname, const char *vclsrc, int C_flag) { struct vcc_priv vp; struct vsb *sb; unsigned status; AN(cli); sb = VSB_new_auto(); XXXAN(sb); INIT_OBJ(&vp, VCC_PRIV_MAGIC); vp.src = vclsrc; VSB_printf(sb, "./vcl_%s.c", vclname); AZ(VSB_finish(sb)); vp.srcfile = strdup(VSB_data(sb)); AN(vp.srcfile); VSB_clear(sb); VSB_printf(sb, "./vcl_%s.so", vclname); AZ(VSB_finish(sb)); vp.libfile = strdup(VSB_data(sb)); AN(vp.srcfile); VSB_clear(sb); status = mgt_vcc_compile(&vp, sb, C_flag); AZ(VSB_finish(sb)); if (VSB_len(sb) > 0) VCLI_Out(cli, "%s", VSB_data(sb)); VSB_delete(sb); (void)unlink(vp.srcfile); free(vp.srcfile); if (status || C_flag) { (void)unlink(vp.libfile); free(vp.libfile); if (!C_flag) { VCLI_Out(cli, "VCL compilation failed"); VCLI_SetResult(cli, CLIS_PARAM); } return(NULL); } VCLI_Out(cli, "VCL compiled.\n"); return (vp.libfile); }
struct vtclog * vtc_logopen(const char *id) { struct vtclog *vl; ALLOC_OBJ(vl, VTCLOG_MAGIC); AN(vl); vl->id = id; vl->vsb = VSB_new_auto(); AZ(pthread_mutex_init(&vl->mtx, NULL)); AZ(pthread_setspecific(log_key, vl)); return (vl); }
/* * Takes unformatted vcl.list as input and returns a vsb with the json * version. The caller must clean up the vsb. */ static struct vsb * vcl_list_json(char *raw) { struct vcl_list tmp; int ret; char *pos; char ref_temp[10]; const char *sep = ""; struct vsb *vsb; vsb = VSB_new_auto(); pos = raw; VSB_printf(vsb,"{\n\t\"vcls\": ["); while (1) { if (pos[30] != ' ') ret = sscanf(pos, "%10s %4s/%4s %6s %s\n", tmp.available, tmp.state, tmp.temp, ref_temp, tmp.name); else ret = sscanf(pos, "%10s %4s/%4s %s\n", tmp.available, tmp.state, tmp.temp, tmp.name); if (ret <= 0) { /* * FIXME: This should go into the logger */ printf("Confused! line: %s\n", pos); VSB_clear(vsb); return (vsb); } assert(ret>0); VSB_printf(vsb, "%s\n" "\t\t{\n" "\t\t\t\"name\": \"%s\",\n" "\t\t\t\"status\": \"%s\",\n" "\t\t\t\"temp\": \"%s\",\n" "\t\t\t\"mode\": \"%s\"\n" "\t\t}", sep, tmp.name, tmp.available, tmp.temp, tmp.state); sep = ","; pos = strstr(pos,"\n"); if (pos == NULL) break; pos += 1; if (pos[0] == '\0' || pos[0] == '\n') break; } VSB_printf(vsb,"\n\t]\n}\n"); return vsb; }
static void varnish_vclbackend(struct varnish *v, const char *vcl) { struct vsb *vsb, *vsb2; enum VCLI_status_e u; if (v->cli_fd < 0) varnish_launch(v); if (vtc_error) return; vsb = VSB_new_auto(); AN(vsb); vsb2 = VSB_new_auto(); AN(vsb2); cmd_server_genvcl(vsb2); AZ(VSB_finish(vsb2)); VSB_printf(vsb, "vcl.inline vcl%d << %s\n%s\n%s\n%s\n", ++v->vcl_nbr, NONSENSE, VSB_data(vsb2), vcl, NONSENSE); AZ(VSB_finish(vsb)); u = varnish_ask_cli(v, VSB_data(vsb), NULL); if (u != CLIS_OK) { VSB_delete(vsb); VSB_delete(vsb2); vtc_log(v->vl, 0, "FAIL VCL does not compile"); return; } VSB_clear(vsb); VSB_printf(vsb, "vcl.use vcl%d", v->vcl_nbr); AZ(VSB_finish(vsb)); u = varnish_ask_cli(v, VSB_data(vsb), NULL); assert(u == CLIS_OK); VSB_delete(vsb); VSB_delete(vsb2); }
static void mcf_askchild(struct cli *cli, const char * const *av, void *priv) { int i; char *q; unsigned u; struct vsb *vsb; (void)priv; /* * Command not recognized in master, try cacher if it is * running. */ if (cli_o <= 0) { if (!strcmp(av[1], "help")) { if (av[2] == NULL || strcmp(av[2], "-j")) VCLI_Out(cli, "No help from child, (not running).\n"); return; } VCLI_SetResult(cli, CLIS_UNKNOWN); VCLI_Out(cli, "Unknown request in manager process " "(child not running).\n" "Type 'help' for more info."); return; } vsb = VSB_new_auto(); for (i = 1; av[i] != NULL; i++) { VSB_quote(vsb, av[i], strlen(av[i]), 0); VSB_putc(vsb, ' '); } VSB_putc(vsb, '\n'); AZ(VSB_finish(vsb)); i = write(cli_o, VSB_data(vsb), VSB_len(vsb)); if (i != VSB_len(vsb)) { VSB_destroy(&vsb); VCLI_SetResult(cli, CLIS_COMMS); VCLI_Out(cli, "CLI communication error"); MGT_Child_Cli_Fail(); return; } VSB_destroy(&vsb); if (VCLI_ReadResult(cli_i, &u, &q, mgt_param.cli_timeout)) MGT_Child_Cli_Fail(); VCLI_SetResult(cli, u); VCLI_Out(cli, "%s", q); free(q); }
struct ban_proto * BAN_Build(void) { struct ban_proto *bp; ALLOC_OBJ(bp, BAN_PROTO_MAGIC); if (bp == NULL) return (bp); bp->vsb = VSB_new_auto(); if (bp->vsb == NULL) { FREE_OBJ(bp); return (NULL); } return (bp); }
void mgt_cli_telnet(const char *T_arg) { struct vss_addr **ta; int i, n, sock, good; struct telnet *tn; char *p; struct vsb *vsb; char abuf[VTCP_ADDRBUFSIZE]; char pbuf[VTCP_PORTBUFSIZE]; n = VSS_resolve(T_arg, NULL, &ta); if (n == 0) { REPORT(LOG_ERR, "-T %s Could not be resolved\n", T_arg); exit(2); } good = 0; vsb = VSB_new_auto(); XXXAN(vsb); for (i = 0; i < n; ++i) { sock = VSS_listen(ta[i], 10); if (sock < 0) continue; VTCP_myname(sock, abuf, sizeof abuf, pbuf, sizeof pbuf); VSB_printf(vsb, "%s %s\n", abuf, pbuf); good++; tn = telnet_new(sock); tn->ev = vev_new(); XXXAN(tn->ev); tn->ev->fd = sock; tn->ev->fd_flags = POLLIN; tn->ev->callback = telnet_accept; AZ(vev_add(mgt_evb, tn->ev)); free(ta[i]); ta[i] = NULL; } free(ta); if (good == 0) { REPORT(LOG_ERR, "-T %s could not be listened on.", T_arg); exit(2); } AZ(VSB_finish(vsb)); /* Save in shmem */ p = VSM_Alloc(VSB_len(vsb) + 1, "Arg", "-T", ""); AN(p); strcpy(p, VSB_data(vsb)); VSB_delete(vsb); }
static struct vsb * sock_id(const char *pfx, int fd) { struct vsb *vsb; char abuf1[VTCP_ADDRBUFSIZE], abuf2[VTCP_ADDRBUFSIZE]; char pbuf1[VTCP_PORTBUFSIZE], pbuf2[VTCP_PORTBUFSIZE]; vsb = VSB_new_auto(); AN(vsb); VTCP_myname(fd, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1); VTCP_hisname(fd, abuf2, sizeof abuf2, pbuf2, sizeof pbuf2); VSB_printf(vsb, "%s %s %s %s %s", pfx, abuf2, pbuf2, abuf1, pbuf1); AZ(VSB_finish(vsb)); return (vsb); }
run_cc(void *priv) { struct vcc_priv *vp; struct vsb *sb; int pct; char *p; VJ_subproc(JAIL_SUBPROC_CC); CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC); AZ(chdir(vp->dir)); sb = VSB_new_auto(); AN(sb); for (p = mgt_cc_cmd, pct = 0; *p; ++p) { if (pct) { switch (*p) { case 's': VSB_cat(sb, VGC_SRC); break; case 'o': VSB_cat(sb, VGC_LIB); break; case '%': VSB_putc(sb, '%'); break; default: VSB_putc(sb, '%'); VSB_putc(sb, *p); break; } pct = 0; } else if (*p == '%') { pct = 1; } else { VSB_putc(sb, *p); } } if (pct) VSB_putc(sb, '%'); AZ(VSB_finish(sb)); (void)umask(027); (void)execl("/bin/sh", "/bin/sh", "-c", VSB_data(sb), (char*)0); VSB_destroy(&sb); // For flexelint }
int mgt_cli_askchild(unsigned *status, char **resp, const char *fmt, ...) { int i, j; va_list ap; unsigned u; if (cli_buf == NULL) { cli_buf = VSB_new_auto(); AN(cli_buf); } else { VSB_clear(cli_buf); } if (resp != NULL) *resp = NULL; if (status != NULL) *status = 0; if (cli_i < 0 || cli_o < 0) { if (status != NULL) *status = CLIS_CANT; return (CLIS_CANT); } va_start(ap, fmt); AZ(VSB_vprintf(cli_buf, fmt, ap)); va_end(ap); AZ(VSB_finish(cli_buf)); i = VSB_len(cli_buf); assert(i > 0 && VSB_data(cli_buf)[i - 1] == '\n'); j = write(cli_o, VSB_data(cli_buf), i); if (j != i) { if (status != NULL) *status = CLIS_COMMS; if (resp != NULL) *resp = strdup("CLI communication error"); MCH_Cli_Fail(); return (CLIS_COMMS); } if (VCLI_ReadResult(cli_i, &u, resp, mgt_param.cli_timeout)) MCH_Cli_Fail(); if (status != NULL) *status = u; return (u == CLIS_OK ? 0 : u); }
int vsl_diag(struct VSL_data *vsl, const char *fmt, ...) { va_list ap; CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC); AN(fmt); if (vsl->diag == NULL) vsl->diag = VSB_new_auto(); AN(vsl->diag); VSB_clear(vsl->diag); va_start(ap, fmt); VSB_vprintf(vsl->diag, fmt, ap); va_end(ap); AZ(VSB_finish(vsl->diag)); return (-1); }
static void mgt_panic_record(pid_t r) { char time_str[30]; if (child_panic != NULL) VSB_delete(child_panic); child_panic = VSB_new_auto(); AN(child_panic); VTIM_format(VTIM_real(), time_str); VSB_printf(child_panic, "Last panic at: %s\n", time_str); VSB_quote(child_panic, heritage.panic_str, strnlen(heritage.panic_str, heritage.panic_str_len), VSB_QUOTE_NONL); AZ(VSB_finish(child_panic)); MGT_complain(C_ERR, "Child (%jd) %s", (intmax_t)r, VSB_data(child_panic)); }
static void cmd_err_shell(CMD_ARGS) { (void)priv; (void)cmd; struct vsb *vsb; FILE *fp; int r, c; if (av == NULL) return; AN(av[1]); AN(av[2]); AZ(av[3]); vsb = VSB_new_auto(); AN(vsb); vtc_dump(vl, 4, "cmd", av[2], -1); fp = popen(av[2], "r"); if (fp == NULL) vtc_log(vl, 0, "popen fails: %s", strerror(errno)); do { c = getc(fp); if (c != EOF) VSB_putc(vsb, c); } while (c != EOF); r = pclose(fp); vtc_log(vl, 4, "Status = %d", WEXITSTATUS(r)); if (WIFSIGNALED(r)) vtc_log(vl, 4, "Signal = %d", WTERMSIG(r)); if (WEXITSTATUS(r) == 0) { vtc_log(vl, 0, "expected error from shell"); } AZ(VSB_finish(vsb)); vtc_dump(vl, 4, "stdout", VSB_data(vsb), VSB_len(vsb)); if (strstr(VSB_data(vsb), av[1]) == NULL) vtc_log(vl, 0, "Did not find expected string: (\"%s\")", av[1]); else vtc_log(vl, 4, "Found expected string: (\"%s\")", av[1]); VSB_delete(vsb); }
void VEP_Init(struct worker *wrk, vep_callback_t *cb) { struct vep_state *vep; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); AZ(wrk->busyobj->vep); vep = (void*)WS_Alloc(wrk->ws, sizeof *vep); AN(vep); memset(vep, 0, sizeof *vep); vep->magic = VEP_MAGIC; vep->wrk = wrk; vep->vsb = VSB_new_auto(); AN(vep->vsb); wrk->busyobj->vep = vep; if (cb != NULL) { vep->dogzip = 1; /* XXX */ VSB_printf(vep->vsb, "%c", VEC_GZ); vep->cb = cb; } else { vep->cb = vep_default_cb; } vep->state = VEP_START; vep->crc = crc32(0L, Z_NULL, 0); vep->crcp = crc32(0L, Z_NULL, 0); /* * We must force the GZIP header out as a SKIP string, otherwise * an object starting with <esi:include would have its GZIP header * appear after the included object (e000026.vtc) */ vep->startup = 1; vep->ver_p = ""; vep->last_mark = SKIP; vep_mark_common(vep, vep->ver_p, VERBATIM); vep->startup = 0; }
int http_process(struct vtclog *vl, const char *spec, int sock, int *sfd) { struct http *hp; int retval; (void)sfd; ALLOC_OBJ(hp, HTTP_MAGIC); AN(hp); hp->fd = sock; hp->timeout = vtc_maxdur * 1000 / 2; hp->nrxbuf = 2048*1024; hp->rxbuf = malloc(hp->nrxbuf); /* XXX */ AN(hp->rxbuf); hp->vsb = VSB_new_auto(); AN(hp->vsb); hp->sfd = sfd; hp->rem_ip = malloc(VTCP_ADDRBUFSIZE); AN(hp->rem_ip); hp->rem_port = malloc(VTCP_PORTBUFSIZE); AN(hp->rem_port); hp->vl = vl; hp->gziplevel = 0; hp->gzipresidual = -1; VTCP_hisname(sock, hp->rem_ip, VTCP_ADDRBUFSIZE, hp->rem_port, VTCP_PORTBUFSIZE); parse_string(spec, http_cmds, hp, vl); retval = hp->fd; VSB_destroy(&hp->vsb); free(hp->rxbuf); free(hp->rem_ip); free(hp->rem_port); free(hp); return (retval); }
static void backends_json(struct http_request *request, struct vbackends_priv_t *vbackends) { struct vsb *json; struct ipc_ret_t vret; ipc_run(vbackends->vadmin, &vret, "backend.list"); if (vret.status == 200) { json = VSB_new_auto(); assert(json); vbackends_show_json(json, vret.answer); AZ(VSB_finish(json)); struct http_response *resp = http_mkresp(request->connection, 200, VSB_data(json)); http_add_header(resp,"Content-Type","application/json"); send_response(resp); VSB_delete(json); http_free_resp(resp); } else http_reply(request->connection, 500, vret.answer); free(vret.answer); }
void mgt_cli_telnet(const char *T_arg) { int error; const char *err; struct vsb *vsb; AN(T_arg); vsb = VSB_new_auto(); AN(vsb); error = VSS_resolver(T_arg, NULL, mct_callback, vsb, &err); if (err != NULL) ARGV_ERR("Could resolve -T argument to address\n\t%s\n", err); AZ(error); AZ(VSB_finish(vsb)); if (VSB_len(vsb) == 0) ARGV_ERR("-T %s could not be listened on.", T_arg); /* Save in shmem */ mgt_SHM_static_alloc(VSB_data(vsb), VSB_len(vsb) + 1, "Arg", "-T", ""); VSB_destroy(&vsb); }
static void run_vcc(void *priv) { char *csrc; struct vsb *sb; struct vcc_priv *vp; int fd, i, l; CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC); VJ_subproc(JAIL_SUBPROC_VCC); sb = VSB_new_auto(); XXXAN(sb); VCC_VCL_dir(vcc, mgt_vcl_dir); VCC_VMOD_dir(vcc, mgt_vmod_dir); VCC_Err_Unref(vcc, mgt_vcc_err_unref); VCC_Allow_InlineC(vcc, mgt_vcc_allow_inline_c); VCC_Unsafe_Path(vcc, mgt_vcc_unsafe_path); csrc = VCC_Compile(vcc, sb, vp->src); AZ(VSB_finish(sb)); if (VSB_len(sb)) printf("%s", VSB_data(sb)); VSB_delete(sb); if (csrc == NULL) exit(2); fd = open(vp->srcfile, O_WRONLY|O_TRUNC|O_CREAT, 0600); if (fd < 0) { fprintf(stderr, "Cannot open %s", vp->srcfile); exit(2); } l = strlen(csrc); i = write(fd, csrc, l); if (i != l) { fprintf(stderr, "Cannot write %s", vp->srcfile); exit(2); } AZ(close(fd)); free(csrc); exit(0); }