int list_tasks_worker(worker_t * worker, GError ** error) { struct bulk_s { char id[MAX_TASKID_LENGTH]; gint64 period; guint8 busy; // used to compute the length of the structure without padding, with // the help of offsetof(). gchar last[]; } bulk; GHashTableIter iter; gpointer k, v; GByteArray *gba = g_byte_array_new(); g_hash_table_iter_init(&iter, tasks); while (g_hash_table_iter_next(&iter, &k, &v)) { task_t *t; if (!(t = v)) continue; memset(&bulk, 0, sizeof(bulk)); g_strlcpy(bulk.id, t->id, sizeof(bulk.id)); bulk.period = t->period; bulk.busy = BOOL(t->busy); g_byte_array_append(gba, (guint8*)&bulk, offsetof(struct bulk_s, last)); } return __respond(worker, 1, gba, error); }
int list_tasks_worker(worker_t * worker, GError ** error) { struct bulk_s { char id[MAX_TASKID_LENGTH]; long next_schedule; gboolean busy; gchar last[]; } bulk; GHashTableIter iter; gpointer k, v; GByteArray *gba = g_byte_array_new(); g_hash_table_iter_init(&iter, tasks); while (g_hash_table_iter_next(&iter, &k, &v)) { task_t *t; if (!(t = v)) continue; memset(&bulk, 0, sizeof(bulk)); g_strlcpy(bulk.id, t->id, sizeof(bulk.id)); bulk.next_schedule = t->next_schedule; bulk.busy = t->busy; g_byte_array_append(gba, (guint8*)&bulk, offsetof(struct bulk_s, last)); } return __respond(worker, 1, gba, error); }
int services_worker_list_local(worker_t * worker, GError ** error) { GSList *services; GByteArray *gba; response_t response; memset(&response, 0, sizeof(response_t)); services = build_local_service_info_list(); gba = service_info_marshall_gba(services, error); g_slist_free(services); if (!gba) { GSETERROR(error, "service_info list serialization error"); return __respond_error(worker, error ? *error : NULL, NULL); } return __respond(worker, 1, gba, error); }