Ejemplo n.º 1
0
int mergedb(char iface[], char dirname[])
{
	DATA mergedata;
	char *ifaceptr;

	if (!strstr(iface, "+")) {
		return 0;
	}

	/* create empty database */
	emptydb(&mergedata);
	strncpy_nt(mergedata.iface.interface, iface, 32);
	strncpy_nt(mergedata.iface.nick, mergedata.iface.interface, 32);

	if (debug)
		printf("iface merge: %s\n", iface);

	ifaceptr = strtok(iface, "+");

	/* merge all databases in given string */
	while (ifaceptr != NULL) {
		if (debug)
			printf("merging %s:\n", ifaceptr);

		if (readdb(ifaceptr, dirname)!=0) {
			printf("Merge \"%s\" failed.\n", mergedata.iface.interface);
			return 0;
		}

		if (!mergewith(&mergedata)) {
			printf("Merge \"%s\" failed for interface \"%s\".\n", mergedata.iface.interface, ifaceptr);
			return 0;
		}

		ifaceptr = strtok(NULL, "+");
	}

	/* clean possible glitches */
	cleanmerged(&mergedata);

	/* replace active data with merged */
	if (memcpy(&data, &mergedata, sizeof(data)) != NULL) {
		return 1;
	} else {
		return 0;
	}
}
Ejemplo n.º 2
0
int main(int argc, char **argv)
{
  fsal_posixdb_conn_params_t dbparams;
  char exec_name[MAXPATHLEN];
  char c, op = 0;
  fsal_posixdb_conn *p_conn;
  fsal_posixdb_status_t statusdb;
  char path[MAXPATHLEN];
  int rc;

  char options[] = "h@H:P:L:D:K:";
  char usage[] =
      "Usage: %s [-h][-H <host>][-P <port>][-L <login>][-D <dbname>][-K <passwd file>] operation operation_parameters\n"
      "\t[-h]               display this help\n"
      "\t[-H <host>]        Database host\n"
      "\t[-P <port>]        Database port\n"
      "\t[-L <login>]       Database login\n"
      "\t[-D <dbname>]      Name of the database\n"
      "\t[-K <passwd file>] Path of the file where is stored the password\n"
      "------------- Default Values -------------\n"
      "host        : localhost\n"
      "port        : default DB port\n"
      "dbname      : posixdb\n"
      "login       : current unix user\n"
      "passwd file : default path ($PGPASSFILE)\n"
      "------------- Operations -----------------\n"
      "test_connection       : try to connect to the database\n"
      "empty_database        : Delete all entries in the database\n"
      "find                  : Print the entries of the database (as 'find' would do it)\n"
      "populate <path>       : Add (recursively) the object in <path> into the database\n\n";

  memset(&dbparams, 0, sizeof(fsal_posixdb_conn_params_t));
  strcpy(dbparams.host, "localhost");
  strcpy(dbparams.dbname, "posixdb");

  /* What is the executable file's name */
  if(*exec_name == '\0')
    strcpy((char *)exec_name, basename(argv[0]));

  /* now parsing options with getopt */
  while((c = getopt(argc, argv, options)) != EOF)
    {
      switch (c)
        {
        case '@':
          /* A litlle backdoor to keep track of binary versions */
          printf("%s compiled on %s at %s\n", exec_name, __DATE__, __TIME__);
          exit(0);
          break;
        case 'H':
          strncpy(dbparams.host, optarg, FSAL_MAX_DBHOST_NAME_LEN);
          break;
        case 'P':
          strncpy(dbparams.port, optarg, FSAL_MAX_DBPORT_STR_LEN);
          break;
        case 'L':
          strncpy(dbparams.login, optarg, FSAL_MAX_DB_LOGIN_LEN);
          break;
        case 'D':
          strncpy(dbparams.dbname, optarg, FSAL_MAX_DB_NAME_LEN);
          break;
        case 'K':
          strncpy(dbparams.passwdfile, optarg, PATH_MAX);
          break;
        default:
          /* display the help */
          fprintf(stderr, usage, exec_name);
          exit(0);
          break;
        }
    }

  if(optind == argc)
    {
      fprintf(stderr, "No operation specified.\n");
      fprintf(stderr, usage, exec_name);
      exit(0);
    }
  if(optind < argc)
    {
      if(!strcmp(argv[optind], "test_connection"))
        {
          op = OP_TESTCONN;
        }
      else if(!strcmp(argv[optind], "empty_database"))
        {
          op = OP_EMPTYDB;
        }
      else if(!strcmp(argv[optind], "find"))
        {
          op = OP_FIND;
        }
      else if(!strcmp(argv[optind], "populate"))
        {
          op = OP_POPULATE;
          optind++;
          if(optind < argc)
            {
              strncpy(path, argv[optind], MAXPATHLEN);
            }
          else
            {
              fputs("Operation 'populate' need a parameter", stderr);
              fprintf(stderr, usage, exec_name);
              exit(-1);
            }
        }
      else
        {
          fprintf(stderr, "Unknown operation : %s\n", argv[optind]);
          fprintf(stderr, usage, exec_name);
          exit(-1);
        }
    }

  /* Connecting to database */
  if(*(dbparams.passwdfile) != '\0')
    {
      rc = setenv("PGPASSFILE", dbparams.passwdfile, 1);
      if(rc != 0)
        fputs("Could not set POSTGRESQL keytab path.", stderr);
    }

  fprintf(stderr, "Opening database connection to %s...\n", dbparams.host);
  statusdb = fsal_posixdb_connect(&dbparams, &p_conn);
  if(FSAL_POSIXDB_IS_ERROR(statusdb))
    {
      fprintf(stderr, "Error %i. exiting.\n", statusdb.minor);
      exit(-1);
    }
  else
    {
      fprintf(stderr, "Connected.\n");
    }

  /* Execute the operation */
  switch (op)
    {
    case OP_TESTCONN:
      /* nothing to do */
      break;
    case OP_EMPTYDB:
      emptydb(p_conn);
      break;
    case OP_FIND:
      find(p_conn);
      break;
    case OP_POPULATE:
      populatedb(p_conn, path);
      break;
    default:
      puts("Bad operation !!");
      fprintf(stderr, usage, exec_name);
    }

  fsal_posixdb_disconnect(p_conn);

  exit(0);
}