{"action":"created","comment":{"url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/comments/28652086","id":28652086,"diff_hunk":"@@ -0,0 +1,246 @@\n+################################################################################\n+SHORT DESCRIPTION: \n+################################################################################\n+Have the emulated NICs mirror the link-status of the network back-end, exposed\n+through XenStore.\n+\n+################################################################################\n+LONG DESCRIPTION: \n+################################################################################\n+QEMU's current default network configuration is to have two NICs (rtl8139\n+emulations), one for the Ethernet interface and one for the Wireless.\n+Each emulated card is connected to a \"QEMU vlan\" (not 802.1q VLAN), actually an\n+emulated hub (-net option behaviour), to which is also connected the tap\n+interface of its backend.\n+\n+For each NIC created by QEMU, we add a XenStore watch on the node of the\n+network back-end plugged in the same hub. This let us retrieve the back-end\n+information using the nd_table (NICInfo).\n+\n+################################################################################\n+CHANGELOG \n+################################################################################\n+Port & documentation: Eric Chanudet, chanudete@ainfosec.com, 17/04/2015\n+Intial Commit: Unknown\n+\n+################################################################################\n+REMOVAL \n+################################################################################\n+With the current OpenXT guest network configuration, removing this patch will\n+trigger routing issues in the guest.\n+\n+################################################################################\n+UPSTREAM PLAN \n+################################################################################\n+There is no plan to upstream this patch, it is OpenXT specific.\n+\n+################################################################################\n+INTERNAL DEPENDENCIES \n+################################################################################\n+None\n+\n+################################################################################\n+PATCHES \n+################################################################################\n+--- a/hw/xen.h\n++++ b/hw/xen.h\n+@@ -38,6 +38,9 @@ void xen_piix_pci_write_config_client(ui\n+ void xen_hvm_inject_msi(uint64_t addr, uint32_t data);\n+ void xen_cmos_set_s3_resume(void *opaque, int irq, int level);\n+ \n++int xenstore_register_nic(NetClientState *nc);\n++int xenstore_unregister_nic(NetClientState *nc);\n++\n+ qemu_irq *xen_interrupt_controller_init(void);\n+ \n+ int xen_init(void);\n+--- a/hw/xen_backend.c\n++++ b/hw/xen_backend.c\n+@@ -38,6 +38,7 @@\n+ #include \"char/char.h\"\n+ #include \"qemu/log.h\"\n+ #include \"xen_backend.h\"\n++#include \"qmp-commands.h\"\n+ \n+ #include <xen/grant_table.h>\n+ \n+@@ -589,6 +590,143 @@ static int xenstore_scan(const char *typ\n+     return 0;\n+ }\n+ \n++/*\n++ * OpenXT: Get type and id from \\([a-zA-Z]\\+\\)\\([0-9]\\+\\).\n++ */\n++static void xenstore_nic_parse_name(const char *name, char *type, char *id)\n++{\n++    if (name) {\n++        while (isalpha(*name)) {\n++            *(type++) = *(name++);\n++        }\n++        while (isdigit(*name)) {\n++            *(id++) = *(name++);\n++        }\n++    }\n++    *type = '\\0';\n++    *id = '\\0';\n++}\n++\n++/*\n++ * OpenXT: Get network backend type and ID from NIC information table.\n++ */\n++static int xenstore_net_client_state_fetch_backend_info(NetClientState *ncs, char *type, char *id)\n++{\n++    size_t i;\n++\n++    for (i = 0; i < MAX_NICS; ++i) {\n++        /* We assume there is only one NIC per hub. So, if a NIC is on our\n++         * hub, it is our back-end. */\n++        if (nd_table[i].netdev == ncs->peer) {\n++            xenstore_nic_parse_name(nd_table[i].name, type, id);\n++            return 0;\n++        }\n++    }\n++    return -1;\n++}\n++\n++/* Define constants for network devices XenStore data representation. */\n++#define XENSTORE_NET_TYPE_LEN   5   /* Currently \"vif\"|\"vwif\" */\n++#define XENSTORE_NET_ID_LEN     5\n++/* OpenXT: Read the appropriate Base Register and check if we have to change\n++ * the device status. */\n++static void xenstore_update_nic(void *opaque)\n++{\n++    NetClientState *nc = opaque;\n++    char *dompath;\n++    char type[XENSTORE_NET_TYPE_LEN];\n++    char id[XENSTORE_NET_ID_LEN];\n++    char base[XEN_BUFSIZE];\n++    int val;\n++\n++    if (xenstore_net_client_state_fetch_backend_info(nc, type, id)) {\n++        fprintf(stderr, \"Failed to find a network back-end for `%s'.\\n\", nc->name);\n++        return;\n++    }\n++\n++    dompath = xs_get_domain_path(xenstore, xen_domid);\n++    if (!dompath) {\n++        fprintf(stderr, \"Could not retrieve domain path.\\n\");\n++        return;\n++    }\n++    snprintf(base, sizeof (base), \"%s/device/%s/%s\", dompath, type, id);\n++    free(dompath);\n++\n++    if (xenstore_read_int(base, \"disconnect\", &val)) {\n++        fprintf(stderr, \"Failed to read xenstore path (%s/%s).\\n\", base, \"disconnect\");\n++        return;\n++    }\n++\n++    /* The value is actually a boolean. */\n++    if (nc->link_down != !!val) {\n++        fprintf(stderr, \"%s (%s%s): link status is now %s.\\n\", nc->name, type, id, !!val ? \"down\" : \"up\");\n++        /* Notify the emulation through QMP.\n++         * Note that qmp_set_link boolean is \"link-up?\", not nc->link_down \"link-down?\". */\n++        qmp_set_link(nc->name, !val, NULL);\n++    }\n++}\n++\n++/* OpenXT: Register a Net Client in Xenstore. */\n++int xenstore_register_nic(NetClientState *nc)\n++{\n++    char *dompath;\n++    char type[XENSTORE_NET_TYPE_LEN];\n++    char id[XENSTORE_NET_ID_LEN];\n++    char base[XEN_BUFSIZE];\n++\n++    if (xenstore_net_client_state_fetch_backend_info(nc, type, id)) {\n++        fprintf(stderr, \"Failed to find a network back-end for `%s'.\\n\", nc->name);\n++        return -1;\n++    }\n++\n++    dompath = xs_get_domain_path(xenstore, xen_domid);\n++    if (!dompath) {\n++        fprintf(stderr, \"Could not retrieve domain path.\\n\");\n++        return -1;\n++    }\n++    snprintf(base, sizeof (base), \"%s/device/%s/%s\", dompath, type, id);\n++    free(dompath);\n++\n++    if (xenstore_add_watch(base, \"disconnect\", xenstore_update_nic, nc)) {\n++        fprintf(stderr, \"Could not install xenstore watch on path `%s/disconnect'.\\n\", base);\n++        return -1;\n++    }\n++\n++    xenstore_update_nic(nc);\n++\n++    return 0;\n++}\n++\n++/* OpenXT: Unregister a Net Client in Xenstore.\n++ * Called when a device is removed and no longer used. */\n++int xenstore_unregister_nic(NetClientState *nc)\n++{\n++    char *dompath;\n++    char type[XENSTORE_NET_TYPE_LEN];\n++    char id[XENSTORE_NET_ID_LEN];\n++    char base[XEN_BUFSIZE];\n++\n++    if (xenstore_net_client_state_fetch_backend_info(nc, type, id)) {\n++        fprintf(stderr, \"Failed to find a network back-end for `%s'.\\n\", nc->name);\n++        return -1;\n++    }\n++\n++    dompath = xs_get_domain_path(xenstore, xen_domid);\n++    if (!dompath) {\n++        fprintf(stderr, \"Could not retrieve domain path.\\n\");\n++        return -1;\n++    }\n++    snprintf(base, sizeof (base), \"%s/device/%s/%s\", dompath, type, id);\n++    free(dompath);\n++\n++    if (xenstore_remove_watch(base, \"disconnect\", xenstore_update_nic, id)) {\n++        fprintf(stderr, \"Could not remove xenstore watch on path `%s/disconnect'.\\n\", base);\n++        return -1;\n++    }\n++    /* TODO: xenstore_update_nic() and force disconnect if not already? */","path":"recipes-openxt/qemu-dm/files/0027-nic-link-state-propagation.patch","position":204,"original_position":204,"commit_id":"7130bbc16f5daca2447b09d10a65fbe844c58896","original_commit_id":"7130bbc16f5daca2447b09d10a65fbe844c58896","user":{"login":"rianquinn","id":5932003,"avatar_url":"https://avatars.githubusercontent.com/u/5932003?v=3","gravatar_id":"","url":"https://api.github.com/users/rianquinn","html_url":"https://github.com/rianquinn","followers_url":"https://api.github.com/users/rianquinn/followers","following_url":"https://api.github.com/users/rianquinn/following{/other_user}","gists_url":"https://api.github.com/users/rianquinn/gists{/gist_id}","starred_url":"https://api.github.com/users/rianquinn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rianquinn/subscriptions","organizations_url":"https://api.github.com/users/rianquinn/orgs","repos_url":"https://api.github.com/users/rianquinn/repos","events_url":"https://api.github.com/users/rianquinn/events{/privacy}","received_events_url":"https://api.github.com/users/rianquinn/received_events","type":"User","site_admin":false},"body":"Any reason this was left as a TODO?","created_at":"2015-04-19T11:41:41Z","updated_at":"2015-04-19T11:41:41Z","html_url":"https://github.com/OpenXT/xenclient-oe/pull/93#discussion_r28652086","pull_request_url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93","_links":{"self":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/comments/28652086"},"html":{"href":"https://github.com/OpenXT/xenclient-oe/pull/93#discussion_r28652086"},"pull_request":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93"}}},"pull_request":{"url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93","id":33616324,"html_url":"https://github.com/OpenXT/xenclient-oe/pull/93","diff_url":"https://github.com/OpenXT/xenclient-oe/pull/93.diff","patch_url":"https://github.com/OpenXT/xenclient-oe/pull/93.patch","issue_url":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/93","number":93,"state":"open","locked":false,"title":"Qemu nic link state","user":{"login":"eric-ch","id":8698568,"avatar_url":"https://avatars.githubusercontent.com/u/8698568?v=3","gravatar_id":"","url":"https://api.github.com/users/eric-ch","html_url":"https://github.com/eric-ch","followers_url":"https://api.github.com/users/eric-ch/followers","following_url":"https://api.github.com/users/eric-ch/following{/other_user}","gists_url":"https://api.github.com/users/eric-ch/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-ch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-ch/subscriptions","organizations_url":"https://api.github.com/users/eric-ch/orgs","repos_url":"https://api.github.com/users/eric-ch/repos","events_url":"https://api.github.com/users/eric-ch/events{/privacy}","received_events_url":"https://api.github.com/users/eric-ch/received_events","type":"User","site_admin":false},"body":"Have the emulated NICs mirror the link-status of the network back-end, exposed through XenStore.\r\n\r\nAdd xenstore_remove_watch() in addition to the existing XenStore helpers.\r\n\r\nI had to refresh patches 0024/0025 and took the opportunity to remove trailing white-spaces and tabs that went in. Also, there was a dependency on syslog in the patch, I choose to remove it since we make syslog logging optional by a configure flag.\r\n\r\nOXT-254","created_at":"2015-04-19T09:54:13Z","updated_at":"2015-04-19T11:41:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0f1aacff6b07172ddfbd96fa2dad80e2b3a26676","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93/commits","review_comments_url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93/comments","review_comment_url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/93/comments","statuses_url":"https://api.github.com/repos/OpenXT/xenclient-oe/statuses/7130bbc16f5daca2447b09d10a65fbe844c58896","head":{"label":"eric-ch:qemu-nic-link-state","ref":"qemu-nic-link-state","sha":"7130bbc16f5daca2447b09d10a65fbe844c58896","user":{"login":"eric-ch","id":8698568,"avatar_url":"https://avatars.githubusercontent.com/u/8698568?v=3","gravatar_id":"","url":"https://api.github.com/users/eric-ch","html_url":"https://github.com/eric-ch","followers_url":"https://api.github.com/users/eric-ch/followers","following_url":"https://api.github.com/users/eric-ch/following{/other_user}","gists_url":"https://api.github.com/users/eric-ch/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-ch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-ch/subscriptions","organizations_url":"https://api.github.com/users/eric-ch/orgs","repos_url":"https://api.github.com/users/eric-ch/repos","events_url":"https://api.github.com/users/eric-ch/events{/privacy}","received_events_url":"https://api.github.com/users/eric-ch/received_events","type":"User","site_admin":false},"repo":{"id":24713992,"name":"xenclient-oe","full_name":"eric-ch/xenclient-oe","owner":{"login":"eric-ch","id":8698568,"avatar_url":"https://avatars.githubusercontent.com/u/8698568?v=3","gravatar_id":"","url":"https://api.github.com/users/eric-ch","html_url":"https://github.com/eric-ch","followers_url":"https://api.github.com/users/eric-ch/followers","following_url":"https://api.github.com/users/eric-ch/following{/other_user}","gists_url":"https://api.github.com/users/eric-ch/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-ch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-ch/subscriptions","organizations_url":"https://api.github.com/users/eric-ch/orgs","repos_url":"https://api.github.com/users/eric-ch/repos","events_url":"https://api.github.com/users/eric-ch/events{/privacy}","received_events_url":"https://api.github.com/users/eric-ch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/eric-ch/xenclient-oe","description":"","fork":true,"url":"https://api.github.com/repos/eric-ch/xenclient-oe","forks_url":"https://api.github.com/repos/eric-ch/xenclient-oe/forks","keys_url":"https://api.github.com/repos/eric-ch/xenclient-oe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eric-ch/xenclient-oe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eric-ch/xenclient-oe/teams","hooks_url":"https://api.github.com/repos/eric-ch/xenclient-oe/hooks","issue_events_url":"https://api.github.com/repos/eric-ch/xenclient-oe/issues/events{/number}","events_url":"https://api.github.com/repos/eric-ch/xenclient-oe/events","assignees_url":"https://api.github.com/repos/eric-ch/xenclient-oe/assignees{/user}","branches_url":"https://api.github.com/repos/eric-ch/xenclient-oe/branches{/branch}","tags_url":"https://api.github.com/repos/eric-ch/xenclient-oe/tags","blobs_url":"https://api.github.com/repos/eric-ch/xenclient-oe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eric-ch/xenclient-oe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eric-ch/xenclient-oe/git/refs{/sha}","trees_url":"https://api.github.com/repos/eric-ch/xenclient-oe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eric-ch/xenclient-oe/statuses/{sha}","languages_url":"https://api.github.com/repos/eric-ch/xenclient-oe/languages","stargazers_url":"https://api.github.com/repos/eric-ch/xenclient-oe/stargazers","contributors_url":"https://api.github.com/repos/eric-ch/xenclient-oe/contributors","subscribers_url":"https://api.github.com/repos/eric-ch/xenclient-oe/subscribers","subscription_url":"https://api.github.com/repos/eric-ch/xenclient-oe/subscription","commits_url":"https://api.github.com/repos/eric-ch/xenclient-oe/commits{/sha}","git_commits_url":"https://api.github.com/repos/eric-ch/xenclient-oe/git/commits{/sha}","comments_url":"https://api.github.com/repos/eric-ch/xenclient-oe/comments{/number}","issue_comment_url":"https://api.github.com/repos/eric-ch/xenclient-oe/issues/comments{/number}","contents_url":"https://api.github.com/repos/eric-ch/xenclient-oe/contents/{+path}","compare_url":"https://api.github.com/repos/eric-ch/xenclient-oe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eric-ch/xenclient-oe/merges","archive_url":"https://api.github.com/repos/eric-ch/xenclient-oe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eric-ch/xenclient-oe/downloads","issues_url":"https://api.github.com/repos/eric-ch/xenclient-oe/issues{/number}","pulls_url":"https://api.github.com/repos/eric-ch/xenclient-oe/pulls{/number}","milestones_url":"https://api.github.com/repos/eric-ch/xenclient-oe/milestones{/number}","notifications_url":"https://api.github.com/repos/eric-ch/xenclient-oe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eric-ch/xenclient-oe/labels{/name}","releases_url":"https://api.github.com/repos/eric-ch/xenclient-oe/releases{/id}","created_at":"2014-10-02T09:45:41Z","updated_at":"2015-04-15T22:31:53Z","pushed_at":"2015-04-19T09:48:53Z","git_url":"git://github.com/eric-ch/xenclient-oe.git","ssh_url":"git@github.com:eric-ch/xenclient-oe.git","clone_url":"https://github.com/eric-ch/xenclient-oe.git","svn_url":"https://github.com/eric-ch/xenclient-oe","homepage":null,"size":7980,"stargazers_count":0,"watchers_count":0,"language":"Shell","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":"OpenXT:master","ref":"master","sha":"5efd1a2a359ad3fda0d6a002e5d72c78f462edaf","user":{"login":"OpenXT","id":7283187,"avatar_url":"https://avatars.githubusercontent.com/u/7283187?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenXT","html_url":"https://github.com/OpenXT","followers_url":"https://api.github.com/users/OpenXT/followers","following_url":"https://api.github.com/users/OpenXT/following{/other_user}","gists_url":"https://api.github.com/users/OpenXT/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenXT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenXT/subscriptions","organizations_url":"https://api.github.com/users/OpenXT/orgs","repos_url":"https://api.github.com/users/OpenXT/repos","events_url":"https://api.github.com/users/OpenXT/events{/privacy}","received_events_url":"https://api.github.com/users/OpenXT/received_events","type":"Organization","site_admin":false},"repo":{"id":20779371,"name":"xenclient-oe","full_name":"OpenXT/xenclient-oe","owner":{"login":"OpenXT","id":7283187,"avatar_url":"https://avatars.githubusercontent.com/u/7283187?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenXT","html_url":"https://github.com/OpenXT","followers_url":"https://api.github.com/users/OpenXT/followers","following_url":"https://api.github.com/users/OpenXT/following{/other_user}","gists_url":"https://api.github.com/users/OpenXT/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenXT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenXT/subscriptions","organizations_url":"https://api.github.com/users/OpenXT/orgs","repos_url":"https://api.github.com/users/OpenXT/repos","events_url":"https://api.github.com/users/OpenXT/events{/privacy}","received_events_url":"https://api.github.com/users/OpenXT/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenXT/xenclient-oe","description":"","fork":false,"url":"https://api.github.com/repos/OpenXT/xenclient-oe","forks_url":"https://api.github.com/repos/OpenXT/xenclient-oe/forks","keys_url":"https://api.github.com/repos/OpenXT/xenclient-oe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenXT/xenclient-oe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenXT/xenclient-oe/teams","hooks_url":"https://api.github.com/repos/OpenXT/xenclient-oe/hooks","issue_events_url":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/events{/number}","events_url":"https://api.github.com/repos/OpenXT/xenclient-oe/events","assignees_url":"https://api.github.com/repos/OpenXT/xenclient-oe/assignees{/user}","branches_url":"https://api.github.com/repos/OpenXT/xenclient-oe/branches{/branch}","tags_url":"https://api.github.com/repos/OpenXT/xenclient-oe/tags","blobs_url":"https://api.github.com/repos/OpenXT/xenclient-oe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenXT/xenclient-oe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenXT/xenclient-oe/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenXT/xenclient-oe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenXT/xenclient-oe/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenXT/xenclient-oe/languages","stargazers_url":"https://api.github.com/repos/OpenXT/xenclient-oe/stargazers","contributors_url":"https://api.github.com/repos/OpenXT/xenclient-oe/contributors","subscribers_url":"https://api.github.com/repos/OpenXT/xenclient-oe/subscribers","subscription_url":"https://api.github.com/repos/OpenXT/xenclient-oe/subscription","commits_url":"https://api.github.com/repos/OpenXT/xenclient-oe/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenXT/xenclient-oe/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenXT/xenclient-oe/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenXT/xenclient-oe/contents/{+path}","compare_url":"https://api.github.com/repos/OpenXT/xenclient-oe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenXT/xenclient-oe/merges","archive_url":"https://api.github.com/repos/OpenXT/xenclient-oe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenXT/xenclient-oe/downloads","issues_url":"https://api.github.com/repos/OpenXT/xenclient-oe/issues{/number}","pulls_url":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenXT/xenclient-oe/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenXT/xenclient-oe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenXT/xenclient-oe/labels{/name}","releases_url":"https://api.github.com/repos/OpenXT/xenclient-oe/releases{/id}","created_at":"2014-06-12T19:00:56Z","updated_at":"2015-04-19T11:20:55Z","pushed_at":"2015-04-19T11:20:55Z","git_url":"git://github.com/OpenXT/xenclient-oe.git","ssh_url":"git@github.com:OpenXT/xenclient-oe.git","clone_url":"https://github.com/OpenXT/xenclient-oe.git","svn_url":"https://github.com/OpenXT/xenclient-oe","homepage":null,"size":9867,"stargazers_count":3,"watchers_count":3,"language":"Shell","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":15,"mirror_url":null,"open_issues_count":6,"forks":15,"open_issues":6,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93"},"html":{"href":"https://github.com/OpenXT/xenclient-oe/pull/93"},"issue":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/93"},"comments":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/issues/93/comments"},"review_comments":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93/comments"},"review_comment":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/pulls/93/commits"},"statuses":{"href":"https://api.github.com/repos/OpenXT/xenclient-oe/statuses/7130bbc16f5daca2447b09d10a65fbe844c58896"}}}}