Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
Rlist *RlistPrependScalarIdemp(Rlist **start, const char *scalar)
{
    if (!RlistKeyIn(*start, scalar))
    {
        return RlistPrependScalar(start, scalar);
    }
    else
    {
        return NULL;
    }
}
Esempio n. 6
0
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);
    }
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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");
}