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