- gdbms[CDB_MSGMAIN] = gdbm_open("data/msgmain.gdbm", 8192,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_MSGMAIN] == NULL) {
- lprintf(2, "Cannot open msgmain: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_USERSUPP] = gdbm_open("data/usersupp.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_USERSUPP] == NULL) {
- lprintf(2, "Cannot open usersupp: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_VISIT] = gdbm_open("data/visit.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_VISIT] == NULL) {
- lprintf(2, "Cannot open visit file: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_QUICKROOM] = gdbm_open("data/quickroom.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_QUICKROOM] == NULL) {
- lprintf(2, "Cannot open quickroom: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_FLOORTAB] = gdbm_open("data/floortab.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_FLOORTAB] == NULL) {
- lprintf(2, "Cannot open floortab: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_MSGLISTS] = gdbm_open("data/msglists.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_MSGLISTS] == NULL) {
- lprintf(2, "Cannot open msglists: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
- }
- gdbms[CDB_DIRECTORY] = gdbm_open("data/directory.gdbm", 0,
- GDBM_WRCREAT, 0600, NULL);
- if (gdbms[CDB_DIRECTORY] == NULL) {
- lprintf(2, "Cannot open directory: %s\n",
- gdbm_strerror(gdbm_errno));
- exit(1);
+ /* Arbitrary names for our tables -- we reference them by
+ * number, so we don't have string names for them.
+ */
+ snprintf(dbfilename, sizeof dbfilename, "cdb.%02x", i);
+
+ ret = dbp[i]->open(dbp[i],
+ NULL,
+ dbfilename,
+ NULL,
+ DB_BTREE,
+ DB_CREATE | DB_AUTO_COMMIT | DB_THREAD,
+ 0600
+ );
+ if (ret) {
+ syslog(LOG_EMERG, "db_open[%02x]: %s\n", i, db_strerror(ret));
+ if (ret == ENOMEM) {
+ syslog(LOG_EMERG, "You may need to tune your database; please read http://www.citadel.org/doku.php/faq:troubleshooting:out_of_lock_entries for more information.\n");
+ }
+ syslog(LOG_EMERG, "exit code %d\n", ret);
+ exit(CTDLEXIT_DB);
+ }
+ }
+
+}
+
+
+/* Make sure we own all the files, because in a few milliseconds
+ * we're going to drop root privs.
+ */
+void cdb_chmod_data(void) {
+ DIR *dp;
+ struct dirent *d;
+ char filename[PATH_MAX];
+
+ dp = opendir(ctdl_data_dir);
+ if (dp != NULL) {
+ while (d = readdir(dp), d != NULL) {
+ if (d->d_name[0] != '.') {
+ snprintf(filename, sizeof filename,
+ "%s/%s", ctdl_data_dir, d->d_name);
+ syslog(LOG_DEBUG, "chmod(%s, 0600) returned %d\n",
+ filename, chmod(filename, 0600)
+ );
+ syslog(LOG_DEBUG, "chown(%s, CTDLUID, -1) returned %d\n",
+ filename, chown(filename, CTDLUID, (-1))
+ );
+ }
+ }
+ closedir(dp);