{"action":"created","comment":{"url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/comments/40851094","id":40851094,"diff_hunk":"@@ -0,0 +1,302 @@\n+#include <stdio.h>\n+#include <dlfcn.h>\n+#include <iostream>\n+#include <unistd.h>\n+#include <assert.h>\n+#include <dirent.h>\n+#include <gio/gio.h>\n+#include <string.h>\n+#include <stdlib.h>\n+#include <map>\n+#include \"./ipmid.H\"\n+\n+using namespace std;\n+\n+// Global data structure that contains the IPMI command handler's registrations.\n+std::map<ipmi_fn_cmd_t, ipmi_fn_context_t> g_ipmid_router_map;\n+typedef std::map<ipmi_fn_cmd_t, ipmi_fn_context_t>::iterator router_iter_t;\n+\n+// Method that gets called by shared libraries to get their command handlers registered\n+void register_callback(ipmi_netfn_t netfn, ipmi_cmd_t cmd,\n+                       ipmi_context_t context, ipmid_callback_t handler)\n+{\n+    ipmi_fn_cmd_t netfn_and_cmd;\n+    ipmi_fn_context_t handler_and_context;\n+\n+    // Pack NetFn and Command in one.\n+    netfn_and_cmd = std::make_pair(netfn, cmd);\n+\n+    // Pack Function handler and Data in another.\n+    handler_and_context = std::make_pair(handler, context);\n+\n+    // Check if the registration has already been made..\n+    router_iter_t iter = g_ipmid_router_map.find(netfn_and_cmd);\n+    if(iter != g_ipmid_router_map.end())\n+    {\n+        printf(\"ERROR : Duplicate registration for NetFn [0x%X], Cmd:[0x%X]\\n\",netfn, cmd);\n+    }\n+    else\n+    {\n+        // This is a fresh registration.. Add it to the map.\n+        g_ipmid_router_map.insert(make_pair(netfn_and_cmd, handler_and_context));\n+    }\n+\n+    return;\n+}\n+\n+// Looks at the map and calls corresponding handler functions.\n+int ipmi_netfn_router(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request,\n+                      ipmi_response_t response, unsigned int *data_len)\n+{\n+    // return from the Command handlers.\n+    int rc = 0;\n+\n+    // Extract Handler and context from Map.\n+    ipmi_fn_context_t handler_and_context;\n+\n+    // Walk the map that has the registered handlers and invoke the approprite\n+    // handlers for matching commands.\n+    router_iter_t iter = g_ipmid_router_map.find(make_pair(netfn, cmd));\n+    if(iter == g_ipmid_router_map.end())\n+    {\n+        printf(\"No registered handlers for NetFn:[0x%X], Cmd:[0x%X]\"\n+               \" trying Wilcard implementation \\n\",netfn, cmd);\n+\n+        // Now that we did not find any specific [NetFn,Cmd], tuple, check for\n+        // NetFn, WildCard command present.\n+        iter = g_ipmid_router_map.find(make_pair(netfn, IPMI_CMD_WILDCARD));\n+        if(iter == g_ipmid_router_map.end())\n+        {\n+            printf(\"No Registered handlers for NetFn:[0x%X],Cmd:[0x%X]\\n\",netfn, IPMI_CMD_WILDCARD);\n+            return CC_INVALID;\n+        }\n+    }\n+\n+#ifdef __IPMI_DEBUG__\n+    // We have either a perfect match -OR- a wild card atleast,\n+    printf(\"Calling Net function:[0x%X], Command:[0x%X]\\n\", netfn, cmd);\n+#endif\n+\n+    // Extract the map data onto appropriate containers.\n+    handler_and_context = iter->second;\n+\n+    rc = (handler_and_context.first) (netfn, cmd, request, response,\n+                                      data_len, handler_and_context.second);\n+\n+    return rc;\n+}\n+\n+// This gets called by Glib loop on seeing a Dbus signal \n+static void handle_ipmi_command(GDBusProxy *proxy,\n+                        gchar      *sender_name,\n+                        gchar      *signal_name,\n+                        GVariant   *parameters,\n+                        gpointer    user_data)\n+{\n+    // Used to re-construct the message into IPMI specific ones.\n+    guchar *parameters_str;\n+    unsigned char sequence, netfn, cmd;\n+\n+    // Request and Response buffer.\n+    unsigned char request[MAX_IPMI_BUFFER] = {0};\n+    unsigned char response[MAX_IPMI_BUFFER] = {0};\n+\n+    unsigned int msg_length = 0;\n+    unsigned int data_len = 0;\n+\n+    // Response from Net Function Router\n+    int rc = 0;\n+\n+    // Variables to marshall and unmarshall the messages.\n+    GVariantIter *iter;\n+    guchar data;\n+    GVariant *dbus_response;\n+    GVariantBuilder *builder;\n+\n+    // Pretty print the message that came on Dbus\n+    parameters_str = (guchar *) g_variant_print (parameters, TRUE);\n+    g_print (\"*** Received Signal: %s: %s :%s\\n\",\n+            signal_name,\n+            sender_name,\n+            parameters_str);\n+\n+    // Consume the data pattern \"<bYte><bYte><bYte><Array_of_bYtes>\n+    g_variant_get(parameters, \"(yyyay)\", &sequence, &netfn, &cmd, &iter);\n+\n+    printf(\"Sequence: %x\\n\",sequence );\n+    printf(\"Netfn   : %x\\n\",netfn );\n+    printf(\"Cmd     : %x\\n\",cmd );\n+\n+    // Further break down the GVariant byte array\n+    while (g_variant_iter_loop (iter, \"y\", &data))\n+    {\n+        request[msg_length++] = data;\n+    }\n+\n+    // Done with consuming data.\n+    g_free (parameters_str);\n+\n+    // Needed to see what we get back from the handlers.\n+    data_len = msg_length;\n+\n+    // Now that we have parsed the entire byte array from the caller \n+    // we can call the ipmi router to do the work...\n+    rc = ipmi_netfn_router(netfn, cmd, (void *)request, (void *)response, &data_len);\n+    if(rc == 0)\n+    {\n+        printf(\"SUCCESS handling NetFn:[0x%X], Cmd:[0x%X]\\n\",netfn, cmd);\n+    }\n+    else\n+    {\n+        printf(\"ERROR:[0x%X] handling NetFn:[0x%X], Cmd:[0x%X]\\n\",rc, netfn, cmd);\n+    }\n+\n+    // TODO mark the write bit\n+    // Now build a response Gvariant package\n+    // This example may help\n+    // http://stackoverflow.com/questions/22937588/how-to-send-byte-array-over-gdbus\n+\n+    printf(\"Bytes to return\\n\");\n+   // hexdump(response,data_len);\n+\n+    // Now we need to put the data as \"Array Of Bytes\" as we got them.\n+    builder = g_variant_builder_new (G_VARIANT_TYPE (\"ay\"));\n+\n+    for (uint out_data = 0; out_data < data_len; out_data++)\n+    {\n+        g_variant_builder_add (builder, \"y\", response[out_data]);\n+    }\n+\n+    dbus_response = g_variant_new (\"(yyyay)\", sequence, netfn+1, cmd, builder);\n+\n+    // Variant builder is no longer needed.\n+    g_variant_builder_unref (builder);\n+\n+    parameters_str = (guchar *) g_variant_print (dbus_response, TRUE);\n+    g_print (\" *** Response Signal :%s\\n\", parameters_str);\n+\n+    // Done packing the data.\n+    g_free (parameters_str);\n+\n+    // NOW send the respone message in the Dbus calling \"sendMessage\" interface.\n+    g_dbus_proxy_call_sync (proxy,\n+            \"sendMessage\",\n+            dbus_response,\n+            G_DBUS_CALL_FLAGS_NONE,\n+            -1,\n+            NULL,\n+            NULL);\n+}\n+\n+//----------------------------------------------------------------------\n+// handler_select\n+// Select all the files ending with with .so. in the given diretcory\n+// @d: dirent structure containing the file name\n+//----------------------------------------------------------------------\n+int handler_select(const struct dirent *entry)\n+{\n+    if(strstr(entry->d_name, LIBRARY_EXTN))\n+    {\n+        return 1;\n+    }\n+\n+    return 0;\n+}\n+\n+// This will do a dlopen of every .so in ipmi_lib_path and will dlopen everything so that they will\n+// register a callback handler \n+void register_callback_handlers(const char* ipmi_lib_path)\n+{\n+    // For walking the ipmi_lib_path\n+    struct dirent **handler_list;\n+    int num_handlers = 0;\n+\n+    // This is used to check and abort if someone tries to register a bad one.\n+    void *lib_handler = NULL;\n+\n+    if(ipmi_lib_path == NULL)\n+    {\n+        printf(\"ERROR; No handlers to be registered for ipmi.. Aborting\\n\");\n+        assert(0);\n+    }\n+    else\n+    {\n+        // 1: Open ipmi_lib_path. Its usually \"/usr/lib/phosphor-host-ipmid\"\n+        // 2: Scan the directory for the files that end with .so\n+        // 3: For each one of them, just do a 'dlopen' so that they register \n+        //    the handlers for callback routines.\n+\n+        std::string handler_fqdn = ipmi_lib_path;\n+        \n+        // Append a \"/\" since we need to add the name of the .so. If there is\n+        // already a .so, adding one more is not any harm.\n+        handler_fqdn += \"/\";\n+\n+        num_handlers = scandir(ipmi_lib_path, &handler_list, handler_select, alphasort);\n+        while(num_handlers--)\n+        {\n+            printf(\"Registering handler:[%s]\\n\",handler_list[num_handlers]->d_name);\n+\n+            handler_fqdn += handler_list[num_handlers]->d_name;\n+            lib_handler = dlopen(handler_fqdn.c_str(), RTLD_NOW);\n+            if(lib_handler == NULL)\n+            {\n+                printf(\"ERROR opening:[%s]\\n\",handler_list[num_handlers]->d_name);\n+                dlerror();\n+            }\n+            // Wipe the memory allocated for this particular entry.\n+            free(handler_list[num_handlers]);\n+        }\n+        // Done with all registration.\n+        free(handler_list);\n+    }\n+\n+    // TODO : What to be done on the memory that is given by dlopen ?.\n+    return;\n+}\n+\n+int main(int argc, char *argv[])\n+{\n+    // Register all the handlers that provider implementation to IPMI commands.\n+    register_callback_handlers(HOST_IPMI_LIB_PATH);\n+\n+#ifdef __IPMI_DEBUG__\n+    printf(\"Registered Function handlers:\\n\");\n+\n+    // Print the registered handlers and their arguments.\n+    router_iter_t iter;\n+    for(iter = g_ipmid_router_map.begin() ; iter != g_ipmid_router_map.end(); iter++)","path":"ipmid.C","position":268,"original_position":268,"commit_id":"ce34f859ccb185ad2645ebe2c4aacd16b0a77cd9","original_commit_id":"ce34f859ccb185ad2645ebe2c4aacd16b0a77cd9","user":{"login":"williamspatrick","id":105009,"avatar_url":"https://avatars.githubusercontent.com/u/105009?v=3","gravatar_id":"","url":"https://api.github.com/users/williamspatrick","html_url":"https://github.com/williamspatrick","followers_url":"https://api.github.com/users/williamspatrick/followers","following_url":"https://api.github.com/users/williamspatrick/following{/other_user}","gists_url":"https://api.github.com/users/williamspatrick/gists{/gist_id}","starred_url":"https://api.github.com/users/williamspatrick/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/williamspatrick/subscriptions","organizations_url":"https://api.github.com/users/williamspatrick/orgs","repos_url":"https://api.github.com/users/williamspatrick/repos","events_url":"https://api.github.com/users/williamspatrick/events{/privacy}","received_events_url":"https://api.github.com/users/williamspatrick/received_events","type":"User","site_admin":false},"body":"C++11 style:\r\n\r\nfor(auto& iter : g_ipmid_router_map)","created_at":"2015-09-30T21:00:55Z","updated_at":"2015-09-30T21:00:55Z","html_url":"https://github.com/openbmc/phosphor-host-ipmid/pull/1#discussion_r40851094","pull_request_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/comments/40851094"},"html":{"href":"https://github.com/openbmc/phosphor-host-ipmid/pull/1#discussion_r40851094"},"pull_request":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1","id":46390027,"html_url":"https://github.com/openbmc/phosphor-host-ipmid/pull/1","diff_url":"https://github.com/openbmc/phosphor-host-ipmid/pull/1.diff","patch_url":"https://github.com/openbmc/phosphor-host-ipmid/pull/1.patch","issue_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/1","number":1,"state":"open","locked":false,"title":"Initial IPMI Net Function router","user":{"login":"vishwabmc","id":13940109,"avatar_url":"https://avatars.githubusercontent.com/u/13940109?v=3","gravatar_id":"","url":"https://api.github.com/users/vishwabmc","html_url":"https://github.com/vishwabmc","followers_url":"https://api.github.com/users/vishwabmc/followers","following_url":"https://api.github.com/users/vishwabmc/following{/other_user}","gists_url":"https://api.github.com/users/vishwabmc/gists{/gist_id}","starred_url":"https://api.github.com/users/vishwabmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishwabmc/subscriptions","organizations_url":"https://api.github.com/users/vishwabmc/orgs","repos_url":"https://api.github.com/users/vishwabmc/repos","events_url":"https://api.github.com/users/vishwabmc/events{/privacy}","received_events_url":"https://api.github.com/users/vishwabmc/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-09-30T11:28:51Z","updated_at":"2015-09-30T21:00:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bfae957aad22f3a9c173bc0c8d5258bff9b3f1d9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1/commits","review_comments_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1/comments","review_comment_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/1/comments","statuses_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/statuses/ce34f859ccb185ad2645ebe2c4aacd16b0a77cd9","head":{"label":"vishwabmc:master","ref":"master","sha":"ce34f859ccb185ad2645ebe2c4aacd16b0a77cd9","user":{"login":"vishwabmc","id":13940109,"avatar_url":"https://avatars.githubusercontent.com/u/13940109?v=3","gravatar_id":"","url":"https://api.github.com/users/vishwabmc","html_url":"https://github.com/vishwabmc","followers_url":"https://api.github.com/users/vishwabmc/followers","following_url":"https://api.github.com/users/vishwabmc/following{/other_user}","gists_url":"https://api.github.com/users/vishwabmc/gists{/gist_id}","starred_url":"https://api.github.com/users/vishwabmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishwabmc/subscriptions","organizations_url":"https://api.github.com/users/vishwabmc/orgs","repos_url":"https://api.github.com/users/vishwabmc/repos","events_url":"https://api.github.com/users/vishwabmc/events{/privacy}","received_events_url":"https://api.github.com/users/vishwabmc/received_events","type":"User","site_admin":false},"repo":{"id":43428423,"name":"phosphor-host-ipmid","full_name":"vishwabmc/phosphor-host-ipmid","owner":{"login":"vishwabmc","id":13940109,"avatar_url":"https://avatars.githubusercontent.com/u/13940109?v=3","gravatar_id":"","url":"https://api.github.com/users/vishwabmc","html_url":"https://github.com/vishwabmc","followers_url":"https://api.github.com/users/vishwabmc/followers","following_url":"https://api.github.com/users/vishwabmc/following{/other_user}","gists_url":"https://api.github.com/users/vishwabmc/gists{/gist_id}","starred_url":"https://api.github.com/users/vishwabmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishwabmc/subscriptions","organizations_url":"https://api.github.com/users/vishwabmc/orgs","repos_url":"https://api.github.com/users/vishwabmc/repos","events_url":"https://api.github.com/users/vishwabmc/events{/privacy}","received_events_url":"https://api.github.com/users/vishwabmc/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/vishwabmc/phosphor-host-ipmid","description":"dbus-based ipmid for host-endpoint IPMI commands","fork":true,"url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid","forks_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/forks","keys_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/teams","hooks_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/hooks","issue_events_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/issues/events{/number}","events_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/events","assignees_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/assignees{/user}","branches_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/branches{/branch}","tags_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/tags","blobs_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/git/refs{/sha}","trees_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/statuses/{sha}","languages_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/languages","stargazers_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/stargazers","contributors_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/contributors","subscribers_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/subscribers","subscription_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/subscription","commits_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/commits{/sha}","git_commits_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/git/commits{/sha}","comments_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/comments{/number}","issue_comment_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/issues/comments{/number}","contents_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/contents/{+path}","compare_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/merges","archive_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/downloads","issues_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/issues{/number}","pulls_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/pulls{/number}","milestones_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/milestones{/number}","notifications_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/labels{/name}","releases_url":"https://api.github.com/repos/vishwabmc/phosphor-host-ipmid/releases{/id}","created_at":"2015-09-30T11:08:53Z","updated_at":"2015-09-30T11:22:42Z","pushed_at":"2015-09-30T11:22:41Z","git_url":"git://github.com/vishwabmc/phosphor-host-ipmid.git","ssh_url":"git@github.com:vishwabmc/phosphor-host-ipmid.git","clone_url":"https://github.com/vishwabmc/phosphor-host-ipmid.git","svn_url":"https://github.com/vishwabmc/phosphor-host-ipmid","homepage":null,"size":89,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openbmc:master","ref":"master","sha":"48e9b17ba322ea2d6bbce349900f4ce77135b1e4","user":{"login":"openbmc","id":13670043,"avatar_url":"https://avatars.githubusercontent.com/u/13670043?v=3","gravatar_id":"","url":"https://api.github.com/users/openbmc","html_url":"https://github.com/openbmc","followers_url":"https://api.github.com/users/openbmc/followers","following_url":"https://api.github.com/users/openbmc/following{/other_user}","gists_url":"https://api.github.com/users/openbmc/gists{/gist_id}","starred_url":"https://api.github.com/users/openbmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openbmc/subscriptions","organizations_url":"https://api.github.com/users/openbmc/orgs","repos_url":"https://api.github.com/users/openbmc/repos","events_url":"https://api.github.com/users/openbmc/events{/privacy}","received_events_url":"https://api.github.com/users/openbmc/received_events","type":"Organization","site_admin":false},"repo":{"id":43011325,"name":"phosphor-host-ipmid","full_name":"openbmc/phosphor-host-ipmid","owner":{"login":"openbmc","id":13670043,"avatar_url":"https://avatars.githubusercontent.com/u/13670043?v=3","gravatar_id":"","url":"https://api.github.com/users/openbmc","html_url":"https://github.com/openbmc","followers_url":"https://api.github.com/users/openbmc/followers","following_url":"https://api.github.com/users/openbmc/following{/other_user}","gists_url":"https://api.github.com/users/openbmc/gists{/gist_id}","starred_url":"https://api.github.com/users/openbmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openbmc/subscriptions","organizations_url":"https://api.github.com/users/openbmc/orgs","repos_url":"https://api.github.com/users/openbmc/repos","events_url":"https://api.github.com/users/openbmc/events{/privacy}","received_events_url":"https://api.github.com/users/openbmc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openbmc/phosphor-host-ipmid","description":"dbus-based ipmid for host-endpoint IPMI commands","fork":false,"url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid","forks_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/forks","keys_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/teams","hooks_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/hooks","issue_events_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/events{/number}","events_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/events","assignees_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/assignees{/user}","branches_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/branches{/branch}","tags_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/tags","blobs_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/git/refs{/sha}","trees_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/statuses/{sha}","languages_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/languages","stargazers_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/stargazers","contributors_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/contributors","subscribers_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/subscribers","subscription_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/subscription","commits_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/commits{/sha}","git_commits_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/git/commits{/sha}","comments_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/comments{/number}","issue_comment_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/comments{/number}","contents_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/contents/{+path}","compare_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/merges","archive_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/downloads","issues_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues{/number}","pulls_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls{/number}","milestones_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/milestones{/number}","notifications_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/labels{/name}","releases_url":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/releases{/id}","created_at":"2015-09-23T15:57:29Z","updated_at":"2015-09-23T15:57:29Z","pushed_at":"2015-09-30T11:28:51Z","git_url":"git://github.com/openbmc/phosphor-host-ipmid.git","ssh_url":"git@github.com:openbmc/phosphor-host-ipmid.git","clone_url":"https://github.com/openbmc/phosphor-host-ipmid.git","svn_url":"https://github.com/openbmc/phosphor-host-ipmid","homepage":null,"size":164,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1"},"html":{"href":"https://github.com/openbmc/phosphor-host-ipmid/pull/1"},"issue":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/1"},"comments":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/openbmc/phosphor-host-ipmid/statuses/ce34f859ccb185ad2645ebe2c4aacd16b0a77cd9"}}}}