From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:33481) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QClJn-000733-9m for qemu-devel@nongnu.org; Thu, 21 Apr 2011 00:16:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QClJl-0002Jg-5E for qemu-devel@nongnu.org; Thu, 21 Apr 2011 00:16:39 -0400 Received: from mail-pw0-f45.google.com ([209.85.160.45]:63602) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QClJk-0002Jb-Ph for qemu-devel@nongnu.org; Thu, 21 Apr 2011 00:16:37 -0400 Received: by pwj6 with SMTP id 6so924604pwj.4 for ; Wed, 20 Apr 2011 21:16:35 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: Date: Thu, 21 Apr 2011 12:16:35 +0800 Message-ID: From: ZhouPeng Content-Type: multipart/mixed; boundary=bcaec5216367c5fb0d04a1660113 Subject: Re: [Qemu-devel] [PATCH] xen-upstream-qemu: get vncpassword through xenstore, enable VNC_AUTH_VNC List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefano Stabellini Cc: "Xen-Devel (E-mail)" , Ian Jackson , qemu-devel@nongnu.org --bcaec5216367c5fb0d04a1660113 Content-Type: text/plain; charset=ISO-8859-1 Thank you for your review. Does this means the xen-upsteam-qemu will give up xenstore? Many features of xen except for vncpasswd may need that xl send||receive msg to||from xen-qemu. I think some other part of xen may need to read xenstore which may be updated by qemu. xenstore's sharing characteristic give much convenience for many-way msg communication, but the RPC may only give single-way. So I am somewhat in doubt xen-upstream-qemu will give up xenstore. IMO, I don't think qemu may accept xenstore's code only used by xen, except qemu need to add a new general shared many-way msg exchange mechanism, like xenstore database. Thank you Stefano Stabellini. send the patch again to CC to qemu-devel@nongnu.org ================================================================= This pacth allows you to use vncpasswd for xen-upstream-qemu Signed-off-by: Zhou Peng xen-upstream-qemu: get vncpassword through xenstore, enable VNC_AUTH_VNC diff --git a/Makefile.objs b/Makefile.objs index f8cf199..2a012bf 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -157,6 +157,8 @@ common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y)) common-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o common-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o +common-obj-$(CONFIG_XEN) += xenstore.o + ###################################################################### # libuser diff --git a/vl.c b/vl.c index 60ec6de..b519690 100644 --- a/vl.c +++ b/vl.c @@ -163,6 +163,8 @@ int main(int argc, char **argv) #include "ui/qemu-spice.h" +#include "xenstore.h" + //#define DEBUG_NET //#define DEBUG_SLIRP @@ -3321,7 +3323,11 @@ int main(int argc, char **argv, char **envp) #ifdef CONFIG_VNC /* init remote displays */ if (vnc_display) { + char password[20]; vnc_display_init(ds); + xenstore_read_vncpasswd(xen_domid, password, sizeof(password)); + vnc_display_password(ds, password); + if (vnc_display_open(ds, vnc_display) < 0) exit(1); diff --git a/xenstore.c b/xenstore.c new file mode 100644 index 0000000..0bb2a55 --- /dev/null +++ b/xenstore.c @@ -0,0 +1,154 @@ +/* + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of + * this archive for more details. + * + * Copyright (C) 2006 Christian Limpach + * Copyright (C) 2006 XenSource Ltd. + * Copyright (C) 2011 Zhou Peng . + * + */ + +#include "xenstore.h" +#include + +struct xs_handle *xsh = NULL; +static FILE *logfile = NULL; +extern uint32_t xen_domid; + +static int pasprintf(char **buf, const char *fmt, ...) +{ + va_list ap; + int ret = 0; + + if (*buf) + free(*buf); + va_start(ap, fmt); + if (vasprintf(buf, fmt, ap) == -1) { + buf = NULL; + ret = -1; + } + va_end(ap); + return ret; +} + +static const char *xenstore_get_guest_uuid(void) +{ + static char *already_computed = NULL; + + char *domain_path = NULL, *vm_path = NULL, *vm_value = NULL, *p = NULL; + unsigned int len; + + if (already_computed) + return already_computed; + + if (xsh == NULL) + return NULL; + + domain_path = xs_get_domain_path(xsh, xen_domid); + if (domain_path == NULL) { + fprintf(logfile, "xs_get_domain_path() error. xen_domid %d.\n", xen_domid); + goto out; + } + + if (pasprintf(&vm_path, "%s/vm", domain_path) == -1) { + fprintf(logfile, "xenstore_get_guest_uuid(): out of memory.\n"); + goto out; + } + vm_value = xs_read(xsh, XBT_NULL, vm_path, &len); + if (vm_value == NULL) { + fprintf(logfile, "xs_read(): uuid get error. %s.\n", vm_path); + goto out; + } + + if (strtok(vm_value, "/") == NULL) { + fprintf(logfile, "failed to parse guest uuid\n"); + goto out; + } + p = strtok(NULL, "/"); + if (p == NULL) { + fprintf(logfile, "failed to parse guest uuid\n"); + goto out; + } + + if (pasprintf(&already_computed, "%s", p) == -1) { + fprintf(logfile, "xenstore_get_guest_uuid(): out of memory.\n"); + goto out; + } + + fprintf(logfile, "Guest uuid = %s\n", already_computed); + + out: + free(domain_path); + free(vm_path); + free(vm_value); + + return already_computed; +} + +void xenstore_read_vncpasswd(int domid, char *pwbuf, size_t pwbuflen) +{ + char *buf = NULL, *path, *uuid = NULL, *passwd = NULL; + unsigned int i, len; + + pwbuf[0] = '\0'; + + if (xsh == NULL) + return; + + path = xs_get_domain_path(xsh, domid); + if (path == NULL) { + fprintf(logfile, "xs_get_domain_path() error. domid %d.\n", domid); + return; + } + + pasprintf(&buf, "%s/vm", path); + free(path); + uuid = xs_read(xsh, XBT_NULL, buf, &len); + if (uuid == NULL) { + fprintf(logfile, "xs_read(): uuid get error. %s.\n", buf); + free(buf); + return; + } + + pasprintf(&buf, "%s/vncpasswd", uuid); + free(uuid); + passwd = xs_read(xsh, XBT_NULL, buf, &len); + if (passwd == NULL) { + fprintf(logfile, "xs_read(): vncpasswd get error. %s.\n", buf); + free(buf); + return; + } + + if (len >= pwbuflen) + { + fprintf(logfile, + "xenstore_read_vncpasswd(): truncated password to avoid buffer overflow\n"); + len = pwbuflen - 1; + } + + for (i=0; i: > On Wed, 20 Apr 2011, ZhouPeng wrote: >> This pacth allows you to use vncpasswd for xen-upstream-qemu >> >> Signed-off-by: Zhou Peng >> >> xen-upstream-qemu: get vncpassword through xenstore, enable VNC_AUTH_VNC >> > > This patch is for upstream qemu, right? Yes, it's for xen-qemu-0.14.50 from Anthony's tree, very close to the upstream qemu. > In that case you always need to CC qemu-devel@nongnu.org. > Also when submitting patches for upstream qemu we need to try to reuse > the existing infrastructure to do things. > In this particular example, we cannot use xenstore to communicate the > password to qemu, we have to use QMP that is the RPC mechanism exported > by Qemu. Unfortunately libxl doesn't speak QMP yet, but adding QMP > support to libxl is one of the next things that have to be done anyway. > > -- Zhou Peng Operating System Technology Group Institute of Software, the Chinese Academy of Sciences (ISCAS) --bcaec5216367c5fb0d04a1660113 Content-Type: text/x-patch; charset=US-ASCII; name="xen-upstream-qemu-vncpassword-by-xenstore.diff" Content-Disposition: attachment; filename="xen-upstream-qemu-vncpassword-by-xenstore.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gmr6blqk0 VGhpcyBwYWN0aCBhbGxvd3MgeW91IHRvIHVzZSB2bmNwYXNzd2QgZm9yIHhlbi11cHN0cmVhbS1x ZW11CgpTaWduZWQtb2ZmLWJ5OiBaaG91IFBlbmcgPHpob3VwZW5nQG5mcy5pc2Nhcy5hYy5jbj4K Cnhlbi11cHN0cmVhbS1xZW11OiBnZXQgdm5jcGFzc3dvcmQgdGhyb3VnaCB4ZW5zdG9yZSwgZW5h YmxlIFZOQ19BVVRIX1ZOQwoKZGlmZiAtLWdpdCBhL01ha2VmaWxlLm9ianMgYi9NYWtlZmlsZS5v YmpzCmluZGV4IGY4Y2YxOTkuLjJhMDEyYmYgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLm9ianMKKysr IGIvTWFrZWZpbGUub2JqcwpAQCAtMTU3LDYgKzE1Nyw4IEBAIGNvbW1vbi1vYmotJChDT05GSUdf U0xJUlApICs9ICQoYWRkcHJlZml4IHNsaXJwLywgJChzbGlycC1vYmoteSkpCiBjb21tb24tb2Jq LSQoQ09ORklHX1hFTikgKz0geGVuX2JhY2tlbmQubyB4ZW5fZGV2Y29uZmlnLm8KIGNvbW1vbi1v YmotJChDT05GSUdfWEVOKSArPSB4ZW5fY29uc29sZS5vIHhlbmZiLm8geGVuX2Rpc2subyB4ZW5f bmljLm8KIAorY29tbW9uLW9iai0kKENPTkZJR19YRU4pICs9IHhlbnN0b3JlLm8KKwogIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIwogIyBsaWJ1c2VyCiAKZGlmZiAtLWdpdCBhL3ZsLmMgYi92bC5jCmluZGV4IDYwZWM2 ZGUuLmI1MTk2OTAgMTAwNjQ0Ci0tLSBhL3ZsLmMKKysrIGIvdmwuYwpAQCAtMTYzLDYgKzE2Myw4 IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogI2luY2x1ZGUgInVpL3FlbXUt c3BpY2UuaCIKIAorI2luY2x1ZGUgInhlbnN0b3JlLmgiCisKIC8vI2RlZmluZSBERUJVR19ORVQK IC8vI2RlZmluZSBERUJVR19TTElSUAogCkBAIC0zMzIxLDcgKzMzMjMsMTEgQEAgaW50IG1haW4o aW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKICNpZmRlZiBDT05GSUdfVk5DCiAg ICAgLyogaW5pdCByZW1vdGUgZGlzcGxheXMgKi8KICAgICBpZiAodm5jX2Rpc3BsYXkpIHsKKyAg ICAgICAgY2hhciBwYXNzd29yZFsyMF07CiAgICAgICAgIHZuY19kaXNwbGF5X2luaXQoZHMpOwor ICAgICAgICB4ZW5zdG9yZV9yZWFkX3ZuY3Bhc3N3ZCh4ZW5fZG9taWQsIHBhc3N3b3JkLCBzaXpl b2YocGFzc3dvcmQpKTsKKyAgICAgICAgdm5jX2Rpc3BsYXlfcGFzc3dvcmQoZHMsIHBhc3N3b3Jk KTsKKwogICAgICAgICBpZiAodm5jX2Rpc3BsYXlfb3Blbihkcywgdm5jX2Rpc3BsYXkpIDwgMCkK ICAgICAgICAgICAgIGV4aXQoMSk7CiAKZGlmZiAtLWdpdCBhL3hlbnN0b3JlLmMgYi94ZW5zdG9y ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjJhNTUKLS0tIC9kZXYv bnVsbAorKysgYi94ZW5zdG9yZS5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogVGhpcyBmaWxl IGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJh bAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWlu IGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog Q29weXJpZ2h0IChDKSAyMDA2IENocmlzdGlhbiBMaW1wYWNoCisgKiBDb3B5cmlnaHQgKEMpIDIw MDYgWGVuU291cmNlIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBaaG91IFBlbmcgPHpob3Vw ZW5nQG5mcy5pc2Nhcy5hYy5jbj4uCisgKgorICovCisKKyNpbmNsdWRlICJ4ZW5zdG9yZS5oIgor I2luY2x1ZGUgPHhzLmg+CisKK3N0cnVjdCB4c19oYW5kbGUgKnhzaCA9IE5VTEw7CitzdGF0aWMg RklMRSAqbG9nZmlsZSA9IE5VTEw7CitleHRlcm4gdWludDMyX3QgeGVuX2RvbWlkOworCitzdGF0 aWMgaW50IHBhc3ByaW50ZihjaGFyICoqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAg ICB2YV9saXN0IGFwOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCpidWYpCisgICAgICAg IGZyZWUoKmJ1Zik7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgaWYgKHZhc3ByaW50Zihi dWYsIGZtdCwgYXApID09IC0xKSB7CisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIHJldCA9 IC0xOworICAgIH0KKyAgICB2YV9lbmQoYXApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBjb25zdCBjaGFyICp4ZW5zdG9yZV9nZXRfZ3Vlc3RfdXVpZCh2b2lkKQoreworICAgIHN0YXRp YyBjaGFyICphbHJlYWR5X2NvbXB1dGVkID0gTlVMTDsKKworICAgIGNoYXIgKmRvbWFpbl9wYXRo ID0gTlVMTCwgKnZtX3BhdGggPSBOVUxMLCAqdm1fdmFsdWUgPSBOVUxMLCAqcCA9IE5VTEw7Cisg ICAgdW5zaWduZWQgaW50IGxlbjsKKworICAgIGlmIChhbHJlYWR5X2NvbXB1dGVkKQorICAgICAg ICByZXR1cm4gYWxyZWFkeV9jb21wdXRlZDsKKworICAgIGlmICh4c2ggPT0gTlVMTCkKKyAgICAg ICAgcmV0dXJuIE5VTEw7CisKKyAgICBkb21haW5fcGF0aCA9IHhzX2dldF9kb21haW5fcGF0aCh4 c2gsIHhlbl9kb21pZCk7CisgICAgaWYgKGRvbWFpbl9wYXRoID09IE5VTEwpIHsKKyAgICAgICAg ZnByaW50Zihsb2dmaWxlLCAieHNfZ2V0X2RvbWFpbl9wYXRoKCkgZXJyb3IuIHhlbl9kb21pZCAl ZC5cbiIsIHhlbl9kb21pZCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChw YXNwcmludGYoJnZtX3BhdGgsICIlcy92bSIsIGRvbWFpbl9wYXRoKSA9PSAtMSkgeworICAgICAg ICBmcHJpbnRmKGxvZ2ZpbGUsICJ4ZW5zdG9yZV9nZXRfZ3Vlc3RfdXVpZCgpOiBvdXQgb2YgbWVt b3J5LlxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICB2bV92YWx1ZSA9IHhzX3Jl YWQoeHNoLCBYQlRfTlVMTCwgdm1fcGF0aCwgJmxlbik7CisgICAgaWYgKHZtX3ZhbHVlID09IE5V TEwpIHsKKyAgICAgICAgZnByaW50Zihsb2dmaWxlLCAieHNfcmVhZCgpOiB1dWlkIGdldCBlcnJv ci4gJXMuXG4iLCB2bV9wYXRoKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYg KHN0cnRvayh2bV92YWx1ZSwgIi8iKSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYobG9nZmls ZSwgImZhaWxlZCB0byBwYXJzZSBndWVzdCB1dWlkXG4iKTsKKyAgICAgICAgZ290byBvdXQ7Cisg ICAgfQorICAgIHAgPSBzdHJ0b2soTlVMTCwgIi8iKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7Cisg ICAgICAgIGZwcmludGYobG9nZmlsZSwgImZhaWxlZCB0byBwYXJzZSBndWVzdCB1dWlkXG4iKTsK KyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKHBhc3ByaW50ZigmYWxyZWFkeV9j b21wdXRlZCwgIiVzIiwgcCkgPT0gLTEpIHsKKyAgICAgICAgZnByaW50Zihsb2dmaWxlLCAieGVu c3RvcmVfZ2V0X2d1ZXN0X3V1aWQoKTogb3V0IG9mIG1lbW9yeS5cbiIpOworICAgICAgICBnb3Rv IG91dDsKKyAgICB9CisKKyAgICBmcHJpbnRmKGxvZ2ZpbGUsICJHdWVzdCB1dWlkID0gJXNcbiIs IGFscmVhZHlfY29tcHV0ZWQpOworCisgb3V0OgorICAgIGZyZWUoZG9tYWluX3BhdGgpOworICAg IGZyZWUodm1fcGF0aCk7CisgICAgZnJlZSh2bV92YWx1ZSk7CisKKyAgICByZXR1cm4gYWxyZWFk eV9jb21wdXRlZDsKK30KKwordm9pZCB4ZW5zdG9yZV9yZWFkX3ZuY3Bhc3N3ZChpbnQgZG9taWQs IGNoYXIgKnB3YnVmLCBzaXplX3QgcHdidWZsZW4pCit7CisgICAgY2hhciAqYnVmID0gTlVMTCwg KnBhdGgsICp1dWlkID0gTlVMTCwgKnBhc3N3ZCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGks IGxlbjsKKworICAgIHB3YnVmWzBdID0gJ1wwJzsKKworICAgIGlmICh4c2ggPT0gTlVMTCkKKyAg ICAgICAgcmV0dXJuOworCisgICAgcGF0aCA9IHhzX2dldF9kb21haW5fcGF0aCh4c2gsIGRvbWlk KTsKKyAgICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYobG9nZmlsZSwgInhz X2dldF9kb21haW5fcGF0aCgpIGVycm9yLiBkb21pZCAlZC5cbiIsIGRvbWlkKTsKKyAgICAgICAg cmV0dXJuOworICAgIH0KKworICAgIHBhc3ByaW50ZigmYnVmLCAiJXMvdm0iLCBwYXRoKTsKKyAg ICBmcmVlKHBhdGgpOworICAgIHV1aWQgPSB4c19yZWFkKHhzaCwgWEJUX05VTEwsIGJ1ZiwgJmxl bik7CisgICAgaWYgKHV1aWQgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICJ4 c19yZWFkKCk6IHV1aWQgZ2V0IGVycm9yLiAlcy5cbiIsIGJ1Zik7CisgICAgICAgIGZyZWUoYnVm KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBhc3ByaW50ZigmYnVmLCAiJXMvdm5j cGFzc3dkIiwgdXVpZCk7CisgICAgZnJlZSh1dWlkKTsKKyAgICBwYXNzd2QgPSB4c19yZWFkKHhz aCwgWEJUX05VTEwsIGJ1ZiwgJmxlbik7CisgICAgaWYgKHBhc3N3ZCA9PSBOVUxMKSB7CisgICAg ICAgIGZwcmludGYobG9nZmlsZSwgInhzX3JlYWQoKTogdm5jcGFzc3dkIGdldCBlcnJvci4gJXMu XG4iLCBidWYpOworICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK KyAgICBpZiAobGVuID49IHB3YnVmbGVuKQorICAgIHsKKyAgICAgICAgZnByaW50Zihsb2dmaWxl LCAKKyAgICAgICAgICAgICAgICAieGVuc3RvcmVfcmVhZF92bmNwYXNzd2QoKTogdHJ1bmNhdGVk IHBhc3N3b3JkIHRvIGF2b2lkIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisgICAgICAgIGxlbiA9IHB3 YnVmbGVuIC0gMTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKKyAgICAgICAg cHdidWZbaV0gPSBwYXNzd2RbaV07CisgICAgcHdidWZbbGVuXSA9ICdcMCc7CisgICAgcGFzc3dk WzBdID0gJ1wwJzsKKyAgICBpZiAoeHNfd3JpdGUoeHNoLCBYQlRfTlVMTCwgYnVmLCBwYXNzd2Qs IDEpID09IDApCisgICAgICAgIGZwcmludGYobG9nZmlsZSwgInhzX3dyaXRlKCkgdm5jcGFzc3dk IGZhaWxlZC5cbiIpOworCisgICAgZnJlZShwYXNzd2QpOworICAgIGZyZWUoYnVmKTsKK30KKwor c3RhdGljIHZvaWQgeGVuc3RvcmVfaW5pdCh2b2lkKQoreworICAgIGxvZ2ZpbGUgPSBzdGRlcnI7 CisKKyAgICB4ZW5zdG9yZV9nZXRfZ3Vlc3RfdXVpZCgpOworCisgICAgeHNoID0geHNfZGFlbW9u X29wZW4oKTsKKyAgICBpZiAoeHNoID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50Zihsb2dmaWxl LCAiQ291bGQgbm90IGNvbnRhY3QgeGVuc3RvcmUgZm9yIGRvbWFpbiBjb25maWdcbiIpOworICAg ICAgICByZXR1cm47CisgICAgfQorfQorCitkZXZpY2VfaW5pdCh4ZW5zdG9yZV9pbml0KTsKZGlm ZiAtLWdpdCBhL3hlbnN0b3JlLmggYi94ZW5zdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjUyNDJmMmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZW5zdG9yZS5oCkBAIC0w LDAgKzEsMTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5k IGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0 aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hp dmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBYRU5fU1RPUkVfSAorI2Rl ZmluZSBYRU5fU1RPUkVfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKwordm9pZCB4ZW5z dG9yZV9yZWFkX3ZuY3Bhc3N3ZChpbnQgZG9taWQsIGNoYXIgKnB3YnVmLCBzaXplX3QgcHdidWZs ZW4pOworCisjZW5kaWYgLyogWEVOX1NUT1JFX0ggKi8K --bcaec5216367c5fb0d04a1660113--