示例#1
0
struct servent *
getservent_r(struct servent *sp, struct servent_data *sd)
{

	if ((sd->flags & (_SV_CDB | _SV_PLAINFILE)) == 0 &&
	    _servent_open(sd) == -1)
		return NULL;

	if (sd->flags & _SV_CDB) {
		const void *data;
		size_t len;

		if (sd->flags & _SV_FIRST) {
			sd->cdb_index = 0;
			sd->flags &= ~_SV_FIRST;
		}

		if (cdbr_get(sd->cdb, sd->cdb_index, &data, &len))
			return NULL;
		++sd->cdb_index;
		return _servent_parsedb(sd, sp, data, len);
	}
	if (sd->flags & _SV_PLAINFILE) {
		for (;;) {
			if (_servent_getline(sd) == -1)
				return NULL;
			if (_servent_parseline(sd, sp) == NULL)
				continue;
			return sp;
		}
	}
	return NULL;
}
示例#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;
}