void FnCallWrite(Writer *writer, const FnCall *call) { WriterWrite(writer, call->name); WriterWriteChar(writer, '('); for (const Rlist *rp = call->args; rp != NULL; rp = rp->next) { switch (rp->val.type) { case RVAL_TYPE_SCALAR: ScalarWrite(writer, RlistScalarValue(rp), true); break; case RVAL_TYPE_FNCALL: FnCallWrite(writer, RlistFnCallValue(rp)); break; default: WriterWrite(writer, "(** Unknown argument **)\n"); break; } if (rp->next != NULL) { WriterWriteChar(writer, ','); } } WriterWriteChar(writer, ')'); }
void BundlePrettyPrint(Writer *writer, Bundle *bundle) { SubType *promise_type = NULL; WriterWriteF(writer, "bundle %s %s", bundle->type, bundle->name); ArgumentsPrettyPrint(writer, bundle->args); WriterWrite(writer, "\n{"); for (promise_type = bundle->subtypes; promise_type != NULL; promise_type = promise_type->next) { Promise *pp = NULL; WriterWriteF(writer, "\n%s:\n", promise_type->name); for (pp = promise_type->promiselist; pp != NULL; pp = pp->next) { Constraint *cp = NULL; char *current_class = NULL; if (current_class == NULL || strcmp(cp->classes, current_class) != 0) { current_class = cp->classes; if (strcmp(current_class, "any") != 0) { IndentPrint(writer, 1); WriterWriteF(writer, "%s::", current_class); } } IndentPrint(writer, 2); WriterWrite(writer, pp->promiser); /* FIX: add support * if (pp->promisee != NULL) { fprintf(out, " -> %s", pp->promisee); } */ for (cp = pp->conlist; cp != NULL; cp = cp->next) { WriterWriteChar(writer, '\n'); IndentPrint(writer, 1); AttributePrettyPrint(writer, cp, 3); } } if (promise_type->next != NULL) { WriterWriteChar(writer, '\n'); } } WriterWrite(writer, "\n}"); }
static void ScalarWrite(Writer *w, const char *s) { for (; *s; s++) { if (*s == '\'') { WriterWriteChar(w, '\\'); } WriterWriteChar(w, *s); } }
void RlistWrite(Writer *writer, const Rlist *list) { WriterWrite(writer, " {"); for (const Rlist *rp = list; rp != NULL; rp = rp->next) { RvalWriteQuoted(writer, rp->val); if (rp->next != NULL) { WriterWriteChar(writer, ','); } } WriterWriteChar(writer, '}'); }
char *MapNameCopy(const char *s) { Writer *w = StringWriter(); /* c:\a\b -> /cygdrive/c\a\b */ if (s[0] && isalpha(s[0]) && s[1] == ':') { WriterWriteF(w, "/cygdrive/%c", s[0]); s += 2; } for (; *s; s++) { /* a//b//c -> a/b/c */ /* a\\b\\c -> a\b\c */ if (IsFileSep(*s) && IsFileSep(*(s + 1))) { continue; } /* a\b\c -> a/b/c */ WriterWriteChar(w, *s == '\\' ? '/' : *s); } return StringWriterClose(w); }
void BodyPrettyPrint(Writer *writer, Body *body) { Constraint *cp = NULL; char *current_class = NULL; WriterWriteF(writer, "body %s %s", body->type, body->name); ArgumentsPrettyPrint(writer, body->args); WriterWrite(writer, "\n{"); for (cp = body->conlist; cp != NULL; cp = cp->next) { if (current_class == NULL || strcmp(cp->classes, current_class) != 0) { current_class = cp->classes; if (strcmp(current_class, "any") == 0) { WriterWrite(writer, "\n"); } else { WriterWriteF(writer, "\n\n%s::", current_class); } } WriterWriteChar(writer, '\n'); IndentPrint(writer, 1); AttributePrettyPrint(writer, cp, 2); } WriterWrite(writer, "\n}"); }
static void RenderHTMLContent(Writer *out, const char *input, size_t len) { for (size_t i = 0; i < len; i++) { switch (input[i]) { case '&': WriterWrite(out, "&"); break; case '"': WriterWrite(out, """); break; case '<': WriterWrite(out, "<"); break; case '>': WriterWrite(out, ">"); break; default: WriterWriteChar(out, input[i]); break; } } }
static void ArgumentsPrettyPrint(Writer *writer, Rlist *args) { Rlist *argp = NULL; WriterWriteChar(writer, '('); for (argp = args; argp != NULL; argp = argp->next) { WriterWriteF(writer, "%s", (char *) argp->item); if (argp->next != NULL) { WriterWrite(writer, ", "); } } WriterWriteChar(writer, ')'); }
void RlistWrite(Writer *writer, const Rlist *list) { WriterWrite(writer, " {"); for (const Rlist *rp = list; rp != NULL; rp = rp->next) { WriterWriteChar(writer, '\''); RvalWrite(writer, (Rval) {rp->item, rp->type}); WriterWriteChar(writer, '\''); if (rp->next != NULL) { WriterWriteChar(writer, ','); } } WriterWriteChar(writer, '}'); }
void PrintItemList(const Item *list, Writer *w) { WriterWriteChar(w, '{'); for (const Item *ip = list; ip != NULL; ip = ip->next) { if (ip != list) { WriterWriteChar(w, ','); } WriterWriteChar(w, '\''); WriterWrite(w, ip->name); WriterWriteChar(w, '\''); } WriterWriteChar(w, '}'); }
static void IndentPrint(Writer *writer, int indent_level) { int i = 0; for (i = 0; i < PRETTY_PRINT_SPACES_PER_INDENT * indent_level; i++) { WriterWriteChar(writer, ' '); } }
void ScalarWrite(Writer *writer, const char *s, bool quote) { if (quote) { WriterWriteChar(writer, '"'); } for (; *s; s++) { if (*s == '"') { WriterWriteChar(writer, '\\'); } WriterWriteChar(writer, *s); } if (quote) { WriterWriteChar(writer, '"'); } }
void PrintItemList(const Item *list, Writer *w) { WriterWriteChar(w, '{'); const Item *ip = list; CYCLE_DECLARE(ip, slow, toggle); while (ip != NULL) { if (ip != list) { WriterWriteChar(w, ','); } WriterWriteChar(w, '\''); WriterWrite(w, ip->name); WriterWriteChar(w, '\''); ip = ip->next; CYCLE_CHECK(ip, slow, toggle); } WriterWriteChar(w, '}'); }
static char *GetIpAddresses(const EvalContext *ctx) { Writer *ipbuf = StringWriter(); for (Item *iptr = EvalContextGetIpAddresses(ctx); iptr != NULL; iptr = iptr->next) { WriterWrite(ipbuf, iptr->name); if (iptr->next != NULL) { WriterWriteChar(ipbuf, ' '); } } return StringWriterClose(ipbuf); }
char *GetCsvLineNext(FILE *fp) { if (!fp) { return NULL; } Writer *buffer = StringWriter(); char prev = 0; for (;;) { char current = fgetc(fp); if (current == EOF) { break; } WriterWriteChar(buffer, current); if ((current == '\n') && (prev == '\r')) { break; } prev = current; } if (StringWriterLength(buffer) <= 0) { WriterClose(buffer); return NULL; } return StringWriterClose(buffer); }
static int SelectProcess(EvalContext *ctx, char *procentry, char **names, int *start, int *end, ProcessSelect a) { int result = true, i; char *column[CF_PROCCOLS]; Rlist *rp; StringSet *process_select_attributes = StringSetNew(); if (!SplitProcLine(procentry, names, start, end, column)) { return false; } for (i = 0; names[i] != NULL; i++) { Log(LOG_LEVEL_DEBUG, "In SelectProcess, COL[%s] = '%s'", names[i], column[i]); } for (rp = a.owner; rp != NULL; rp = rp->next) { if (SelectProcRegexMatch(ctx, "USER", "UID", RlistScalarValue(rp), names, column)) { StringSetAdd(process_select_attributes, xstrdup("process_owner")); break; } } if (SelectProcRangeMatch("PID", "PID", a.min_pid, a.max_pid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("pid")); } if (SelectProcRangeMatch("PPID", "PPID", a.min_ppid, a.max_ppid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("ppid")); } if (SelectProcRangeMatch("PGID", "PGID", a.min_pgid, a.max_pgid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("pgid")); } if (SelectProcRangeMatch("VSZ", "SZ", a.min_vsize, a.max_vsize, names, column)) { StringSetAdd(process_select_attributes, xstrdup("vsize")); } if (SelectProcRangeMatch("RSS", "RSS", a.min_rsize, a.max_rsize, names, column)) { StringSetAdd(process_select_attributes, xstrdup("rsize")); } if (SelectProcTimeCounterRangeMatch("TIME", "TIME", a.min_ttime, a.max_ttime, names, column)) { StringSetAdd(process_select_attributes, xstrdup("ttime")); } if (SelectProcTimeAbsRangeMatch ("STIME", "START", a.min_stime, a.max_stime, names, column)) { StringSetAdd(process_select_attributes, xstrdup("stime")); } if (SelectProcRangeMatch("NI", "PRI", a.min_pri, a.max_pri, names, column)) { StringSetAdd(process_select_attributes, xstrdup("priority")); } if (SelectProcRangeMatch("NLWP", "NLWP", a.min_thread, a.max_thread, names, column)) { StringSetAdd(process_select_attributes, xstrdup("threads")); } if (SelectProcRegexMatch(ctx, "S", "STAT", a.status, names, column)) { StringSetAdd(process_select_attributes, xstrdup("status")); } if (SelectProcRegexMatch(ctx, "CMD", "COMMAND", a.command, names, column)) { StringSetAdd(process_select_attributes, xstrdup("command")); } if (SelectProcRegexMatch(ctx, "TTY", "TTY", a.tty, names, column)) { StringSetAdd(process_select_attributes, xstrdup("tty")); } if (!a.process_result) { if (StringSetSize(process_select_attributes) == 0) { result = EvalProcessResult("", process_select_attributes); } else { Writer *w = StringWriter(); StringSetIterator iter = StringSetIteratorInit(process_select_attributes); char *attr = StringSetIteratorNext(&iter); WriterWrite(w, attr); while ((attr = StringSetIteratorNext(&iter))) { WriterWriteChar(w, '.'); WriterWrite(w, attr); } result = EvalProcessResult(StringWriterData(w), process_select_attributes); WriterClose(w); } } else { result = EvalProcessResult(a.process_result, process_select_attributes); } StringSetDestroy(process_select_attributes); for (i = 0; column[i] != NULL; i++) { free(column[i]); } return result; }
static bool SelectProcess(const char *procentry, time_t pstime, char **names, int *start, int *end, const char *process_regex, ProcessSelect a, bool attrselect) { bool result = true; char *column[CF_PROCCOLS]; Rlist *rp; assert(process_regex); StringSet *process_select_attributes = StringSetNew(); memset(column, 0, sizeof(column)); if (!SplitProcLine(procentry, pstime, names, start, end, PS_COLUMN_ALGORITHM[VPSHARDCLASS], column)) { result = false; goto cleanup; } ApplyPlatformExtraTable(names, column); for (int i = 0; names[i] != NULL; i++) { Log(LOG_LEVEL_DEBUG, "In SelectProcess, COL[%s] = '%s'", names[i], column[i]); } if (!SelectProcRegexMatch("CMD", "COMMAND", process_regex, false, names, column)) { result = false; goto cleanup; } if (!attrselect) { // If we are not considering attributes, then the matching is done. goto cleanup; } for (rp = a.owner; rp != NULL; rp = rp->next) { if (SelectProcRegexMatch("USER", "UID", RlistScalarValue(rp), true, names, column)) { StringSetAdd(process_select_attributes, xstrdup("process_owner")); break; } } if (SelectProcRangeMatch("PID", "PID", a.min_pid, a.max_pid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("pid")); } if (SelectProcRangeMatch("PPID", "PPID", a.min_ppid, a.max_ppid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("ppid")); } if (SelectProcRangeMatch("PGID", "PGID", a.min_pgid, a.max_pgid, names, column)) { StringSetAdd(process_select_attributes, xstrdup("pgid")); } if (SelectProcRangeMatch("VSZ", "SZ", a.min_vsize, a.max_vsize, names, column)) { StringSetAdd(process_select_attributes, xstrdup("vsize")); } if (SelectProcRangeMatch("RSS", "RSS", a.min_rsize, a.max_rsize, names, column)) { StringSetAdd(process_select_attributes, xstrdup("rsize")); } if (SelectProcTimeCounterRangeMatch("TIME", "TIME", a.min_ttime, a.max_ttime, names, column)) { StringSetAdd(process_select_attributes, xstrdup("ttime")); } if (SelectProcTimeAbsRangeMatch ("STIME", "START", a.min_stime, a.max_stime, names, column)) { StringSetAdd(process_select_attributes, xstrdup("stime")); } if (SelectProcRangeMatch("NI", "PRI", a.min_pri, a.max_pri, names, column)) { StringSetAdd(process_select_attributes, xstrdup("priority")); } if (SelectProcRangeMatch("NLWP", "NLWP", a.min_thread, a.max_thread, names, column)) { StringSetAdd(process_select_attributes, xstrdup("threads")); } if (SelectProcRegexMatch("S", "STAT", a.status, true, names, column)) { StringSetAdd(process_select_attributes, xstrdup("status")); } if (SelectProcRegexMatch("CMD", "COMMAND", a.command, true, names, column)) { StringSetAdd(process_select_attributes, xstrdup("command")); } if (SelectProcRegexMatch("TTY", "TTY", a.tty, true, names, column)) { StringSetAdd(process_select_attributes, xstrdup("tty")); } if (!a.process_result) { if (StringSetSize(process_select_attributes) == 0) { result = EvalProcessResult("", process_select_attributes); } else { Writer *w = StringWriter(); StringSetIterator iter = StringSetIteratorInit(process_select_attributes); char *attr = StringSetIteratorNext(&iter); WriterWrite(w, attr); while ((attr = StringSetIteratorNext(&iter))) { WriterWriteChar(w, '.'); WriterWrite(w, attr); } result = EvalProcessResult(StringWriterData(w), process_select_attributes); WriterClose(w); } } else { result = EvalProcessResult(a.process_result, process_select_attributes); } cleanup: StringSetDestroy(process_select_attributes); for (int i = 0; column[i] != NULL; i++) { free(column[i]); } return result; }