/* Generate all four files corresponding to dbc. */ static krb5_error_code ctx_allfiles(krb5_db2_context *dbc, char **dbname_out, char **lockname_out, char **polname_out, char **plockname_out) { char *a = NULL, *b = NULL, *c = NULL, *d = NULL; *dbname_out = *lockname_out = *polname_out = *plockname_out = NULL; if (ctx_dbsuffix(dbc, SUFFIX_DB, &a)) goto error; if (ctx_dbsuffix(dbc, SUFFIX_LOCK, &b)) goto error; if (ctx_dbsuffix(dbc, SUFFIX_POLICY, &c)) goto error; if (ctx_dbsuffix(dbc, SUFFIX_POLICY_LOCK, &d)) goto error; *dbname_out = a; *lockname_out = b; *polname_out = c; *plockname_out = d; return 0; error: free(a); free(b); free(c); free(d); return ENOMEM; }
/* * Open the DB2 database described by dbc, using the specified flags and mode, * and return the resulting handle. Try both hash and btree database types; * dbc->hashfirst determines which is attempted first. If dbc->hashfirst * indicated the wrong type, update it to indicate the correct type. */ static DB * open_db(krb5_db2_context *dbc, int flags, int mode) { char *fname = NULL; DB *db; BTREEINFO bti; HASHINFO hashi; bti.flags = 0; bti.cachesize = 0; bti.psize = 4096; bti.lorder = 0; bti.minkeypage = 0; bti.compare = NULL; bti.prefix = NULL; if (ctx_dbsuffix(dbc, SUFFIX_DB, &fname) != 0) { errno = ENOMEM; return NULL; } hashi.bsize = 4096; hashi.cachesize = 0; hashi.ffactor = 40; hashi.hash = NULL; hashi.lorder = 0; hashi.nelem = 1; /* Try our best guess at the database type. */ db = dbopen(fname, flags, mode, dbc->hashfirst ? DB_HASH : DB_BTREE, dbc->hashfirst ? (void *) &hashi : (void *) &bti); if (db != NULL) goto done; /* If that was wrong, retry with the other type. */ switch (errno) { #ifdef EFTYPE case EFTYPE: #endif case EINVAL: db = dbopen(fname, flags, mode, dbc->hashfirst ? DB_BTREE : DB_HASH, dbc->hashfirst ? (void *) &bti : (void *) &hashi); /* If that worked, update our guess for next time. */ if (db != NULL) dbc->hashfirst = !dbc->hashfirst; break; } /* Don't try unlocked iteration with a hash database. */ if (db != NULL && dbc->hashfirst) dbc->unlockiter = FALSE; done: free(fname); return db; }
/* * Open the DB2 database described by dbc, using the specified flags and mode, * and return the resulting handle. Try both hash and btree database types; * dbc->hashfirst determines which is attempted first. If dbc->hashfirst * indicated the wrong type, update it to indicate the correct type. */ static krb5_error_code open_db(krb5_context context, krb5_db2_context *dbc, int flags, int mode, DB **db_out) { char *fname = NULL; DB *db; BTREEINFO bti; HASHINFO hashi; bti.flags = 0; bti.cachesize = 0; bti.psize = 4096; bti.lorder = 0; bti.minkeypage = 0; bti.compare = NULL; bti.prefix = NULL; *db_out = NULL; if (ctx_dbsuffix(dbc, SUFFIX_DB, &fname) != 0) return ENOMEM; hashi.bsize = 4096; hashi.cachesize = 0; hashi.ffactor = 40; hashi.hash = NULL; hashi.lorder = 0; hashi.nelem = 1; /* Try our best guess at the database type. */ db = dbopen(fname, flags, mode, dbc->hashfirst ? DB_HASH : DB_BTREE, dbc->hashfirst ? (void *) &hashi : (void *) &bti); if (db == NULL && IS_EFTYPE(errno)) { db = dbopen(fname, flags, mode, dbc->hashfirst ? DB_BTREE : DB_HASH, dbc->hashfirst ? (void *) &bti : (void *) &hashi); /* If that worked, update our guess for next time. */ if (db != NULL) dbc->hashfirst = !dbc->hashfirst; } /* Don't try unlocked iteration with a hash database. */ if (db != NULL && dbc->hashfirst) dbc->unlockiter = FALSE; if (db == NULL) { k5_prependmsg(context, errno, _("Cannot open DB2 database '%s'"), fname); } *db_out = db; free(fname); return (db == NULL) ? errno : 0; }
/* Initialize the lock file and policy database fields of dbc. The db_name and * tempdb fields must already be set. */ static krb5_error_code ctx_init(krb5_db2_context *dbc) { krb5_error_code retval; char *polname = NULL, *plockname = NULL; retval = ctx_dbsuffix(dbc, SUFFIX_LOCK, &dbc->db_lf_name); if (retval) return retval; /* * should be opened read/write so that write locking can work with * POSIX systems */ if ((dbc->db_lf_file = open(dbc->db_lf_name, O_RDWR, 0666)) < 0) { if ((dbc->db_lf_file = open(dbc->db_lf_name, O_RDONLY, 0666)) < 0) { retval = errno; goto cleanup; } } set_cloexec_fd(dbc->db_lf_file); dbc->db_inited++; retval = ctx_dbsuffix(dbc, SUFFIX_POLICY, &polname); if (retval) goto cleanup; retval = ctx_dbsuffix(dbc, SUFFIX_POLICY_LOCK, &plockname); if (retval) goto cleanup; retval = osa_adb_init_db(&dbc->policy_db, polname, plockname, OSA_ADB_POLICY_DB_MAGIC); cleanup: free(polname); free(plockname); if (retval) ctx_clear(dbc); return retval; }