static void uninhibit_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, RBGPMPlugin *plugin) { GError *error = NULL; dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID); if (error != NULL) { if (!ignore_error (error)) { g_warning ("Failed to invoke %s.Inhibit: %s", dbus_g_proxy_get_interface (proxy), error->message); } else { rb_debug ("uninhibit failed: %s", error->message); } g_error_free (error); } else { rb_debug ("uninhibited"); plugin->cookie = 0; } g_object_unref (plugin); }
static gboolean create_dbus_proxy (RBGPMPlugin *plugin) { GError *error = NULL; if (plugin->proxy != NULL) { return TRUE; } /* try new name first */ plugin->proxy = dbus_g_proxy_new_for_name_owner (plugin->bus, "org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", &error); if (error != NULL && ignore_error (error) == FALSE) { g_warning ("Failed to create dbus proxy for org.gnome.SessionManager: %s", error->message); g_error_free (error); return FALSE; } g_signal_connect_object (plugin->proxy, "destroy", G_CALLBACK (proxy_destroy_cb), plugin, 0); return TRUE; }
static void sock_handle_write(int fd, void *data) { if(!data) return; int error = 0; struct mstate_write *wstate = data; assert(fd == wstate->fd); int size_need = wstate->size - wstate->offset; int size_write = write(fd, wstate->buf + wstate->offset, size_need); debug("sock_handle_write fd %d, offset %d, size %d\n", fd, wstate->offset, wstate->size); if(size_write == -1) { warning("sock_handle_write(%s)\n", strerror(errno)); if(ignore_error(errno)) { sock_set_event(fd, SOCK_EVENT_WR); sock_register_event(fd, NULL, NULL, sock_handle_write, wstate); } else { error = 1; WPF *handle = wstate->callback; void *data = wstate->data; int res = wstate->offset; safe_free(wstate->buf); safe_free(wstate); handle(error, data, res); } return; } wstate->offset += size_write; if(wstate->offset < wstate->size) { sock_set_event(fd, SOCK_EVENT_WR); sock_register_event(fd, NULL, NULL, sock_handle_write, wstate); } else { WPF *handle = wstate->callback; void *data = wstate->data; int res = wstate->offset; safe_free(wstate->buf); safe_free(wstate); handle(0, data, res); } }
static void sock_handle_sendfile(int fd, void *data) { int error = 0; struct fstate_write *fs = data; assert(fs->out_fd == fd); int size_need = fs->size - fs->size_sent; int size_write = sendfile(fs->out_fd, fs->in_fd, (off_t *)&fs->offset, size_need); int res = 0; if(size_write == -1) { warning("sock_handle_sendfile fd %d %s\n", fd, strerror(errno)); if(ignore_error(errno)) { sock_set_event(fd, SOCK_EVENT_WR); sock_register_event(fd, NULL, NULL, sock_handle_sendfile, fs); } else { s_error("sock_handle_sendfile fd %d %s\n", fd, strerror(errno)); error = 1; WPF *handle = fs->callback; void *data = fs->data; res = fs->size_sent; safe_free(fs); handle(error, data, res); } return; } fs->size_sent += size_write; if(fs->size_sent < fs->size) { sock_set_event(fd, SOCK_EVENT_WR); sock_register_event(fd, NULL, NULL, sock_handle_sendfile, fs); } else { WPF *handle = fs->callback; res = fs->size_sent; void *data = fs->data; safe_free(fs); handle(error, data, res); } }