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; }