static void test_prepend_scalar(void) { Rlist *list = NULL; RlistPrependScalar(&list, "stuff"); RlistPrependScalar(&list, "more-stuff"); assert_string_equal(list->item, "more-stuff"); RlistDestroy(list); }
static void test_length(void) { Rlist *list = NULL; assert_int_equal(RlistLen(list), 0); RlistPrependScalar(&list, "stuff"); assert_int_equal(RlistLen(list), 1); RlistPrependScalar(&list, "more-stuff"); assert_int_equal(RlistLen(list), 2); RlistDestroy(list); }
static void test_copy(void) { Rlist *list = NULL, *copy = NULL; RlistPrependScalar(&list, "stuff"); RlistPrependScalar(&list, "more-stuff"); copy = RlistCopy(list); assert_string_equal(list->item, copy->item); assert_string_equal(list->next->item, copy->next->item); RlistDestroy(list); RlistDestroy(copy); }
static Rlist *GetSQLTables(CfdbConn *cfdb) { Rlist *list = NULL; char query[CF_MAXVARSIZE]; ListTables(cfdb->type, query); CfNewQueryDB(cfdb, query); if (cfdb->maxcolumns != 1) { CfOut(OUTPUT_LEVEL_ERROR, "", "Could not make sense of the columns"); CfDeleteQuery(cfdb); return NULL; } while (CfFetchRow(cfdb)) { RlistPrependScalar(&list, CfFetchColumn(cfdb, 0)); } CfDeleteQuery(cfdb); return list; }
Rlist *RlistPrependScalarIdemp(Rlist **start, const char *scalar) { if (!RlistKeyIn(*start, scalar)) { return RlistPrependScalar(start, scalar); } else { return NULL; } }
void ScopeToList(Scope *sp, Rlist **list) { if (sp == NULL) { return; } AssocHashTableIterator i = HashIteratorInit(sp->hashtable); CfAssoc *assoc; while ((assoc = HashIteratorNext(&i))) { RlistPrependScalar(list, assoc->lval); } }
Rlist *RlistPrepend(Rlist **start, const void *item, RvalType type) /* heap memory for item must have already been allocated */ { Rlist *rp, *lp = *start; switch (type) { case RVAL_TYPE_SCALAR: return RlistPrependScalar(start, item); case RVAL_TYPE_LIST: CfDebug("Expanding and prepending list (ends up in reverse)\n"); for (rp = (Rlist *) item; rp != NULL; rp = rp->next) { lp = RlistPrepend(start, rp->item, rp->type); } return lp; case RVAL_TYPE_FNCALL: return RlistPrependFnCall(start, item); default: CfDebug("Cannot prepend %c to rval-list [%s]\n", type, (char *) item); return NULL; } rp = xmalloc(sizeof(Rlist)); rp->next = *start; rp->item = RvalCopy((Rval) { (void *)item, type}).item; rp->type = type; /* scalar, builtin function */ if (type == RVAL_TYPE_LIST) { rp->state_ptr = rp->item; } else { rp->state_ptr = NULL; } ThreadLock(cft_lock); *start = rp; ThreadUnlock(cft_lock); return rp; }
static void Apoptosis(void) { static char promiser_buf[CF_SMALLBUF]; snprintf(promiser_buf, sizeof(promiser_buf), "%s/bin/cf-execd", CFWORKDIR); if (LoadProcessTable(&PROCESSTABLE)) { char myuid[32]; snprintf(myuid, 32, "%d", (int)getuid()); Rlist *owners = NULL; RlistPrependScalar(&owners, myuid); ProcessSelect process_select = { .owner = owners, .process_result = "process_owner", }; Item *killlist = SelectProcesses(PROCESSTABLE, promiser_buf, process_select, true); for (Item *ip = killlist; ip != NULL; ip = ip->next) { pid_t pid = ip->counter; if (pid != getpid() && kill(pid, SIGTERM) < 0) { if (errno == ESRCH) { /* That's ok, process exited voluntarily */ } else { Log(LOG_LEVEL_ERR, "Unable to kill stale cf-execd process pid=%d. (kill: %s)", (int)pid, GetErrorStr()); } } } } DeleteItemList(PROCESSTABLE); Log(LOG_LEVEL_VERBOSE, "Pruning complete"); }