/*
 * Copyright 1988, 1989, 1990, 1991 Massachusetts Institute of Technology
 */
#ifdef DBM
#include "structs.h"

int num_databases = 0, db_revision = 0;
database *Databases = NULL;

g_dbminit()
{
  FILE *fp;
  char filename[MAXPATHLEN], tempstring[100];
  int cur_dbm = 0;
  sprintf(filename, "%s/dbm_list", DBM_DIR);
  if (DEBUG) printf("Using %s as database file.\n", filename);
  fp = fopen(filename, "r");
  if (fp == (FILE *)NULL) {
    bsdsyslog(LOG_NOTICE,"g_dbminit: unable to open database list: %s",
	      filename);
    num_databases = 0;
    return;
  }
  if (fgets(tempstring, 100, fp) == NULL) {
    bsdsyslog(LOG_NOTICE, "g_dbminit: unable to read number of databases");
    fclose(fp);
    num_databases = 0;
    return;
  }
  num_databases = (int)atol(tempstring);
  Databases = (database *)malloc(num_databases * sizeof(database));
  if (Databases == (database *)NULL) {
    bsdsyslog(LOG_NOTICE, "g_dbminit: unable to malloc database table");
    fclose(fp);
    num_databases = 0;
    return;
  }
  while (fscanf(fp, "%d %s %s %d\n", &(Databases[cur_dbm].uid), 
		Databases[cur_dbm].filename, 
		Databases[cur_dbm].dbmname,
		&(Databases[cur_dbm].perm)) == 3) {
    Databases[cur_dbm].fd = -1;
    Databases[cur_dbm].active = 1;
    Databases[cur_dbm].start_el = (DBM_element *)NULL;
/*    if (DEBUG) {
      printf("Database %d, filename: %s, permissions: %d, uid %d\n",
	     cur_dbm, Databases[cur_dbm].filename,
	     Databases[cur_dbm].dbmname,
	     Databases[cur_dbm].perm, Databases[cur_dbm].uid);
    }
*/
    cur_dbm++;
  }
  fclose(fp);
  db_revision++;
}

g_dbmsave()
{
  FILE *fp;
  int i, num_to_save = 0;
  char filename[MAXPATHLEN];

  int cur_dbm = 0;

  if (access(DBM_DIR, W_OK)) {
    mkdir(DBM_DIR, 0755);
    chmod(DBM_DIR, 0755);
  }
  sprintf(filename, "%s/dbm_list", DBM_DIR);
  if (DEBUG) printf("Using %s as database file.\n", filename);
  fp = fopen(filename, "w");
  if (fp == (FILE *)NULL) {
    bsdsyslog(LOG_NOTICE,"g_dbmsave: unable to open database list: %s",
	      filename);
    return;
  }
  for (cur_dbm = 0; cur_dbm < num_databases; cur_dbm++)
    if (Databases[cur_dbm].active) num_to_save++;
  fprintf(fp, "%d\n", num_to_save);
  for (cur_dbm = 0; cur_dbm < num_databases; cur_dbm++) {
    if (Databases[cur_dbm].active) {
      fprintf(fp, "%d %s %s %d\n",Databases[cur_dbm].uid,
	      Databases[cur_dbm].filename,
	      Databases[cur_dbm].dbmname,
	      Databases[cur_dbm].perm);
    }
  }
  fclose(fp);
}

int DoGetDatabases(msgsock, hostcommand, clinum)
     int msgsock, clinum;
     Galatea_packet *hostcommand;
{
  int i;
  if (sendint(msgsock, num_databases) == -1) return(-1);
  for (i = 0; i < num_databases; i++) {
    if (sendint(msgsock, i) == -1) return(-1);
    if (sendint(msgsock, Databases[i].uid) == -1) return(-1);
    if (sendint(msgsock, Databases[i].perm) == -1) return(-1);
    if (sendstring(msgsock, Databases[i].dbmname) == -1) return(-1);
  }
  clients[clinum].db_rev = db_revision;
  return(-1);
}
#endif /* DBM */
