Example #1
0
File: sh.c Project: danhil/050ade
/* main: main program of simple shell. */
int main(int argc, char** argv)
{
	progname = argv[0];

	init_search_path();	

	while (fetch_line("% ") != EOF)
		parse_line();

	return 0;
}
Example #2
0
char
*carmen_file_find(const char *filename)
{
  char *path, buf[256];
  int i;
  FILE *f;

  if (sp_num <= 0)
    init_search_path();
  for (i = 0; i < sp_num; i++) {
    sprintf(buf, "%s/%s", search_path[i], filename);
    f = fopen(buf, "r");
    if (f != NULL) {
      path = (char *) calloc(strlen(buf) + 1, sizeof(char));
      carmen_test_alloc(path);
      strcpy(path, buf);
      fclose(f);
      return path;
    }
  }
  return NULL;
}
Example #3
0
TranslationUtil::TranslationUtil(QLocale::Language lang, QString translation_file)
: locale(lang)
{
	if (search_path.size() == 0)
		init_search_path();
	
	QString locale_name = locale.name();
	
	QString translation_name = "qt_" + locale_name;
	if (!qt_translator.load(translation_name, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
		load(qt_translator, translation_name);
	
	QString file_locale = localeNameForFile(translation_file);
	if (!file_locale.isEmpty() && QLocale(file_locale).language() == lang)
	{
		load(app_translator, translation_file);
	}
	else
	{
		translation_name = base_name + locale_name;
		load(app_translator, translation_name);
	}
}
Example #4
0
/* --------------------------------
 * init_postgres
 *		Initialize POSTGRES.
 *
 * The database can be specified by name, using the in_dbname parameter, or by
 * OID, using the dboid parameter.	In the latter case, the actual database
 * name can be returned to the caller in out_dbname.  If out_dbname isn't
 * NULL, it must point to a buffer of size NAMEDATALEN.
 *
 * In bootstrap mode no parameters are used.  The autovacuum launcher process
 * doesn't use any parameters either, because it only goes far enough to be
 * able to read pg_database; it doesn't connect to any particular database.
 * In walsender mode only username is used.
 *
 * As of PostgreSQL 8.2, we expect init_process() was already called, so we
 * already have a struct proc struct ... but it's not completely filled in yet.
 *
 * Note:
 *		Be very careful with the order of calls in the init_postgres function.
 * --------------------------------
 */
void init_postgres(const char *in_dbname, oid_t dboid, const char *username, char *out_dbname)
{
	bool bootstrap = BOOTSTRAP_MODE();
	bool am_superuser;
	char *fullpath;
	char dbname[NAMEDATALEN];

	elog(DEBUG3, "init_postgres");

	/*
	 * Add my struct proc struct to the ProcArray.
	 *
	 * Once I have done this, I am visible to other backends!
	 */
	init_proc_phase2();

	/*
	 * Initialize my entry in the shared-invalidation manager's array of
	 * per-backend data.
	 *
	 * Sets up current_bid, a unique backend identifier.
	 */
	current_bid = INVALID_BKNID;
	sci_bkn_init(false);
	if (current_bid > MAX_NR_BACKENDS || current_bid <= 0)
		elog(FATAL, "bad backend ID: %d", current_bid);

	/* Now that we have a bid_t, we can participate in ProcSignal */
	signal_init(current_bid);

	/*
	 * bufmgr needs another initialization call too
	 */
	init_buffer_pool_bkn();

	/*
	 * Initialize local process's access to XLOG.
	 */
	if (child) {
		/*
		 * The postmaster already started the XLOG machinery, but we need to
		 * call init_xlog_access(), if the system isn't in hot-standby mode.
		 * This is handled by calling recovery_in_progres and ignoring the
		 * result.
		 */
		(void) recovery_in_progres();
	} else {
		/*
		 * We are either a bootstrap process or a standalone backend. Either
		 * way, start up the XLOG machinery, and register to have it closed
		 * down at exit.
		 */
		startup_xlog();
		on_shmem_exit(shutdown_xlog, 0);
	}

	/*
	 * Initialize the relation cache and the system catalog caches.  Note that
	 * no catalog access happens here; we only set up the hashtable structure.
	 * We must do this before starting a transaction because transaction abort
	 * would try to touch these hashtables.
	 */
	relcache_init_phase1();
	init_catcache_phase1();
	init_plan_cache();

	/* Initialize portal manager */
	start_portal();

	/* Initialize stats collection --- must happen before first xact */
	if (!bootstrap)
		stat_init();

	/*
	 * Load relcache entries for the shared system catalogs. This must 
	 * create at least entries for pg_database and catalogs used for
	 * authentication.
	 */
	relcache_init_phase2();

	/*
	 * Set up process-exit callback to do pre-shutdown cleanup.  This has to
	 * be after we've initialized all the low-level modules like the buffer
	 * manager, because during shutdown this has to run before the low-level
	 * modules start to close down.  On the other hand, we want it in place
	 * before we begin our first transaction --- if we fail during the
	 * initialization transaction, as is entirely possible, we need the
	 * AbortTransaction call to clean up.
	 */
	on_shmem_exit(ShutdownPostgres, 0);

	/* The autovacuum launcher is done here */
	if (is_avl_proc())
		return;

	/*
	 * Start a new transaction here before first access to db, and get a
	 * snapshot. We don't have a use for the snapshot itself, but we're
	 * interested in the secondary effect that it sets recent_global_xmin. (This
	 * is critical for anything that reads heap pages, because HOT may decide
	 * to prune them even if the process doesn't attempt to modify any
	 * tuples.)
	 */
	if (!bootstrap) {
		/* statement_timestamp must be set for timeouts to work correctly */
		set_current_stmt_start();
		start_xact_cmd();
		(void) get_xact_snap();
	}

	/*
	 * Perform client authentication if necessary, then figure out our
	 * postgres user ID, and see if we are a superuser.
	 *
	 * In standalone mode and in autovacuum worker processes, we use a fixed
	 * ID, otherwise we figure it out from the authenticated user name.
	 */
	if (bootstrap || is_avw_proc()) {
		init_session_uidStandalone();
		am_superuser = true;
	} else if (!child) {
		init_session_uidStandalone();
		am_superuser = true;
		if (!ThereIsAtLeastOneRole())
			ereport(WARNING, (
			errcode(E_UNDEFINED_OBJECT),
			errmsg("no roles are defined in this database system"),
			errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
				username)));
	} else {
		/* normal multiuser case */
		ASSERT(proc_port != NULL);
		PerformAuthentication(proc_port);
		init_session_uid(username);
		am_superuser = superuser();
	}

	/*
	 * If we're trying to shut down, only superusers can connect, and new
	 * replication connections are not allowed.
	 */
	if ((!am_superuser || am_walsender) &&
		proc_port != NULL &&
		proc_port->canAcceptConnections == CAC_WAITBACKUP)
	{
		if (am_walsender)
			ereport(FATAL, (
			errcode(E_INSUFFICIENT_PRIVILEGE),
			errmsg("new replication connections are not allowed during database shutdown")));
		else
			ereport(FATAL, (
			errcode(E_INSUFFICIENT_PRIVILEGE),
			errmsg("must be superuser to connect during database shutdown")));
	}

	/*
	 * Binary upgrades only allowed super-user connections
	 */
	if (is_binary_upgrade && !am_superuser) {
		ereport(FATAL, (
		errcode(E_INSUFFICIENT_PRIVILEGE),
		errmsg("must be superuser to connect in binary upgrade mode")));
	}

	/*
	 * The last few connections slots are reserved for superusers. Although
	 * replication connections currently require superuser privileges, we
	 * don't allow them to consume the reserved slots, which are intended for
	 * interactive use.
	 */
	if ((!am_superuser || am_walsender) &&
		reserved_bknds > 0 &&
		!have_nfree_procs(reserved_bknds))
		ereport(FATAL, (
		errcode(E_TOO_MANY_CONNECTIONS),
		errmsg("remaining connection slots are reserved for non-replication superuser connections")));

	/*
	 * If walsender, we don't want to connect to any particular database. Just
	 * finish the backend startup by processing any options from the startup
	 * packet, and we're done.
	 */
	if (am_walsender) {
		ASSERT(!bootstrap);

		/* must have authenticated as a replication role */
		if (!is_authenticated_user_replication_role())
			ereport(FATAL, (
			errcode(E_INSUFFICIENT_PRIVILEGE),
			errmsg("must be replication role to start walsender")));

		/* process any options passed in the startup packet */
		if (proc_port != NULL)
			process_startup_options(proc_port, am_superuser);

		/* Apply post_auth_delay as soon as we've read all options */
		if (post_auth_delay > 0)
			pg_usleep(post_auth_delay * 1000000L);

		/* initialize client encoding */
		init_client_encoding();

		/* report this backend in the struct backend_status array */
		stat_backend_start();

		/* close the transaction we started above */
		commit_xact_cmd();

		return;
	}

	/*
	 * Set up the global variables holding database id and default tablespace.
	 * But note we won't actually try to touch the database just yet.
	 *
	 * We take a shortcut in the bootstrap case, otherwise we have to look up
	 * the db's entry in pg_database.
	 */
	if (bootstrap) {
		current_db_id = TemplateDbOid;
		current_tbs_id = DEFAULT_TBS_OID;
	} else if (in_dbname != NULL) {
		struct heap_tuple *tuple;
		Form_pg_database dbform;

		tuple = GetDatabaseTuple(in_dbname);
		if (!HT_VALID(tuple))
			ereport(FATAL, (
			errcode(E_UNDEFINED_DATABASE),
			errmsg("database \"%s\" does not exist", in_dbname)));

		dbform = (Form_pg_database) GET_STRUCT(tuple);
		current_db_id = HEAPTUP_OID(tuple);
		current_tbs_id = dbform->dattablespace;
		/* take database name from the caller, just for paranoia */
		strlcpy(dbname, in_dbname, sizeof(dbname));
	} else {
		/* caller specified database by OID */
		struct heap_tuple *tuple;
		Form_pg_database dbform;

		tuple = GetDatabaseTupleByOid(dboid);
		if (!HT_VALID(tuple)) {
			ereport(FATAL, (
			errcode(E_UNDEFINED_DATABASE),
			errmsg("database %u does not exist", dboid)));
		}

		dbform = (Form_pg_database) GET_STRUCT(tuple);
		current_db_id = HEAPTUP_OID(tuple);
		current_tbs_id = dbform->dattablespace;
		ASSERT(current_db_id == dboid);
		strlcpy(dbname, NAME_TO_STR(dbform->datname), sizeof(dbname));
		/* pass the database name back to the caller */
		if (out_dbname)
			strcpy(out_dbname, dbname);
	}

	/* Now we can mark our struct proc entry with the database ID */
	/* (We assume this is an atomic store so no lock is needed) */
	current_proc->databaseId = current_db_id;

	/*
	 * Now, take a writer's lock on the database we are trying to connect to.
	 * If there is a concurrently running DROP DATABASE on that database, this
	 * will block us until it finishes (and has committed its update of
	 * pg_database).
	 *
	 * Note that the lock is not held long, only until the end of this startup
	 * transaction.  This is OK since we are already advertising our use of
	 * the database in the struct proc array; anyone trying a DROP DATABASE after
	 * this point will see us there.
	 *
	 * Note: use of ROW_EXCL_LOCK here is reasonable because we envision
	 * our session as being a concurrent writer of the database.  If we had a
	 * way of declaring a session as being guaranteed-read-only, we could use
	 * ACCESS_SHR_LOCK for such sessions and thereby not conflict against
	 * CREATE DATABASE.
	 */
	if (!bootstrap)
		lock_sobj(DatabaseRelationId, current_db_id, 0, ROW_EXCL_LOCK);

	/*
	 * Recheck pg_database to make sure the target database hasn't gone away.
	 * If there was a concurrent DROP DATABASE, this ensures we will die
	 * cleanly without creating a mess.
	 */
	if (!bootstrap) {
		struct heap_tuple *tuple;

		tuple = GetDatabaseTuple(dbname);
		if (!HT_VALID(tuple) ||
			current_db_id != HEAPTUP_OID(tuple) ||
			current_tbs_id != ((Form_pg_database) GET_STRUCT(tuple))->dattablespace)
			ereport(FATAL, (
			errcode(E_UNDEFINED_DATABASE),
			errmsg("database \"%s\" does not exist", dbname),
			errdetail("It seems to have just been dropped or renamed.")));
	}

	/*
	 * Now we should be able to access the database directory safely. Verify
	 * it's there and looks reasonable.
	 */
	fullpath = get_db_path(current_db_id, current_tbs_id);

	if (!bootstrap) {
		if (access(fullpath, F_OK) == -1) {
			if (errno == ENOENT) {
				ereport(FATAL, (
				errcode(E_UNDEFINED_DATABASE),
				errmsg("database \"%s\" does not exist", dbname),
				errdetail("The database subdirectory \"%s\" is missing.", 
					fullpath)));
			} else {
				ereport(FATAL, (
				errcode_file_access(),
				errmsg("could not access directory \"%s\": %m", fullpath)));
			}
		}

		check_version(fullpath);
	}

	set_db_path(fullpath);

	/*
	 * It's now possible to do real access to the system catalogs.
	 *
	 * Load relcache entries for the system catalogs.  This must create at
	 * least the minimum set of "nailed-in" cache entries.
	 */
	relcache_init_phase3();

	/* set up ACL framework (so CheckMyDatabase can check permissions) */
	initialize_acl();

	/*
	 * Re-read the pg_database row for our database, check permissions and set
	 * up database-specific GUC settings.  We can't do this until all the
	 * database-access infrastructure is up.  (Also, it wants to know if the
	 * user is a superuser, so the above stuff has to happen first.)
	 */
	if (!bootstrap)
		CheckMyDatabase(dbname, am_superuser);

	/*
	 * Now process any command-line switches and any additional GUC variable
	 * settings passed in the startup packet.	We couldn't do this before
	 * because we didn't know if client is a superuser.
	 */
	if (proc_port != NULL)
		process_startup_options(proc_port, am_superuser);

	/* Process pg_db_role_setting options */
	process_settings(current_db_id, get_session_uid());

	/* Apply post_auth_delay as soon as we've read all options */
	if (post_auth_delay > 0)
		pg_usleep(post_auth_delay * 1000000L);

	/*
	 * Initialize various default states that can't be set up until we've
	 * selected the active user and gotten the right GUC settings.
	 */

	/* set default namespace search path */
	init_search_path();

	/* initialize client encoding */
	init_client_encoding();

	/* report this backend in the struct backend_status array */
	if (!bootstrap)
		stat_backend_start();

	/* close the transaction we started above */
	if (!bootstrap)
		commit_xact_cmd();
}