void VRT_ban(struct sess *sp, char *cmds, ...) { char *a1, *a2, *a3; va_list ap; struct ban *b; int good; (void)sp; b = BAN_New(); va_start(ap, cmds); a1 = cmds; good = 0; while (a1 != NULL) { good = 0; a2 = va_arg(ap, char *); if (a2 == NULL) break; a3 = va_arg(ap, char *); if (a3 == NULL) break; if (BAN_AddTest(NULL, b, a1, a2, a3)) break; a1 = va_arg(ap, char *); good = 1; } if (!good) /* XXX: report error how ? */ BAN_Free(b); else BAN_Insert(b); }
static void ban_cleantail(void) { struct ban *b; do { Lck_Lock(&ban_mtx); b = VTAILQ_LAST(&ban_head, banhead_s); if (b != VTAILQ_FIRST(&ban_head) && b->refcount == 0) { if (b->flags & BANS_FLAG_COMPLETED) VSC_C_main->bans_completed--; if (b->flags & BANS_FLAG_OBJ) VSC_C_main->bans_obj--; if (b->flags & BANS_FLAG_REQ) VSC_C_main->bans_req--; VSC_C_main->bans--; VSC_C_main->bans_deleted++; VTAILQ_REMOVE(&ban_head, b, list); VSC_C_main->bans_persisted_fragmentation += ban_len(b->spec); ban_info(BI_DROP, b->spec, ban_len(b->spec)); } else { b = NULL; } Lck_Unlock(&ban_mtx); if (b != NULL) BAN_Free(b); } while (b != NULL); }
void VRT_ban_string(struct sess *sp, const char *str) { char *a1, *a2, *a3; char **av; struct ban *b; int good; int i; (void)sp; av = VAV_Parse(str, NULL, ARGV_NOESC); if (av[0] != NULL) { /* XXX: report error how ? */ VAV_Free(av); return; } b = BAN_New(); good = 0; for (i = 1; ;) { a1 = av[i++]; if (a1 == NULL) break; good = 0; a2 = av[i++]; if (a2 == NULL) break; a3 = av[i++]; if (a3 == NULL) break; if (BAN_AddTest(NULL, b, a1, a2, a3)) break; good = 1; if (av[i] == NULL) break; good = 0; if (strcmp(av[i++], "&&")) break; } if (!good) /* XXX: report error how ? */ BAN_Free(b); else BAN_Insert(b); VAV_Free(av); }
void VRT_ban_string(VRT_CTX, const char *str) { char *a1, *a2, *a3; char **av; struct ban *b; int i; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); AN(ctx->vsl); AN(str); b = BAN_New(); if (b == NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): Out of Memory"); return; } av = VAV_Parse(str, NULL, ARGV_NOESC); AN(av); if (av[0] != NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): %s", av[0]); VAV_Free(av); BAN_Free(b); return; } for (i = 0; ;) { a1 = av[++i]; if (a1 == NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): No ban conditions found."); break; } a2 = av[++i]; if (a2 == NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): Expected comparison operator."); break; } a3 = av[++i]; if (a3 == NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): Expected second operand."); break; } if (BAN_AddTest(b, a1, a2, a3) || av[++i] == NULL) { a1 = BAN_Insert(b); if (a1 != NULL) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): %s", a1); BAN_Free_Errormsg(a1); } break; } if (strcmp(av[i], "&&")) { VSLb(ctx->vsl, SLT_VCL_Error, "ban(): Expected && between conditions," " found \"%s\"", av[i]); break; } } VAV_Free(av); }
const char * BAN_Commit(struct ban_proto *bp) { struct ban *b, *bi; ssize_t ln; double t0; CHECK_OBJ_NOTNULL(bp, BAN_PROTO_MAGIC); AN(bp->vsb); if (ban_shutdown) return (ban_error(bp, "Shutting down")); AZ(VSB_finish(bp->vsb)); ln = VSB_len(bp->vsb); assert(ln >= 0); ALLOC_OBJ(b, BAN_MAGIC); if (b == NULL) return (ban_error(bp, ban_build_err_no_mem)); VTAILQ_INIT(&b->objcore); b->spec = malloc(ln + BANS_HEAD_LEN); if (b->spec == NULL) { free(b); return (ban_error(bp, ban_build_err_no_mem)); } b->flags = bp->flags; memset(b->spec, 0, BANS_HEAD_LEN); t0 = VTIM_real(); memcpy(b->spec + BANS_TIMESTAMP, &t0, sizeof t0); b->spec[BANS_FLAGS] = b->flags & 0xff; memcpy(b->spec + BANS_HEAD_LEN, VSB_data(bp->vsb), ln); ln += BANS_HEAD_LEN; vbe32enc(b->spec + BANS_LENGTH, ln); Lck_Lock(&ban_mtx); if (ban_shutdown) { /* We could have raced a shutdown */ Lck_Unlock(&ban_mtx); BAN_Free(b); return (ban_error(bp, "Shutting down")); } bi = VTAILQ_FIRST(&ban_head); VTAILQ_INSERT_HEAD(&ban_head, b, list); ban_start = b; VSC_C_main->bans++; VSC_C_main->bans_added++; VSC_C_main->bans_persisted_bytes += ln; if (b->flags & BANS_FLAG_OBJ) VSC_C_main->bans_obj++; if (b->flags & BANS_FLAG_REQ) VSC_C_main->bans_req++; if (bi != NULL) ban_info_new(b->spec, ln); /* Notify stevedores */ if (cache_param->ban_dups) { /* Hunt down duplicates, and mark them as completed */ for (bi = VTAILQ_NEXT(b, list); bi != NULL; bi = VTAILQ_NEXT(bi, list)) { if (!(bi->flags & BANS_FLAG_COMPLETED) && ban_equal(b->spec, bi->spec)) { ban_mark_completed(bi); VSC_C_main->bans_dups++; } } } if (!(b->flags & BANS_FLAG_REQ)) ban_kick_lurker(); Lck_Unlock(&ban_mtx); BAN_Abandon(bp); return (NULL); }