From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rohan Prinja Subject: Re: [PATCH] getifaddrs wrapper Date: Thu, 2 Jul 2015 16:29:26 +0530 Message-ID: References: <87mvzvykfx.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a1135483e3cab700519e25590 Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:60015) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAcDK-00041U-QZ for guix-devel@gnu.org; Thu, 02 Jul 2015 06:59:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAcDI-00058y-Qs for guix-devel@gnu.org; Thu, 02 Jul 2015 06:59:30 -0400 In-Reply-To: <87mvzvykfx.fsf@gnu.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: =?UTF-8?Q?Ludovic_Court=C3=A8s?= Cc: guix-devel --001a1135483e3cab700519e25590 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable PTAL, tests to follow soon. Thank you. On 19 June 2015 at 17:33, Ludovic Court=C3=A8s wrote: > Rohan Prinja skribis: > >> From 668910afbe979145a7699708817e28d219ec0750 Mon Sep 17 00:00:00 2001 >> From: Rohan Prinja >> Date: Fri, 19 Jun 2015 12:05:05 +0530 >> Subject: [PATCH] add wrapper for getifaddrs (3) to guix/build/syscalls.s= cm > > Nice! > > I have a few comments, but nothing major. > > Please add a copyright line for yourself in the file. > > Please do not use tabs at all in the file. > > Could you add a test in the tests/syscalls.scm file? Basically > something that makes sure that =E2=80=98getifaddrs=E2=80=99 returns a (po= ssibly empty) > list, with relevant values. > >> +;; TODO: no support for unions yet. > > It=E2=80=99s not clear what=E2=80=99s =E2=80=9Cto be done=E2=80=9D here. = Could you rephrase it maybe? > >> +;; This only supports broadcast addrs. > > Ditto. > >> +(define-c-struct ifaddrs ; >> + read-ifaddrs >> + write-ifaddrs! >> + (ifa-next '*) >> + (ifa-name '*) >> + (ifa-flags unsigned-int) >> + (ifa-addr '*) >> + (ifa-netmask '*) >> + (ifu-broadcastaddr '*) >> + (ifa-data '*)) > > Currently =E2=80=98read-ifaddrs=E2=80=99 and =E2=80=98write-ifaddrs!=E2= =80=99 are unused, but they > should be used (see below.) > >> +(define-syntax-rule (bytevector-slice bv start len) > > Please change =E2=80=98define-syntax-rule=E2=80=99 to =E2=80=98define=E2= =80=99 and add a docstring. > >> + (let* ((res (make-bytevector len 0)) >> + (_ (bytevector-copy! bv start res 0 len))) >> + res)) > > Rather: > > (let ((result (make-bytevector len))) > (bytevector-copy! bv start result 0 len) > result) > >> +;; See getifaddrs (3) for a description of >> +;; struct ifaddrs. >> +(define %struct-ifaddrs-type >> + `(* * ,unsigned-int * * * *)) > > The comment should be =E2=80=9CFFI type for =E2=80=98struct ifaddr=E2=80= =99.=E2=80=9D > >> +(define %getifaddrs >> + (let* ((ptr (dynamic-func "getifaddrs" (dynamic-link))) >> + (proc (pointer->procedure int ptr (list '*))) >> + (struct-init (list %null-pointer >> + %null-pointer >> + 0 >> + %null-pointer >> + %null-pointer >> + %null-pointer >> + %null-pointer))) >> + (lambda () >> + "Wrapper around getifaddrs (3)." >> + (let* ((ifap (make-c-struct %struct-ifaddrs-type >> + struct-init)) >> + (ifapp (scm->pointer ifap)) ; ifap ptr > > s/ifapp/ptr/ and s/scm->pointer/pointer-address/ because =E2=80=98make-c-= struct=E2=80=99 > returns a pointer object. > >> + (ret (proc ifapp)) >> + (err (errno))) >> + (if (zero? ret) >> + (next-ifaddr (parse-ifaddrs ifapp)) > > Use =E2=80=98read-ifaddrs=E2=80=99 instead of =E2=80=98parse-ifaddrs=E2= =80=99. > >> +(define (getifaddrs) >> + "Obtain a list of network interfaces on the local system." > > s/Obtain a/Return the/ > >> + (let ((ifaddrs (%getifaddrs))) >> + (let lp ((curr ifaddrs) (res '())) >> + (if (last-interface? curr) >> + (reverse res) >> + (lp (next-ifaddr curr) (cons curr res)))))) > > s/lp/loop/ for consistency > > This is OK, but the problem is that each object in the list that is > returned is a tuple, so it=E2=80=99s not very convenient. > > What about defining a record type, and converting > the tuples to that, so that users of =E2=80=98getifaddrs=E2=80=99 directl= y get this more > convenient interface? Like: > > (define-record-type > (interface-address name flags) > interface-address? > (name interface-address-name) > (flags interface-address-flags)) > > The type predicate and accessors need to be exported, of course. > >> +;; Given a pointer to a struct ifaddrs, parse it into a list. >> +(define-syntax-rule (parse-ifaddrs ptr) >> + (parse-c-struct ptr %struct-ifaddrs-type)) > > No longer needed. > >> +;; Retrieve a bytevector aliasing the memory pointed to by the >> +;; ifa_next struct ifaddrs* pointer. >> +(define-syntax-rule (next-ifaddr ifaddrs) >> + (parse-c-struct (car ifaddrs) %struct-ifaddrs-type)) > > s/define-syntax-rule/define/ > > Use =E2=80=98match=E2=80=99 instead of =E2=80=98car=E2=80=99; same for th= e following macros. > >> +;; Retrieve interface name. >> +(define-syntax-rule (ifaddr-name ifaddrs) >> + (pointer->string (cadr ifaddrs))) >> + >> +;; Retrieve interface flags. >> +(define-syntax-rule (ifaddr-flags ifaddrs) >> + (list-ref ifaddrs 2)) > > These become unneeded once is added. > > Could you send an updated patch? > > If something is unclear, please let me know! > > Thank you! > > Ludo=E2=80=99. --001a1135483e3cab700519e25590 Content-Type: text/x-patch; charset=UTF-8; name="0001-guix-build-syscalls.scm-refactor-according-to-code-r.patch" Content-Disposition: attachment; filename="0001-guix-build-syscalls.scm-refactor-according-to-code-r.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ibm2y0jp0 RnJvbSAxYmRiZDE5NWQ3OTc5ZmUyMDU4Yjg4ZDcwMzNlYWViOTNiNTI0ZmI3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSb2hhbiBQcmluamEgPHJvaGFuLnByaW5qYUBnbWFpbC5jb20+ CkRhdGU6IFRodSwgMiBKdWwgMjAxNSAxNjoyODoyNCArMDUzMApTdWJqZWN0OiBbUEFUQ0hdIGd1 aXgvYnVpbGQvc3lzY2FsbHMuc2NtOiByZWZhY3RvciBhY2NvcmRpbmcgdG8gY29kZSByZXZpZXcK Ci0tLQogZ3VpeC9idWlsZC9zeXNjYWxscy5zY20gfCAxNTAgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTAxIGluc2VydGlv bnMoKyksIDQ5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2d1aXgvYnVpbGQvc3lzY2FsbHMu c2NtIGIvZ3VpeC9idWlsZC9zeXNjYWxscy5zY20KaW5kZXggZTVkMjk2YS4uNWFmZGQ0NyAxMDA2 NDQKLS0tIGEvZ3VpeC9idWlsZC9zeXNjYWxscy5zY20KKysrIGIvZ3VpeC9idWlsZC9zeXNjYWxs cy5zY20KQEAgLTEsNSArMSw2IEBACiA7OzsgR05VIEd1aXggLS0tIEZ1bmN0aW9uYWwgcGFja2Fn ZSBtYW5hZ2VtZW50IGZvciBHTlUKIDs7OyBDb3B5cmlnaHQgwqkgMjAxNCwgMjAxNSBMdWRvdmlj IENvdXJ0w6hzIDxsdWRvQGdudS5vcmc+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMTUgUm9oYW4gUHJp bmphIDxyb2hhbi5wcmluamFAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQg b2YgR05VIEd1aXguCiA7OzsKQEAgLTIwLDYgKzIxLDcgQEAKICAgIzp1c2UtbW9kdWxlIChzeXN0 ZW0gZm9yZWlnbikKICAgIzp1c2UtbW9kdWxlIChybnJzIGJ5dGV2ZWN0b3JzKQogICAjOnVzZS1t b2R1bGUgKHNyZmkgc3JmaS0xKQorICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS05KQogICAjOnVz ZS1tb2R1bGUgKGljZS05IHJkZWxpbSkKICAgIzp1c2UtbW9kdWxlIChpY2UtOSByZWdleCkKICAg Izp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkKQEAgLTM2LDcgKzM4LDEyIEBACiAgICAgICAgICAg ICBzd2Fwb24KICAgICAgICAgICAgIHN3YXBvZmYKICAgICAgICAgICAgIHByb2Nlc3NlcwotCSAg ICBnZXRpZmFkZHJzCisgICAgICAgICAgICBnZXRpZmFkZHJzCisKKyAgICAgICAgICAgIDxpbnRl cmZhY2UtYWRkcmVzcz4KKyAgICAgICAgICAgIGludGVyZmFjZS1hZGRyZXNzPworICAgICAgICAg ICAgaW50ZXJmYWNlLWFkZHJlc3MtbmFtZQorICAgICAgICAgICAgaW50ZXJmYWNlLWFkZHJlc3Mt ZmxhZ3MKIAogICAgICAgICAgICAgSUZGX1VQCiAgICAgICAgICAgICBJRkZfQlJPQURDQVNUCkBA IC0zODIsOCArMzg5LDYgQEAgdGhlIEMgc3RydWN0dXJlIHdpdGggdGhlIGdpdmVuIFRZUEVTLiIK ICAgKGFkZHJlc3MgICAoaW50MTI4IH4gYmlnKSkKICAgKHNjb3BlaWQgICBpbnQzMikpCiAKLTs7 IFRPRE86IG5vIHN1cHBvcnQgZm9yIHVuaW9ucyB5ZXQuCi07OyBUaGlzIG9ubHkgc3VwcG9ydHMg YnJvYWRjYXN0IGFkZHJzLgogKGRlZmluZS1jLXN0cnVjdCBpZmFkZHJzICAgICAgICAgICAgICAg ICAgICAgICAgICA7PGlmYWRkcnMuaD4KICAgcmVhZC1pZmFkZHJzCiAgIHdyaXRlLWlmYWRkcnMh CkBAIC0zOTUsNjcgKzQwMCwxMTQgQEAgdGhlIEMgc3RydWN0dXJlIHdpdGggdGhlIGdpdmVuIFRZ UEVTLiIKICAgKGlmdS1icm9hZGNhc3RhZGRyICcqKQogICAoaWZhLWRhdGEgJyopKQogCi0oZGVm aW5lLXN5bnRheC1ydWxlIChieXRldmVjdG9yLXNsaWNlIGJ2IHN0YXJ0IGxlbikKLSAgKGxldCog KChyZXMgKG1ha2UtYnl0ZXZlY3RvciBsZW4gMCkpCi0JIChfIChieXRldmVjdG9yLWNvcHkhIGJ2 IHN0YXJ0IHJlcyAwIGxlbikpKQorKGRlZmluZS1yZWNvcmQtdHlwZSA8aW50ZXJmYWNlLWFkZHJl c3M+CisgIChtYWtlLWludGVyZmFjZS1hZGRyZXNzIG5hbWUgZmxhZ3MgYWRkciBuZXRtYXNrIGJy b2FkYWRkciBkYXRhKQorICBpbnRlcmZhY2UtYWRkcmVzcz8KKyAgKG5hbWUgaW50ZXJmYWNlLWFk ZHJlc3MtbmFtZSkKKyAgKGZsYWdzIGludGVyZmFjZS1hZGRyZXNzLWZsYWdzKQorICAoYWRkciBp bnRlcmZhY2UtYWRkcmVzcy1hZGRyKQorICAobmV0bWFzayBpbnRlcmZhY2UtYWRkcmVzcy1uZXRt YXNrKQorICAoYnJvYWRhZGRyIGludGVyZmFjZS1hZGRyZXNzLWJyb2FkYWRkcikKKyAgKGRhdGEg aW50ZXJmYWNlLWFkZHJlc3MtZGF0YSkpCisKKyhkZWZpbmUgKGJ5dGV2ZWN0b3Itc2xpY2UgYnYg c3RhcnQgbGVuKQorICAiUmV0dXJuIGEgbmV3IGJ5dGV2ZWN0b3IgKG5vdCBhIHZpZXcgaW50byB0 aGUgb2xkIG9uZSkKK2NvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGZyb20gQlYgZnJvbSBpbmRleCBT VEFSVCB1cHRvCitpbmRleCBTVEFSVCArIExFTiAtIDEiCisgIChsZXQqICgocmVzIChtYWtlLWJ5 dGV2ZWN0b3IgbGVuIDApKSkKKyAgICAoYnl0ZXZlY3Rvci1jb3B5ISBidiBzdGFydCByZXMgMCBs ZW4pCiAgICAgcmVzKSkKIAotOzsgU2VlIGdldGlmYWRkcnMgKDMpIGZvciBhIGRlc2NyaXB0aW9u IG9mCi07OyBzdHJ1Y3QgaWZhZGRycy4KKzs7IEZGSSB0eXBlIGZvciAnc3RydWN0IGlmYWRkcnMn LgogKGRlZmluZSAlc3RydWN0LWlmYWRkcnMtdHlwZQogICBgKCogKiAsdW5zaWduZWQtaW50ICog KiAqICopKQogCis7OyBJbml0aWFsaXplciBmb3IgJ3N0cnVjdCBpZmFkZHJzJy4KKyhkZWZpbmUg JXN0cnVjdC1pZmFkZHJzLWluaXQKKyAgKGxpc3QgJW51bGwtcG9pbnRlcgorICAgICAgICAlbnVs bC1wb2ludGVyCisgICAgICAgIDAKKyAgICAgICAgJW51bGwtcG9pbnRlcgorICAgICAgICAlbnVs bC1wb2ludGVyCisgICAgICAgICVudWxsLXBvaW50ZXIKKyAgICAgICAgJW51bGwtcG9pbnRlcikp CisKIChkZWZpbmUgJWdldGlmYWRkcnMKLSAgKGxldCogKChwdHIgKGR5bmFtaWMtZnVuYyAiZ2V0 aWZhZGRycyIgKGR5bmFtaWMtbGluaykpKQotCSAgKHByb2MgKHBvaW50ZXItPnByb2NlZHVyZSBp bnQgcHRyIChsaXN0ICcqKSkpCi0JICAoc3RydWN0LWluaXQgKGxpc3QgJW51bGwtcG9pbnRlcgot CQkJICAgICAlbnVsbC1wb2ludGVyCi0JCQkgICAgIDAKLQkJCSAgICAgJW51bGwtcG9pbnRlcgot CQkJICAgICAlbnVsbC1wb2ludGVyCi0JCQkgICAgICVudWxsLXBvaW50ZXIKLQkJCSAgICAgJW51 bGwtcG9pbnRlcikpKQorICAobGV0KiAoKGZ1bmMtcHRyIChkeW5hbWljLWZ1bmMgImdldGlmYWRk cnMiIChkeW5hbWljLWxpbmspKSkKKyAgICAgICAgIChwcm9jIChwb2ludGVyLT5wcm9jZWR1cmUg aW50IGZ1bmMtcHRyIChsaXN0ICcqKSkpKQogICAgIChsYW1iZGEgKCkKICAgICAgICJXcmFwcGVy IGFyb3VuZCBnZXRpZmFkZHJzICgzKS4iCi0gICAgICAobGV0KiAoKGlmYXAgKG1ha2UtYy1zdHJ1 Y3QgJXN0cnVjdC1pZmFkZHJzLXR5cGUKLQkJCQkgIHN0cnVjdC1pbml0KSkKLQkgICAgIChpZmFw cCAoc2NtLT5wb2ludGVyIGlmYXApKSA7IGlmYXAgcHRyCi0JICAgICAocmV0IChwcm9jIGlmYXBw KSkKLQkgICAgIChlcnIgKGVycm5vKSkpCi0JKGlmICh6ZXJvPyByZXQpCi0JICAgIChuZXh0LWlm YWRkciAocGFyc2UtaWZhZGRycyBpZmFwcCkpCi0JICAgICh0aHJvdyAnc3lzdGVtLWVycm9yICJn ZXRpZmFkZHJzIiAiflM6IH5BIgotCQkgICAobGlzdCBpZmFwIChzdHJlcnJvciBlcnIpKQotCQkg ICAobGlzdCBlcnIpKSkpKSkpCisgICAgICAobGV0KiAoKHB0ciAobWFrZS1jLXN0cnVjdCAlc3Ry dWN0LWlmYWRkcnMtdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzdHJ1 Y3QtaWZhZGRycy1pbml0KSkKKyAgICAgICAgICAgICAocmV0IChwcm9jIHB0cikpCisgICAgICAg ICAgICAgKGVyciAoZXJybm8pKSkKKyAgICAgICAgKGlmICh6ZXJvPyByZXQpCisgICAgICAgICAg ICAobmV4dC1pZmFkZHIgKGlmYWRkcnMtcG9pbnRlci0+YnYgcHRyKSkKKyAgICAgICAgICAgICh0 aHJvdyAnc3lzdGVtLWVycm9yICJnZXRpZmFkZHJzIiAiflM6IH5BIgorICAgICAgICAgICAgICAg ICAgIChsaXN0IHB0ciAoc3RyZXJyb3IgZXJyKSkKKyAgICAgICAgICAgICAgICAgICAobGlzdCBl cnIpKSkpKSkpCisKKyhkZWZpbmUgKG1ha2UtaWZhZGRycyBidikKKyAgIkNvbnZlcnQgYSBieXRl dmVjdG9yIGFsaWFzaW5nIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBhCisnc3RydWN0IGlmYWRk cnMnIHBvaW50ZXIgaW50byBhIDxpbnRlcmZhY2UtYWRkcmVzcz4gcmVjb3JkLiIKKyAgKG1hdGNo IChyZWFkLWlmYWRkcnMgYnYgMCkKKyAgICAoKG5leHQgbmFtZS1wdHIgZmxhZ3MgYWRkciBuZXRt YXNrIGJyb2FkYWRkciBkYXRhKQorICAgICAobWFrZS1pbnRlcmZhY2UtYWRkcmVzcyAocG9pbnRl ci0+c3RyaW5nIChtYWtlLXBvaW50ZXIgbmFtZS1wdHIpKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBmbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1wb2ludGVy IGFkZHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldG1hc2sKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKG1ha2UtcG9pbnRlciBicm9hZGFkZHIpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChtYWtlLXBvaW50ZXIgZGF0YSkpKSkpCiAKIChkZWZpbmUgKGdldGlm YWRkcnMpCi0gICJPYnRhaW4gYSBsaXN0IG9mIG5ldHdvcmsgaW50ZXJmYWNlcyBvbiB0aGUgbG9j YWwgc3lzdGVtLiIKKyAgIlJldHVybiB0aGUgbGlzdCBvZiBuZXR3b3JrIGludGVyZmFjZXMgb24g dGhlIGxvY2FsIHN5c3RlbS4iCiAgIChsZXQgKChpZmFkZHJzICglZ2V0aWZhZGRycykpKQotICAg IChsZXQgbHAgKChjdXJyIGlmYWRkcnMpIChyZXMgJygpKSkKKyAgICAobGV0IGxvb3AgKChjdXJy IGlmYWRkcnMpIChyZXMgJygpKSkKICAgICAgIChpZiAobGFzdC1pbnRlcmZhY2U/IGN1cnIpCi0J ICAocmV2ZXJzZSByZXMpCi0JICAobHAgKG5leHQtaWZhZGRyIGN1cnIpIChjb25zIGN1cnIgcmVz KSkpKSkpCi0KLTs7IEdpdmVuIGEgcG9pbnRlciB0byBhIHN0cnVjdCBpZmFkZHJzLCBwYXJzZSBp dCBpbnRvIGEgbGlzdC4KLShkZWZpbmUtc3ludGF4LXJ1bGUgKHBhcnNlLWlmYWRkcnMgcHRyKQot ICAocGFyc2UtYy1zdHJ1Y3QgcHRyICVzdHJ1Y3QtaWZhZGRycy10eXBlKSkKLQotOzsgUmV0cmll dmUgYSBieXRldmVjdG9yIGFsaWFzaW5nIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGUKLTs7 IGlmYV9uZXh0IHN0cnVjdCBpZmFkZHJzKiBwb2ludGVyLgotKGRlZmluZS1zeW50YXgtcnVsZSAo bmV4dC1pZmFkZHIgaWZhZGRycykKLSAgKHBhcnNlLWMtc3RydWN0IChjYXIgaWZhZGRycykgJXN0 cnVjdC1pZmFkZHJzLXR5cGUpKQotCi07OyBSZXRyaWV2ZSBpbnRlcmZhY2UgbmFtZS4KLShkZWZp bmUtc3ludGF4LXJ1bGUgKGlmYWRkci1uYW1lIGlmYWRkcnMpCi0gIChwb2ludGVyLT5zdHJpbmcg KGNhZHIgaWZhZGRycykpKQotCi07OyBSZXRyaWV2ZSBpbnRlcmZhY2UgZmxhZ3MuCi0oZGVmaW5l LXN5bnRheC1ydWxlIChpZmFkZHItZmxhZ3MgaWZhZGRycykKLSAgKGxpc3QtcmVmIGlmYWRkcnMg MikpCisgICAgICAgICAgKG1hcCBtYWtlLWlmYWRkcnMgKHJldmVyc2UgcmVzKSkKKyAgICAgICAg ICAobG9vcCAobmV4dC1pZmFkZHIgY3VycikKKyAgICAgICAgICAgICAgICAoY29ucyBjdXJyIHJl cykpKSkpKQorCis7OyBSZXRyaWV2ZSB0aGUgaWZhLW5hbWUgZmllbGQgZnJvbSBhICdzdHJ1Y3Qg aWZhZGRycycKKzs7IHBvaW50ZXIgcGFzc2VkIGluIGFzIGEgYnl0ZXZlY3RvciBCVi4KKyhkZWZp bmUtc3ludGF4LXJ1bGUgKGlmYWRkci1uYW1lIGJ2KQorICAobWF0Y2ggKHJlYWQtaWZhZGRycyBi diAwKQorICAgICgobmV4dCBuYW1lLXB0ciBmbGFncyBhZGRyIG5ldG1hc2sgYnJvYWRhZGRyIGRh dGEpCisgICAgIChwb2ludGVyLT5zdHJpbmcgKG1ha2UtcG9pbnRlciBuYW1lLXB0cikpKSkpCisK Kzs7IFJldHJpZXZlIHRoZSBpZmEtZmxhZ3MgZmllbGQgZnJvbSBhICdzdHJ1Y3QgaWZhZGRycycK Kzs7IHBvaW50ZXIgcGFzc2VkIGluIGFzIGEgYnl0ZXZlY3RvciBCVi4KKyhkZWZpbmUtc3ludGF4 LXJ1bGUgKGlmYWRkci1mbGFncyBidikKKyAgKG1hdGNoIChyZWFkLWlmYWRkcnMgYnYgMCkKKyAg ICAoKG5leHQgbmFtZS1wdHIgZmxhZ3MgYWRkciBuZXRtYXNrIGJyb2FkYWRkciBkYXRhKQorICAg ICBmbGFncykpKQorCisoZGVmaW5lIChpZmFkZHJzLXBvaW50ZXItPmJ2IHB0cikKKyAgIlJldHVy biBhIGJ5dGV2ZWN0b3IgYWxpYXNpbmcgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGEKKydzdHJ1 Y3QgaWZhZGRycycgcG9pbnRlciwgcGFzc2VkIGFzIGEgcG9pbnRlciBvYmplY3QgUFRSLiIKKyAg KHBvaW50ZXItPmJ5dGV2ZWN0b3IgcHRyIChzaXplb2YgJXN0cnVjdC1pZmFkZHJzLXR5cGUpKSkK KworOzsgUmV0dXJuIHRoZSBieXRldmVjdG9yIGFsaWFzaW5nIHRoZSBtZW1vcnkgcG9pbnRlZCB0 byBieQorOzsgdGhlIGlmYS1uZXh0IGZpZWxkIGluIGEgJ3N0cnVjdCBpZmFkZHJzJyBwb2ludGVy IHBhc3NlZCBpbgorOzsgYXMgYSBieXRldmVjdG9yLgorKGRlZmluZSBuZXh0LWlmYWRkcgorICAo Y29tcG9zZSBpZmFkZHJzLXBvaW50ZXItPmJ2CisgICAgICAgICAgIG5leHQtaWZhZGRyLXB0cikp CisKKyhkZWZpbmUgKG5leHQtaWZhZGRyLXB0ciBidikKKyAgIlJldHVybiBhIGJ5dGV2ZWN0b3Ig YWxpYXNpbmcgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRoZQoraWZhX25leHQgZmllbGQgb2Yg YSBzdHJ1Y3QgaWZhZGRycyogcG9pbnRlciBwYXNzZWQgYXMgYQorYnl0ZXZlY3RvciBCVi4iCisg IChsZXQqICgocHRyLXNpemUgKHNpemVvZiAnKikpCisgICAgICAgICAoYWRkcmVzcyAoY29uZCAo KD0gcHRyLXNpemUgNCkgKGJ5dGV2ZWN0b3ItdTMyLW5hdGl2ZS1yZWYgYnYgMCkpCisgICAgICAg ICAgICAgICAgICAgICAgICAoKD0gcHRyLXNpemUgOCkgKGJ5dGV2ZWN0b3ItdTY0LW5hdGl2ZS1y ZWYgYnYgMCkpKSkpCisgICAgKG1ha2UtcG9pbnRlciBhZGRyZXNzKSkpCiAKIDs7IElzIGFuIGlu dGVyZmFjZSB0aGUgbGFzdCBpbiB0aGUgaW50cnVzaXZlIGxpbmtlZCBsaXN0IG9mIHN0cnVjdCBp ZmFkZHJzPworOzsgSGVyZSwgSUZBRERSUyBpcyBhIGJ5dGV2ZWN0b3IgYWxpYXNpbmcgdGhlIG1l bW9yeSBwb2ludGVkIHRvIGJ5Cis7OyBhICdzdHJ1Y3QgaWZhZGRycycgcG9pbnRlci4KIChkZWZp bmUtc3ludGF4LXJ1bGUgKGxhc3QtaW50ZXJmYWNlPyBpZmFkZHJzKQotICAobnVsbC1wb2ludGVy PyAoY2FyIGlmYWRkcnMpKSkKKyAgKG51bGwtcG9pbnRlcj8gKG5leHQtaWZhZGRyLXB0ciBpZmFk ZHJzKSkpCiAKIChkZWZpbmUgKHdyaXRlLXNvY2tldC1hZGRyZXNzISBzb2NrYWRkciBidiBpbmRl eCkKICAgIldyaXRlIFNPQ0tBRERSLCBhIHNvY2tldCBhZGRyZXNzIGFzIHJldHVybmVkIGJ5ICdt YWtlLXNvY2tldC1hZGRyZXNzJywgdG8KLS0gCjEuOS4xCgo= --001a1135483e3cab700519e25590--