Beispiel #1
0
static int
_ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)
{
    struct cdbr *db;
    const void *data;
    char *db_name;
    const uint8_t *data8;
    size_t len, klen;
    int r;

    if (asprintf(&db_name, "%s.cdb", path) < 0)
        return -1;

    db = cdbr_open(db_name, CDBR_DEFAULT);
    free(db_name);
    if (db == NULL)
        return -1;

    klen = strlen(name) + 1;
    if (cdbr_find(db, name, klen, &data, &len) == -1)
        goto fail;
    data8 = data;
    if (len == 0)
        goto fail;
    /* Check for alias first, fall through to processing normal entries. */
    if (data8[0] == 2) {
        if (klen + 7 > len || le16dec(data8 + 5) != klen)
            goto fail;
        if (memcmp(data8 + 7, name, klen))
            goto fail;
        if (cdbr_get(db, le32dec(data8 + 1), &data, &len))
            goto fail;
        data8 = data;
        if (data8[0] != 1)
            goto fail;
    } else if (data8[0] != 1)
        goto fail;
    else if (klen + 3 >= len || le16dec(data8 + 1) != klen)
        goto fail;
    else if (memcmp(data8 + 3, name, klen))
        goto fail;

    snprintf(database, sizeof database, "%s", path);
    _ti_database = database;

    r = _ti_readterm(term, data, len, flags);
    cdbr_close(db);
    return r;

fail:
    cdbr_close(db);
    return 0;
}
Beispiel #2
0
void
_servent_close(struct servent_data *sd)
{
	if (sd->flags & _SV_CDB) {
		cdbr_close(sd->cdb);
		sd->cdb = NULL;
		sd->flags &= ~_SV_CDB;
	}

	if (sd->flags & _SV_PLAINFILE) {
		(void)fclose(sd->plainfile);
		sd->plainfile = NULL;
		sd->flags &= ~_SV_PLAINFILE;
	}
	sd->flags &= ~_SV_STAYOPEN;
}