示例#1
0
int
_servent_open(struct servent_data *sd)
{
	if (sd->flags & (_SV_CDB | _SV_PLAINFILE)) {
		sd->flags |= _SV_FIRST;
		return 0;
	}

	free(sd->line);
	sd->line = NULL;
	free(sd->cdb_buf);
	sd->cdb_buf = NULL;
	sd->cdb_buf_len = 0;
	free(sd->aliases);
	sd->aliases = NULL;
	sd->maxaliases = 0;
	sd->flags |= _SV_FIRST;

	sd->cdb = cdbr_open(_PATH_SERVICES_CDB, CDBR_DEFAULT);
	if (sd->cdb != NULL) {
		sd->flags |= _SV_CDB;
		return 0;
	}
		
	sd->plainfile = fopen(_PATH_SERVICES, "r");
	if (sd->plainfile != NULL) {
		sd->flags |= _SV_PLAINFILE;
		return 0;
	}
	return -1;
}
示例#2
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;
}