Example #1
0
static OfficeRunner *
new_runner (void)
{
	OfficeRunner *run;

	run = g_new0 (OfficeRunner, 1);
	run->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
					  NULL, NULL);
	run->lid_switch_fd = -1;
	run->client = up_client_new ();
	g_signal_connect (G_OBJECT (run->client), "notify::lid-is-closed",
			  G_CALLBACK (lid_is_closed_cb), run);

	run->ui = gtk_builder_new ();
	gtk_builder_add_from_file (run->ui, PKGDATADIR "office-runner.ui", NULL);
	run->window = WID ("window1");
	run->time_label = WID ("time_label");
	count_tick (NULL, NULL, run);
	run->your_time_label = WID ("your_time_label");

	/* FIXME: No running man for now */
	gtk_widget_set_no_show_all (WID ("run_image"), TRUE);
	gtk_widget_hide (WID ("run_image"));
	gtk_widget_set_no_show_all (WID ("time_image"), TRUE);
	gtk_widget_hide (WID ("time_image"));

	run->large_icon_size = gtk_icon_size_register ("large", 256, 256);
	gtk_image_set_from_icon_name (IWID("trophy_image"), "trophy-silver", run->large_icon_size);

	g_signal_connect (run->window, "delete-event",
			  G_CALLBACK (window_delete_event_cb), run);
	run->run_button = WID ("run_button");
	g_signal_connect (run->run_button, "clicked",
			  G_CALLBACK (run_button_clicked_cb), run);
	run->notebook = WID ("notebook1");

	load_records (run);

	/* Start the blocking here */
	switch_to_page (run, RUN_PAGE);

	return run;
}
int semanage_base_merge_components(
	semanage_handle_t* handle) {

	unsigned int i,j;
	int rc = STATUS_SUCCESS;

	/* Order is important here - change things carefully.
	 * System components first, local next. Verify runs with 
	 * mutual dependencies are ran after everything is merged */
	load_table_t components[] = {

		{ semanage_user_base_dbase_local(handle),
		  semanage_user_base_dbase_policy(handle), MODE_MODIFY },

		{ semanage_user_extra_dbase_local(handle),
		  semanage_user_extra_dbase_policy(handle), MODE_MODIFY },

		{ semanage_port_dbase_local(handle),
		  semanage_port_dbase_policy(handle), MODE_MODIFY },

		{ semanage_iface_dbase_local(handle),
		  semanage_iface_dbase_policy(handle), MODE_MODIFY },
	
		{ semanage_bool_dbase_local(handle),
		  semanage_bool_dbase_policy(handle), MODE_SET },

		{ semanage_fcontext_dbase_local(handle),
		  semanage_fcontext_dbase_policy(handle), MODE_MODIFY },

		{ semanage_seuser_dbase_local(handle),
		  semanage_seuser_dbase_policy(handle), MODE_MODIFY },

		{ semanage_node_dbase_local(handle),
		  semanage_node_dbase_policy(handle), MODE_MODIFY | MODE_SORT },
	};
	const unsigned int CCOUNT = sizeof(components)/sizeof(components[0]);

	/* Merge components into policy (and validate) */
	for (i = 0; i < CCOUNT; i++) {

		record_t** records = NULL;
		unsigned int nrecords = 0;

		dbase_config_t* src = components[i].src;
		dbase_config_t* dst = components[i].dst;
		int mode = components[i].mode;
		record_table_t* rtable = src->dtable->get_rtable(src->dbase);

		/* Must invoke cache function first */
		if (src->dtable->cache(handle, src->dbase) < 0) 
			goto err;
		if (dst->dtable->cache(handle, dst->dbase) < 0) 
			goto err;

		/* List all records */
		if (src->dtable->list(handle, src->dbase, 
			&records, &nrecords) < 0) 
			goto err;

		/* Sort records on MODE_SORT */
		if (mode & MODE_SORT) {
			qsort(records, nrecords, sizeof(record_t*),
				(int (*) (const void*, const void*)) rtable->compare2_qsort);
		}

		/* Clear obsolete ones for MODE_SET */
		if (mode & MODE_SET &&
		    clear_obsolete(handle, records, nrecords, src, dst) < 0) {
			rc = STATUS_ERR;
			goto dbase_exit;
		}

		/* Load records */
		if (load_records(handle, dst, records, nrecords, mode) < 0) {

			rc = STATUS_ERR;
			goto dbase_exit;
		}

		/* Cleanup */
		dbase_exit:
		for (j = 0; j < nrecords; j++)
			rtable->free(records[j]);
		free(records);

		/* Abort on error */
		if (rc < 0)
			goto err;
	}	

	return rc;

	err:
	ERR(handle, "could not merge local modifications into policy");
	return STATUS_ERR;
}