/* 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; }
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; }
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); } }
/* -------------------------------- * 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(); }