static gboolean on_unlock (SharedResource *lock, GDBusMethodInvocation *invocation, gpointer user_data) { printf("Unlocking BIOS Flash\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); shared_resource_complete_unlock(lock,invocation); return TRUE; }
static void on_download_error (GDBusConnection* connection, const gchar* sender_name, const gchar* object_path, const gchar* interface_name, const gchar* signal_name, GVariant* parameters, gpointer user_data) { Flash *flash = object_get_flash((Object*)user_data); SharedResource *lock = object_get_shared_resource((Object*)user_data); printf("ERROR: FlashBios: Download error; clearing flash lock\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); }
static gboolean on_error(Flash *flash, GDBusMethodInvocation *invocation, gchar* error_msg, gpointer user_data) { SharedResource *lock = object_get_shared_resource((Object*)user_data); shared_resource_get_lock(lock); flash_set_status(flash, error_msg); flash_complete_error(flash,invocation); printf("ERROR: %s. Clearing locks\n",error_msg); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); return TRUE; }
static void on_flash_done (GDBusConnection* connection, const gchar* sender_name, const gchar* object_path, const gchar* interface_name, const gchar* signal_name, GVariant* parameters, gpointer user_data) { Flash *flash = object_get_flash((Object*)user_data); SharedResource *lock = object_get_shared_resource((Object*)user_data); printf("Flash succeeded; unlocking flash\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); flash_set_status(flash,"Flash Done"); }
static gboolean on_lock(SharedResource *lock, GDBusMethodInvocation *invocation, gchar* name, gpointer user_data) { gboolean locked = shared_resource_get_lock(lock); if(locked) { const gchar* name = shared_resource_get_name(lock); printf("ERROR: BIOS Flash is already locked: %s\n",name); } else { printf("Locking BIOS Flash: %s\n",name); shared_resource_set_lock(lock,true); shared_resource_set_name(lock,name); } shared_resource_complete_lock(lock,invocation); return TRUE; }
static gboolean on_done(Flash *flash, GDBusMethodInvocation *invocation, gpointer user_data) { int rc = 0; SharedResource *lock = object_get_shared_resource((Object*)user_data); shared_resource_get_lock(lock); flash_set_status(flash, "Flash Done"); flash_complete_done(flash,invocation); printf("Flash Done. Clearing locks\n"); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); const gchar* filename = flash_get_filename(flash); rc = unlink(filename); if(rc != 0 ) { printf("ERROR: Unable to delete file %s (%d)\n",filename,rc); } return TRUE; }
static void on_bus_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) { ObjectSkeleton *object; cmdline *cmd = user_data; manager = g_dbus_object_manager_server_new(dbus_object_path); int i=0; //TODO: don't use fixed buffer char flasher_path[512]; memset(flasher_path, '\0', sizeof(flasher_path)); gchar *flasher_file = NULL; int c = strlen(cmd->argv[0]); while(c>0) { if(cmd->argv[0][c] == '/') { strncpy(flasher_path,cmd->argv[0],c); flasher_file = g_strdup_printf("%s/%s",flasher_path,FLASHER_BIN); break; } c--; } const char* inst[] = {"bios"}; for(i=0;i<1;i++) { gchar* s; s = g_strdup_printf("%s/%s",dbus_object_path,inst[i]); object = object_skeleton_new(s); g_free(s); Flash* flash = flash_skeleton_new(); object_skeleton_set_flash(object, flash); g_object_unref(flash); SharedResource* lock = shared_resource_skeleton_new(); object_skeleton_set_shared_resource(object, lock); g_object_unref(lock); shared_resource_set_lock(lock,false); shared_resource_set_name(lock,""); flash_set_flasher_path(flash,flasher_file); flash_set_flasher_name(flash,FLASHER_BIN); flash_set_flasher_instance(flash,inst[i]); //g_free (s); //define method callbacks here g_signal_connect(lock, "handle-lock", G_CALLBACK(on_lock), NULL); /* user_data */ g_signal_connect(lock, "handle-unlock", G_CALLBACK(on_unlock), NULL); /* user_data */ g_signal_connect(lock, "handle-is-locked", G_CALLBACK(on_is_locked), NULL); /* user_data */ g_signal_connect(flash, "handle-update", G_CALLBACK(on_update), object); /* user_data */ g_signal_connect(flash, "handle-error", G_CALLBACK(on_error), object); /* user_data */ g_signal_connect(flash, "handle-done", G_CALLBACK(on_done), object); /* user_data */ g_signal_connect(flash, "handle-update-via-tftp", G_CALLBACK(on_update_via_tftp), object); /* user_data */ g_signal_connect(flash, "handle-init", G_CALLBACK(on_init), object); /* user_data */ s = g_strdup_printf("/org/openbmc/control/%s",inst[i]); g_dbus_connection_signal_subscribe(connection, NULL, "org.openbmc.FlashControl", "Progress", s, NULL, G_DBUS_SIGNAL_FLAGS_NONE, (GDBusSignalCallback) on_flash_progress, object, NULL ); g_free(s); flash_set_filename(flash,""); /* Export the object (@manager takes its own reference to @object) */ g_dbus_object_manager_server_set_connection(manager, connection); g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object)); g_object_unref(object); } g_free(flasher_file); }