Esempio n. 1
0
static gboolean
backend_repo_enable_thread (PkBackend *backend)
{
	GError *error = NULL;

	const gchar *repo;
	gboolean enabled;

	g_return_val_if_fail (pacman != NULL, FALSE);
	g_return_val_if_fail (disabled_repos != NULL, FALSE);
	g_return_val_if_fail (backend != NULL, FALSE);

	repo = pk_backend_get_string (backend, "repo_id");
	enabled = pk_backend_get_bool (backend, "enabled");

	g_return_val_if_fail (repo != NULL, FALSE);

	if (enabled) {
		/* check that repo is indeed disabled */
		if (g_hash_table_remove (disabled_repos, repo)) {
			/* reload configuration to preserve the correct order */
			if (disabled_repos_configure (disabled_repos, &error)) {
				pk_backend_repo_list_changed (backend);
			} else {
				backend_error (backend, error);
				pk_backend_thread_finished (backend);
				return FALSE;
			}
		} else {
			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Could not find repo [%s]", repo);
			pk_backend_thread_finished (backend);
			return FALSE;
		}
	} else {
		PacmanDatabase *database = pacman_manager_find_sync_database (pacman, repo);

		if (database != NULL) {
			if (pacman_manager_unregister_database (pacman, database, &error)) {
				g_hash_table_insert (disabled_repos, g_strdup (repo), GINT_TO_POINTER (1));
			} else {
				backend_error (backend, error);
				pk_backend_thread_finished (backend);
				return FALSE;
			}
		} else {
			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_FOUND, "Could not find repo [%s]", repo);
			pk_backend_thread_finished (backend);
			return FALSE;
		}
	}

	pk_backend_thread_finished (backend);
	return TRUE;
}
Esempio n. 2
0
////////////////////////////////////////////////////////////
// Argument Parsing
////////////////////////////////////////////////////////////
void Sigil::parseOptions(int argc, char *argv[])
{
    /* custom parsing, by order of the arguments */
    ArgGroup arg_group;

    /* Pass through args to frontend/backend. */
    arg_group.addGroup(frontend, false);
    arg_group.addGroup(backend, true);
    arg_group.addGroup(executable, true);
    arg_group.parse(argc, argv);

    /* The number of 'threads' Sigil2 will use */
    /* MDL20160805 Currently only valid with DynamoRIO frontend. 
     * This will cause 'n' event streams between Sigil2 and DynamoRIO
     * to be generated, and 'n' separate backend instances will
     * read from those event streams as separate threads */
    num_threads = 1;
    if (arg_group.getOpt(numthreads).empty() == false)
    {
        num_threads = stoi(arg_group.getOpt(numthreads));
        if (num_threads > 16 || num_threads < 1)
        {
            SigiLog::fatal("Invalid number of threads specified");
        }
    }

    /* check frontend */
    std::string frontend_name;

    if (arg_group.getGroup(frontend).empty() == false)
    {
        frontend_name = arg_group.getGroup(frontend)[0];
    }
    else /*set default*/
    {
        frontend_name = "valgrind"; //default
    }

    std::transform(frontend_name.begin(), frontend_name.end(), frontend_name.begin(), ::tolower);

    if (frontend_registry.find(frontend_name) != frontend_registry.cend())
    {
        start_frontend = [this, arg_group, frontend_name]() mutable
        {
            Sigil::Args args;
            if (arg_group.getGroup(frontend).size() > 1)
            {
                auto start = arg_group.getGroup(frontend).cbegin() + 1;
                auto end = arg_group.getGroup(frontend).cend();
                args = {start, end};
            }

            frontend_registry[frontend_name](arg_group.getGroup(executable),
                                             args,
                                             num_threads,
                                             instance_id);
        };
    }
    else
    {
        std::string frontend_error(" invalid frontend argument ");
        frontend_error.append(frontend_name).append("\n");

        frontend_error.append("\tAvailable frontends: ");

        for (auto p : frontend_registry)
        {
            frontend_error.append("\n\t").append(p.first);
        }

        SigiLog::fatal(frontend_error);
    }

    /* check backend */
    std::string backend_name = arg_group.getGroup(backend)[0];
    std::transform(backend_name.begin(), backend_name.end(), backend_name.begin(), ::tolower);

    if (backend_registry.find(backend_name) != backend_registry.cend())
    {
        /* send args to backend */
        Sigil::Args args;

        if (arg_group.getGroup(backend).size() > 1)
        {
            auto start = arg_group.getGroup(backend).cbegin() + 1;
            auto end = arg_group.getGroup(backend).cend();
            args = {start, end};
        }

        /* Register the backend
         *
         * Each backend thread creates a new
         * backend instance via 'create_backend' */
        parse_backend = [this, backend_name, args]()
        {
            std::get<1>(backend_registry[backend_name])(args);
        };
        create_backend = std::get<0>(backend_registry[backend_name]);
        exit_backend = std::get<2>(backend_registry[backend_name]);
    }
    else
    {
        std::string backend_error(" invalid backend argument ");
        backend_error.append(backend_name).append("\n");

        backend_error.append("\tAvailable backends: ");

        for (auto p : backend_registry)
        {
            backend_error.append("\n\t").append(p.first);
        }

        SigiLog::fatal(backend_error);
    }
}