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; }
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; }