static void _PrintSubscriptionResultsList(GSList *sub_list) { for (; sub_list != NULL; sub_list = g_slist_next(sub_list)) { LSMessage *msg = sub_list->data; /* We may get error messages if the service goes down between the * time we find out about it and send the subscription info request */ if (!LSMessageIsHubErrorMessage(msg)) { const char *sub_text = LSMessageGetPayload(msg); const char *service = LSMessageGetSenderServiceName(msg); fprintf(stdout, "%s: %s\n", service, sub_text); } LSMessageUnref(msg); } fprintf(stdout, "\n"); }
bool _LSPrivateGetSubscriptions(LSHandle* sh, LSMessage *message, void *ctx) { LSError lserror; LSErrorInit(&lserror); const char *sender = LSMessageGetSenderServiceName(message); if (!sender || strcmp(sender, MONITOR_NAME) != 0) { g_critical("WARNING: subscription debug method not called by monitor;" " ignoring (service name: %s, unique_name: %s)", sender, LSMessageGetSender(message)); return true; } struct json_object *ret_obj = NULL; bool json_ret = _LSSubscriptionGetJson(sh, &ret_obj, &lserror); if (!json_ret) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); return true; } bool reply_ret = LSMessageReply(sh, message, json_object_to_json_string(ret_obj), &lserror); if (!reply_ret) { g_critical("%s: sending subscription info failed", __FUNCTION__); LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } json_object_put(ret_obj); return true; }
bool _LSPrivateGetMallinfo(LSHandle* sh, LSMessage *message, void *ctx) { LSError lserror; LSErrorInit(&lserror); struct json_object *ret_obj = NULL; struct json_object *true_obj = NULL; struct json_object *mallinfo_obj = NULL; struct json_object *allocator_name_obj = NULL; struct json_object *slot_a_obj = NULL; struct json_object *slot_d_obj = NULL; struct json_object *slot_e_obj = NULL; struct json_object *slot_f_obj = NULL; struct json_object *slot_h_obj = NULL; struct json_object *slot_i_obj = NULL; struct json_object *slot_j_obj = NULL; const char *sender = LSMessageGetSenderServiceName(message); if (!sender || strcmp(sender, MONITOR_NAME) != 0) { g_critical("WARNING: mallinfo debug method not called by monitor;" " ignoring (service name: %s, unique_name: %s)", sender, LSMessageGetSender(message)); return true; } ret_obj = json_object_new_object(); if (JSON_ERROR(ret_obj)) goto error; true_obj = json_object_new_boolean(true); if (JSON_ERROR(true_obj)) goto error; mallinfo_obj = json_object_new_object(); if (JSON_ERROR(mallinfo_obj)) goto error; /* returnValue: true, * mallinfo: {key: int,...} */ typedef struct mallinfo (*mallinfo_t)(); static mallinfo_t mallinfo_p = NULL; if (mallinfo_p == NULL) { mallinfo_p = (mallinfo_t)dlsym(RTLD_DEFAULT, "mallinfo"); if (mallinfo_p == NULL) mallinfo_p = (mallinfo_t)-1; } struct mallinfo mi; if (mallinfo_p != (mallinfo_t)-1) { mi = mallinfo_p(); } else { memset(&mi, '\0', sizeof(mi)); } allocator_name_obj = json_object_new_string("ptmalloc"); if (JSON_ERROR(allocator_name_obj)) goto error; slot_a_obj = json_object_new_int(mi.arena); if (JSON_ERROR(slot_a_obj)) goto error; slot_d_obj = json_object_new_int(mi.hblks); if (JSON_ERROR(slot_d_obj)) goto error; slot_e_obj = json_object_new_int(mi.hblkhd); if (JSON_ERROR(slot_e_obj)) goto error; slot_f_obj = json_object_new_int(mi.usmblks); if (JSON_ERROR(slot_f_obj)) goto error; slot_h_obj = json_object_new_int(mi.uordblks); if (JSON_ERROR(slot_h_obj)) goto error; slot_i_obj = json_object_new_int(mi.fordblks); if (JSON_ERROR(slot_i_obj)) goto error; slot_j_obj = json_object_new_int(mi.keepcost); if (JSON_ERROR(slot_j_obj)) goto error; json_object_object_add(mallinfo_obj, "allocator", allocator_name_obj); json_object_object_add(mallinfo_obj, "sbrk_bytes", slot_a_obj); json_object_object_add(mallinfo_obj, "mmap_count", slot_d_obj); json_object_object_add(mallinfo_obj, "mmap_bytes", slot_e_obj); json_object_object_add(mallinfo_obj, "max_malloc_bytes", slot_f_obj); json_object_object_add(mallinfo_obj, "malloc_bytes", slot_h_obj); json_object_object_add(mallinfo_obj, "slack_bytes", slot_i_obj); json_object_object_add(mallinfo_obj, "trimmable_slack_bytes", slot_j_obj); json_object_object_add(ret_obj, "returnValue", true_obj); json_object_object_add(ret_obj, "mallinfo", mallinfo_obj); bool reply_ret = LSMessageReply(sh, message, json_object_to_json_string(ret_obj), &lserror); if (!reply_ret) { g_critical("%s: sending malloc info failed", __FUNCTION__); LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } json_object_put(ret_obj); return true; error: if (!JSON_ERROR(ret_obj)) json_object_put(ret_obj); if (!JSON_ERROR(true_obj)) json_object_put(true_obj); if (!JSON_ERROR(mallinfo_obj)) json_object_put(mallinfo_obj); if (!JSON_ERROR(allocator_name_obj)) json_object_put(allocator_name_obj); if (!JSON_ERROR(slot_a_obj)) json_object_put(slot_a_obj); if (!JSON_ERROR(slot_d_obj)) json_object_put(slot_d_obj); if (!JSON_ERROR(slot_e_obj)) json_object_put(slot_e_obj); if (!JSON_ERROR(slot_f_obj)) json_object_put(slot_f_obj); if (!JSON_ERROR(slot_h_obj)) json_object_put(slot_h_obj); if (!JSON_ERROR(slot_i_obj)) json_object_put(slot_i_obj); if (!JSON_ERROR(slot_j_obj)) json_object_put(slot_j_obj); return true; }
bool _LSSubscriptionGetJson(LSHandle *sh, jvalue_ref *ret_obj, LSError *lserror) { _Catalog *catalog = sh->catalog; const char *key = NULL; _SubList *sub_list = NULL; GHashTableIter iter; jvalue_ref true_obj = NULL; jvalue_ref array = NULL; jvalue_ref cur_obj = NULL; jvalue_ref sub_array = NULL; jvalue_ref key_name = NULL; jvalue_ref message_obj = NULL; jvalue_ref sub_array_item = NULL; jvalue_ref unique_name_obj = NULL; jvalue_ref service_name_obj = NULL; *ret_obj = jobject_create(); if (*ret_obj == NULL) goto error; true_obj = jboolean_create(true); if (true_obj == NULL) goto error; array = jarray_create(NULL); if (array == NULL) goto error; /* returnValue: true, * subscriptions: [ * { key: key_name, subscribers: [{unique_name: , service_name: }, ...] }, * ... * ] */ _CatalogLock(catalog); g_hash_table_iter_init(&iter, catalog->subscription_lists); while (g_hash_table_iter_next(&iter, (gpointer)&key, (gpointer)&sub_list)) { cur_obj = jobject_create(); if (cur_obj == NULL) goto error; sub_array = jarray_create(NULL); if (sub_array == NULL) goto error; key_name = jstring_create_copy(j_cstr_to_buffer(key)); if (key_name == NULL) goto error; /* iterate over SubList */ int i = 0; const char *token = NULL; const int len = _SubListLen(sub_list); for (i = 0; i < len; i++) { token = _SubListGet(sub_list, i); if (token) { _Subscription *sub = g_hash_table_lookup(catalog->token_map, token); if (!sub) continue; LSMessage *msg = sub->message; const char *unique_name = LSMessageGetSender(msg); const char *service_name = LSMessageGetSenderServiceName(msg); const char *message_body = LSMessageGetPayload(msg); /* create subscribers item and add to sub_array */ sub_array_item = jobject_create(); if (sub_array_item == NULL) goto error; unique_name_obj = unique_name ? jstring_create_copy(j_cstr_to_buffer(unique_name)) : jstring_empty(); if (unique_name_obj == NULL) goto error; service_name_obj = service_name ? jstring_create_copy(j_cstr_to_buffer(service_name)) : jstring_empty(); if (service_name_obj == NULL) goto error; message_obj = message_body ? jstring_create_copy(j_cstr_to_buffer(message_body)) : jstring_empty(); if (message_obj == NULL) goto error; jobject_put(sub_array_item, J_CSTR_TO_JVAL("unique_name"), unique_name_obj); jobject_put(sub_array_item, J_CSTR_TO_JVAL("service_name"), service_name_obj); jobject_put(sub_array_item, J_CSTR_TO_JVAL("subscription_message"), message_obj); jarray_append(sub_array, sub_array_item); sub_array_item = NULL; unique_name_obj = NULL; service_name_obj = NULL; message_obj = NULL; } } jobject_put(cur_obj, J_CSTR_TO_JVAL("key"), key_name); jobject_put(cur_obj, J_CSTR_TO_JVAL("subscribers"), sub_array); jarray_append(array, cur_obj); key_name = NULL; cur_obj = NULL; sub_array = NULL; } jobject_put(*ret_obj, J_CSTR_TO_JVAL("returnValue"), true_obj); jobject_put(*ret_obj, J_CSTR_TO_JVAL("subscriptions"), array); _CatalogUnlock(catalog); return true; error: _CatalogUnlock(catalog); j_release(ret_obj); j_release(&true_obj); j_release(&array); j_release(&cur_obj); j_release(&sub_array); j_release(&key_name); j_release(&sub_array_item); j_release(&unique_name_obj); j_release(&service_name_obj); return false; }