static void vsmw_delseg(struct vsmw *vsmw, struct vsmwseg *seg, int fixidx) { char *t = NULL; ssize_t s; int fd; CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC); CHECK_OBJ_NOTNULL(seg, VSMWSEG_MAGIC); VTAILQ_REMOVE(&vsmw->segs, seg, list); REPLACE(seg->class, NULL); REPLACE(seg->id, NULL); FREE_OBJ(seg); if (fixidx) { vsmw_mkent(vsmw, vsmw->idx); REPLACE(t, VSB_data(vsmw->vsb)); AN(t); fd = openat(vsmw->vdirfd, t, O_WRONLY|O_CREAT|O_EXCL, vsmw->mode); assert(fd >= 0); vsmw_idx_head(vsmw, fd); VSB_clear(vsmw->vsb); VTAILQ_FOREACH(seg, &vsmw->segs, list) vsmw_fmt_index(vsmw, seg); AZ(VSB_finish(vsmw->vsb)); s = write(fd, VSB_data(vsmw->vsb), VSB_len(vsmw->vsb)); assert(s == VSB_len(vsmw->vsb)); AZ(close(fd)); AZ(renameat(vsmw->vdirfd, t, vsmw->vdirfd, vsmw->idx)); REPLACE(t, NULL); } }
static void http_write(const struct http *hp, int lvl, const char *pfx) { int l; AZ(VSB_finish(hp->vsb)); vtc_dump(hp->vl, lvl, pfx, VSB_data(hp->vsb), VSB_len(hp->vsb)); l = write(hp->fd, VSB_data(hp->vsb), VSB_len(hp->vsb)); if (l != VSB_len(hp->vsb)) vtc_log(hp->vl, hp->fatal, "Write failed: (%d vs %d) %s", l, VSB_len(hp->vsb), strerror(errno)); }
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); }
run_vcc(void *priv) { struct vsb *csrc; struct vsb *sb = NULL; struct vcc_priv *vp; int fd, i, l; struct vcc *vcc; struct stevedore *stv; VJ_subproc(JAIL_SUBPROC_VCC); CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC); AZ(chdir(vp->dir)); vcc = VCC_New(); AN(vcc); VCC_Builtin_VCL(vcc, builtin_vcl); VCC_VCL_path(vcc, mgt_vcl_path); VCC_VMOD_path(vcc, mgt_vmod_path); 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); STV_Foreach(stv) VCC_Predef(vcc, "VCL_STEVEDORE", stv->ident); mgt_vcl_export_labels(vcc); csrc = VCC_Compile(vcc, &sb, vp->vclsrc, vp->vclsrcfile); AZ(VSB_finish(sb)); if (VSB_len(sb)) printf("%s", VSB_data(sb)); VSB_destroy(&sb); if (csrc == NULL) exit(2); fd = open(VGC_SRC, O_WRONLY|O_TRUNC|O_CREAT, 0600); if (fd < 0) { fprintf(stderr, "VCC cannot open %s", vp->csrcfile); exit(2); } l = VSB_len(csrc); i = write(fd, VSB_data(csrc), l); if (i != l) { fprintf(stderr, "VCC cannot write %s", vp->csrcfile); exit(2); } closefd(&fd); VSB_destroy(&csrc); exit(0); }
static void vsmw_addseg(struct vsmw *vsmw, struct vsmwseg *seg) { int fd; ssize_t s; VTAILQ_INSERT_TAIL(&vsmw->segs, seg, list); fd = openat(vsmw->vdirfd, vsmw->idx, O_APPEND | O_WRONLY); assert(fd >= 0); VSB_clear(vsmw->vsb); vsmw_fmt_index(vsmw, seg); AZ(VSB_finish(vsmw->vsb)); s = write(fd, VSB_data(vsmw->vsb), VSB_len(vsmw->vsb)); assert(s == VSB_len(vsmw->vsb)); AZ(close(fd)); }
struct vsb * VEP_Finish(struct vep_state *vep) { ssize_t l, lcb; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); AZ(vep->include_src); AZ(vep->attr_vsb); if (vep->o_pending) vep_mark_common(vep, vep->ver_p, vep->last_mark); if (vep->o_wait > 0) { lcb = vep->cb(vep->vc, vep->cb_priv, 0, VGZ_ALIGN); vep_emit_common(vep, lcb - vep->o_last, vep->last_mark); } // NB: We don't account for PAD+SUM+LEN in gzip'ed objects (void)vep->cb(vep->vc, vep->cb_priv, 0, VGZ_FINISH); AZ(VSB_finish(vep->vsb)); l = VSB_len(vep->vsb); if (vep->esi_found && l > 0) return (vep->vsb); VSB_destroy(&vep->vsb); return (NULL); }
struct vsb * VEP_Finish(const struct sess *sp) { struct vep_state *vep; ssize_t l, lcb; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); vep = sp->wrk->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); if (vep->o_pending) vep_mark_common(vep, vep->ver_p, vep->last_mark); if (vep->o_wait > 0) { lcb = vep->cb(vep->sp, 0, VGZ_ALIGN); vep_emit_common(vep, lcb - vep->o_last, vep->last_mark); } (void)vep->cb(vep->sp, 0, VGZ_FINISH); sp->wrk->vep = NULL; AZ(VSB_finish(vep->vsb)); l = VSB_len(vep->vsb); if (vep->esi_found && l > 0) return (vep->vsb); VSB_delete(vep->vsb); return (NULL); }
vfp_esi_end(struct sess *sp) { struct vsb *vsb; struct vef_priv *vef; ssize_t l; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); AN(sp->wrk->vep); vsb = VEP_Finish(sp); if (vsb != NULL) { l = VSB_len(vsb); assert(l > 0); /* XXX: This is a huge waste of storage... */ sp->obj->esidata = STV_alloc(sp, l); XXXAN(sp->obj->esidata); memcpy(sp->obj->esidata->ptr, VSB_data(vsb), l); sp->obj->esidata->len = l; VSB_delete(vsb); } if (sp->wrk->vgz_rx != NULL) VGZ_Destroy(&sp->wrk->vgz_rx); if (sp->wrk->vef_priv != NULL) { vef = sp->wrk->vef_priv; CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); sp->wrk->vef_priv = NULL; VGZ_UpdateObj(vef->vgz, sp->obj); VGZ_Destroy(&vef->vgz); XXXAZ(vef->error); FREE_OBJ(vef); } return (0); }
static int vbp_write_proxy_v1(struct vbp_target *vt, int *sock) { char buf[105]; /* maximum size for a TCP6 PROXY line with null char */ char addr[VTCP_ADDRBUFSIZE]; char port[VTCP_PORTBUFSIZE]; struct sockaddr_storage ss; struct vsb vsb; socklen_t l; VTCP_myname(*sock, addr, sizeof addr, port, sizeof port); AN(VSB_new(&vsb, buf, sizeof buf, VSB_FIXEDLEN)); l = sizeof ss; AZ(getsockname(*sock, (void *)&ss, &l)); if (ss.ss_family == AF_INET || ss.ss_family == AF_INET6) { VSB_printf(&vsb, "PROXY %s %s %s %s %s\r\n", ss.ss_family == AF_INET ? "TCP4" : "TCP6", addr, addr, port, port); } else VSB_cat(&vsb, "PROXY UNKNOWN\r\n"); AZ(VSB_finish(&vsb)); return (vbp_write(vt, sock, VSB_data(&vsb), VSB_len(&vsb))); }
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 unsigned int vstat_reply(struct http_request *request, const char *arg, void *data) { struct vstat_priv_t *vstat; struct agent_core_t *core = data; struct http_response *resp; (void)arg; GET_PRIV(core, vstat); if (check_reopen(&vstat->http)) { http_reply(request->connection, 500, "Couldn't open shmlog"); return 0; } do_json(vstat->http.vd, vstat->http.vsb); resp = http_mkresp(request->connection, 200, NULL); resp->data = VSB_data(vstat->http.vsb); resp->ndata = VSB_len(vstat->http.vsb); http_add_header(resp,"Content-Type","application/json"); send_response(resp); http_free_resp(resp); VSB_clear(vstat->http.vsb); return 0; }
struct vsb * VEP_Finish(const struct worker *wrk) { struct vep_state *vep; ssize_t l, lcb; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); vep = wrk->busyobj->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); if (vep->o_pending) vep_mark_common(vep, vep->ver_p, vep->last_mark); if (vep->o_wait > 0) { lcb = vep->cb(vep->wrk, 0, VGZ_ALIGN); vep_emit_common(vep, lcb - vep->o_last, vep->last_mark); } (void)vep->cb(vep->wrk, 0, VGZ_FINISH); wrk->busyobj->vep = NULL; AZ(VSB_finish(vep->vsb)); l = VSB_len(vep->vsb); if (vep->esi_found && l > 0) return (vep->vsb); VSB_delete(vep->vsb); return (NULL); }
struct vsb * VEP_Finish(struct busyobj *bo) { struct vep_state *vep; ssize_t l, lcb; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); vep = bo->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); assert(vep->bo == bo); if (vep->o_pending) vep_mark_common(vep, vep->ver_p, vep->last_mark); if (vep->o_wait > 0) { lcb = vep->cb(vep->bo, 0, VGZ_ALIGN); vep_emit_common(vep, lcb - vep->o_last, vep->last_mark); } (void)vep->cb(vep->bo, 0, VGZ_FINISH); bo->vep = NULL; AZ(VSB_finish(vep->vsb)); l = VSB_len(vep->vsb); if (vep->esi_found && l > 0) return (vep->vsb); VSB_delete(vep->vsb); return (NULL); }
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); }
static void cli_cb_after(const struct cli *cli) { ASSERT_CLI(); Lck_Unlock(&cli_mtx); VSL(SLT_CLI, 0, "Wr %03u %zd %s", cli->result, VSB_len(cli->sb), VSB_data(cli->sb)); }
/*lint -e{818} cli could be const */ int VCLI_Overflow(struct cli *cli) { CHECK_OBJ_NOTNULL(cli, CLI_MAGIC); if (cli->result == CLIS_TRUNCATED || VSB_len(cli->sb) >= *cli->limit) return (1); return (0); }
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 h_order_finish(struct vlog_priv_t *vlog, int fd) { assert(VSB_finish(vlog->ob[fd]) == 0); if (VSB_len(vlog->ob[fd]) > 1 && VSL_Matched(vlog->vd, vlog->bitmap[fd])) { VSB_printf(vlog->answer,"%s", VSB_data(vlog->ob[fd])); } vlog->bitmap[fd] = 0; VSB_clear(vlog->ob[fd]); }
static void ban_add_lump(const struct ban_proto *bp, const void *p, uint32_t len) { uint8_t buf[sizeof len]; buf[0] = 0xff; while (VSB_len(bp->vsb) & PALGN) VSB_putc(bp->vsb, buf[0]); vbe32enc(buf, len); VSB_bcat(bp->vsb, buf, sizeof buf); VSB_bcat(bp->vsb, p, len); }
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); }
vfp_esi_end(struct busyobj *bo) { struct vsb *vsb; struct vef_priv *vef; ssize_t l; int retval = 0; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); AN(bo->vep); if (bo->state == BOS_FAILED) retval = -1; if (bo->vgz_rx != NULL && VGZ_Destroy(&bo->vgz_rx) != VGZ_END) retval = VFP_Error(bo, "Gunzip+ESI Failed at the very end"); vsb = VEP_Finish(bo); if (vsb != NULL) { if (!retval) { l = VSB_len(vsb); assert(l > 0); /* XXX: This is a huge waste of storage... */ bo->fetch_obj->esidata = STV_alloc(bo, l); if (bo->fetch_obj->esidata != NULL) { memcpy(bo->fetch_obj->esidata->ptr, VSB_data(vsb), l); bo->fetch_obj->esidata->len = l; } else { retval = VFP_Error(bo, "Could not allocate storage for esidata"); } } VSB_delete(vsb); } vef = bo->vef_priv; bo->vef_priv = NULL; CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); if (vef->vgz != NULL) { VGZ_UpdateObj(vef->vgz, bo->fetch_obj); if (VGZ_Destroy(&vef->vgz) != VGZ_END) retval = VFP_Error(bo, "ESI+Gzip Failed at the very end"); } if (vef->ibuf != NULL) free(vef->ibuf); if (vef->ibuf2 != NULL) free(vef->ibuf2); FREE_OBJ(vef); return (retval); }
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); }
vfp_esi_end(struct worker *wrk) { struct vsb *vsb; struct vef_priv *vef; struct busyobj *bo; ssize_t l; int retval; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); bo = wrk->busyobj; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); AN(bo->vep); retval = bo->fetch_failed; if (bo->vgz_rx != NULL && VGZ_Destroy(&bo->vgz_rx, -1) != VGZ_END) retval = FetchError(wrk, "Gunzip+ESI Failed at the very end"); vsb = VEP_Finish(wrk); if (vsb != NULL) { if (!retval) { l = VSB_len(vsb); assert(l > 0); /* XXX: This is a huge waste of storage... */ bo->fetch_obj->esidata = STV_alloc(wrk, l); if (bo->fetch_obj->esidata != NULL) { memcpy(bo->fetch_obj->esidata->ptr, VSB_data(vsb), l); bo->fetch_obj->esidata->len = l; } else { retval = FetchError(wrk, "Could not allocate storage for esidata"); } } VSB_delete(vsb); } vef = bo->vef_priv; if (vef != NULL) { CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); bo->vef_priv = NULL; VGZ_UpdateObj(vef->vgz, bo->fetch_obj); if (VGZ_Destroy(&vef->vgz, -1) != VGZ_END) retval = FetchError(wrk, "ESI+Gzip Failed at the very end"); FREE_OBJ(vef); } return (retval); }
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 void vtc_log_emit(const struct vtclog *vl) { int l; l = VSB_len(vl->vsb); if (l == 0) return; AZ(pthread_mutex_lock(&vtclog_mtx)); assert(vtclog_left > l); memcpy(vtclog_buf,VSB_data(vl->vsb), l); vtclog_buf += l; *vtclog_buf = '\0'; vtclog_left -= l; AZ(pthread_mutex_unlock(&vtclog_mtx)); }
/*lint -e{818} cli could be const */ void VCLI_Out(struct cli *cli, const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (cli != NULL) { CHECK_OBJ_NOTNULL(cli, CLI_MAGIC); if (VSB_len(cli->sb) < *cli->limit) (void)VSB_vprintf(cli->sb, fmt, ap); else if (cli->result == CLIS_OK) cli->result = CLIS_TRUNCATED; } else { (void)vfprintf(stdout, fmt, ap); } va_end(ap); }
static void clean_order(struct vlog_priv_t *vlog) { unsigned u; for (u = 0; u < 65536; u++) { if (vlog->ob[u] == NULL) continue; assert(VSB_finish(vlog->ob[u]) == 0); if (VSB_len(vlog->ob[u]) > 1 && VSL_Matched(vlog->vd, vlog->bitmap[u])) { VSB_printf(vlog->answer,"%s\n", VSB_data(vlog->ob[u])); } vlog->flg[u] = 0; vlog->bitmap[u] = 0; VSB_clear(vlog->ob[u]); } }
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); }
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); }
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); }