From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,HTML_MESSAGE,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: (qmail 12476 invoked from network); 19 Apr 2020 10:31:34 -0000 Received-SPF: pass (primenet.com.au: domain of zsh.org designates 203.24.36.2 as permitted sender) receiver=inbox.vuxu.org; client-ip=203.24.36.2 envelope-from= Received: from ns1.primenet.com.au (HELO primenet.com.au) (203.24.36.2) by inbox.vuxu.org with UTF8ESMTPZ; 19 Apr 2020 10:31:34 -0000 Received: (qmail 2154 invoked by alias); 19 Apr 2020 10:31:23 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 45709 Received: (qmail 11888 invoked by uid 1010); 19 Apr 2020 10:31:23 -0000 X-Qmail-Scanner-Diagnostics: from mail-lf1-f51.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.102.2/25779. spamassassin: 3.4.4. Clear:RC:0(209.85.167.51):SA:0(-2.8/5.0):. Processed in 3.757272 secs); 19 Apr 2020 10:31:23 -0000 X-Envelope-From: timothee.mazzucotelli@gmail.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _netblocks.google.com designates 209.85.167.51 as permitted sender) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=QRQ0vErEE1Q1aX95jKV+cpBk8Cqs3oXahO9WJT7tlMA=; b=rst/T11W0rlkzqzvNKfua+k77jEiw6Mrb0PTWg/lvIQBm1TiCTB7UemPFbNbOQ+ODP sTOACsu1PxkCXANaoC1NcSysrKYsbMK49l7TdTTqOSE6dbuH6/hZ3CVPW6+bNOHy9LW7 uoEVFLPfXW4PjchfhAg5Ad5MdkUMo5SicaXcwzAZtaAc4WSKV22OTcj1e05NLU4gULCU cAHBY8PNF9Guqd7wbNo8FaFfB57XltHJEmTtLH94uPk+2ju/BibAH/XmoDqNHmiCVox8 J+svwhovw+JxUt7jIOu4Dq6e19rVu3N3XKYhAaBMjH2bbrNvugB4rSq+sXfa8yO6BRBe YYLg== X-Gm-Message-State: AGi0PubWiLmLpigU7iPS9wFmL4xcKiiPrLFb/Ta4bOaVs/P6q9DSJDZ0 /ehMfEyp5lyxnAs2Hzbv4Ztis8wOcWe8xaQ3+tY= X-Google-Smtp-Source: APiQypIG/qU8X23POLtpfmXpHRhe2kzkQTkgtrE4unWCWaJSCtFaGH86XWovrrRji3e5dxd9d+Hav/AIU+cyY5Bq6V8= X-Received: by 2002:a05:6512:685:: with SMTP id t5mr7092191lfe.47.1587292245022; Sun, 19 Apr 2020 03:30:45 -0700 (PDT) MIME-Version: 1.0 References: <20190518075514.hbygmb5dl5wz23h5@chaz.gmail.com> <20190520103444.qyih7lvoigvf3rfx@chaz.gmail.com> <1563722540.4311.24.camel@samsung.com> <1565710707.5633.11.camel@samsung.com> In-Reply-To: <1565710707.5633.11.camel@samsung.com> From: =?UTF-8?Q?Timoth=C3=A9e_Mazzucotelli?= Date: Sun, 19 Apr 2020 12:30:33 +0200 Message-ID: Subject: Re: Feature request: ZSH_XTRACEFD variable To: Peter Stephenson , zsh-workers@zsh.org Content-Type: multipart/mixed; boundary="0000000000006b7a2305a3a2461a" --0000000000006b7a2305a3a2461a Content-Type: multipart/alternative; boundary="0000000000006b7a2105a3a24618" --0000000000006b7a2105a3a24618 Content-Type: text/plain; charset="UTF-8" Hello :) I managed to write a test for the ZSH_XTRACEFD feature in A04redirect.ztst, and am planning to add more tests, but maybe you'd have some hints on what I should test? Patch in attachment. On Tue, Aug 13, 2019 at 5:39 PM Peter Stephenson wrote: > How about this? > > I've tried to make it so that if the fd is 2 or less it always uses > the standard file, if it's greater it always creates or frees one, and > it only creates a new file when it's requested to switch. > > One other fix is that we only need to fclose(xtrerr) which then closes > the file descriptor. There's no way of just closing the file and not > the file descriptor --- we'll need to document that the file descriptor > is closed if ZSH_XTRACEFD changes again since it's a bit illogical given > that the user opened the fd in the first place. > > pws > > diff --git a/Src/exec.c b/Src/exec.c > index e81053d67..fe702b644 100644 > --- a/Src/exec.c > +++ b/Src/exec.c > @@ -5394,7 +5394,7 @@ execshfunc(Shfunc shf, LinkList args) > cmdsp = 0; > if ((osfc = sfcontext) == SFC_NONE) > sfcontext = SFC_DIRECT; > - xtrerr = stderr; > + xtrerr = xtrace_file; > > doshfunc(shf, args, 0); > > diff --git a/Src/init.c b/Src/init.c > index 445cd3937..c51197079 100644 > --- a/Src/init.c > +++ b/Src/init.c > @@ -609,8 +609,10 @@ init_io(char *cmd) > SHTTY = -1; > } > > - /* Send xtrace output to stderr -- see execcmd() */ > - xtrerr = stderr; > + /* Send xtrace output to zsh_xtracefd file descriptor -- see > execcmd() */ > + if (zsh_xtracefd == 0) > + zsh_xtracefd = 2; > + xtracefdassign(); > > /* Make sure the tty is opened read/write. */ > if (isatty(0)) { > diff --git a/Src/params.c b/Src/params.c > index 1499e3a40..2347ee9c3 100644 > --- a/Src/params.c > +++ b/Src/params.c > @@ -102,7 +102,8 @@ zlong lastval, /* $? */ > zterm_lines, /* $LINES */ > rprompt_indent, /* $ZLE_RPROMPT_INDENT */ > ppid, /* $PPID */ > - zsh_subshell; /* $ZSH_SUBSHELL */ > + zsh_subshell, /* $ZSH_SUBSHELL */ > + zsh_xtracefd; /* $ZSH_XTRACEFD */ > > /* $FUNCNEST */ > /**/ > @@ -264,6 +265,9 @@ static const struct gsu_array pipestatus_gsu = > static const struct gsu_integer rprompt_indent_gsu = > { intvargetfn, zlevarsetfn, rprompt_indent_unsetfn }; > > +static const struct gsu_integer xtracefd_gsu = > +{ intvargetfn, xtracefdsetfn, xtracefdunsetfn }; > + > /* Nodes for special parameters for parameter hash table */ > > #ifdef HAVE_UNION_INIT > @@ -353,6 +357,7 @@ IPDEF5("LINES", &zterm_lines, zlevar_gsu), > IPDEF5U("ZLE_RPROMPT_INDENT", &rprompt_indent, rprompt_indent_gsu), > IPDEF5("SHLVL", &shlvl, varinteger_gsu), > IPDEF5("FUNCNEST", &zsh_funcnest, varinteger_gsu), > +IPDEF5("ZSH_XTRACEFD", &zsh_xtracefd, xtracefd_gsu), > > /* Don't import internal integer status variables. */ > #define IPDEF6(A,B,F) > {{NULL,A,PM_INTEGER|PM_SPECIAL|PM_DONTIMPORT},BR((void > *)B),GSU(F),10,0,NULL,NULL,NULL,0} > @@ -4387,6 +4392,71 @@ setsecondstype(Param pm, int on, int off) > return 0; > } > > +/* Open / assign the XTRACE fd */ > + > +/**/ > +void xtracefdassign(void) > +{ > + int fd = (int)zsh_xtracefd; > + switch (fd) > + { > + case 0: /* bizarre, but handle for consistency */ > + xtrerr = stdin; > + break; > + > + case 1: > + xtrerr = stdout; > + break; > + > + case 2: > + xtrerr = stderr; > + break; > + > + default: > + xtrerr = fdopen(fd, "w"); > + break; > + } > + xtrace_file = xtrerr; > +} > + > +/* Function to set value of special parameter `ZSH_XTRACEFD' */ > + > +/**/ > +void > +xtracefdsetfn(Param pm, zlong fd) > +{ > + int current_fd; > + > + /* Check that the given file descriptor is valid */ > + if (fcntl(fd, F_GETFD) != -1 || errno != EBADF) { > + current_fd = intvargetfn(pm); > + /* We never close file descriptors 0 (stdin), 1 (stdout) or 2 > stderr) */ > + if (current_fd > 2) > + fclose(xtrerr); > + intvarsetfn(pm, fd); > + xtracefdassign(); > + } else > + zwarn("file descriptor %d is not valid", fd); > + > +} > + > +/* Function to unset value of special parameter `ZSH_XTRACEFD' */ > + > +/**/ > +void > +xtracefdunsetfn(Param pm, UNUSED(int exp)) > +{ > + int current_fd = intvargetfn(pm); > + if (current_fd == 2) /* Nothing to do, already using stderr */ > + return; > + else { /* Reset to file descriptor 2 (stderr) */ > + intvarsetfn(pm, 2); > + if (current_fd > 2) > + fclose(xtrerr); /* Never close standard descriptors */ > + xtrerr = xtrace_file = stderr; > + } > +} > + > /* Function to get value for special parameter `USERNAME' */ > > /**/ > diff --git a/Src/utils.c b/Src/utils.c > index 46cf7bcf6..2eee27697 100644 > --- a/Src/utils.c > +++ b/Src/utils.c > @@ -1760,12 +1760,19 @@ checkmailpath(char **s) > /**/ > FILE *xtrerr = 0; > > +/* This records the last file XTRACE was open too. > + * It's used for restoring XTRACE after a possible redirection.gggg > + */ > + > +/**/ > +FILE *xtrace_file; > + > /**/ > void > printprompt4(void) > { > if (!xtrerr) > - xtrerr = stderr; > + xtracefdassign(); > if (prompt4) { > int l, t = opts[XTRACE]; > char *s = dupstring(prompt4); > --0000000000006b7a2105a3a24618 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello :)

I managed to write a test for the ZSH_XTRACEFD feature in A04redire= ct.ztst, and am planning to add more tests, but maybe you'd have some h= ints on what I should test?

Patch in attachment.





= On Tue, Aug 13, 2019 at 5:39 PM Peter Stephenson <p.stephenson@samsung.com> wr= ote:
How about t= his?

I've tried to make it so that if the fd is 2 or less it always uses
the standard file, if it's greater it always creates or frees one, and<= br> it only creates a new file when it's requested to switch.

One other fix is that we only need to fclose(xtrerr) which then closes
the file descriptor.=C2=A0=C2=A0There's no way of just closing the file= and not
the file descriptor --- we'll need to document that the file descriptor=
is closed if ZSH_XTRACEFD changes again since it's a bit illogical give= n
that the user opened the fd in the first place.

pws

diff --git a/Src/exec.c b/Src/exec.c
index e81053d67..fe702b644 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -5394,7 +5394,7 @@ execshfunc(Shfunc shf, LinkList args)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cmdsp =3D 0;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if ((osfc =3D sfcontext) =3D=3D SFC_NONE)
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0sfcontext =3D SFC_DIRECT;
-=C2=A0=C2=A0=C2=A0=C2=A0xtrerr =3D stderr;
+=C2=A0=C2=A0=C2=A0=C2=A0xtrerr =3D xtrace_file;
=C2=A0
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0doshfunc(shf, args, 0);
=C2=A0
diff --git a/Src/init.c b/Src/init.c
index 445cd3937..c51197079 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -609,8 +609,10 @@ init_io(char *cmd)
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0SHTTY =3D -1;
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0
-=C2=A0=C2=A0=C2=A0=C2=A0/* Send xtrace output to stderr -- see execcmd() *= /
-=C2=A0=C2=A0=C2=A0=C2=A0xtrerr =3D stderr;
+=C2=A0=C2=A0=C2=A0=C2=A0/* Send xtrace output to zsh_xtracefd file descrip= tor -- see execcmd() */
+=C2=A0=C2=A0=C2=A0=C2=A0if (zsh_xtracefd =3D=3D 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0zsh_xtracefd =3D 2;
+=C2=A0=C2=A0=C2=A0=C2=A0xtracefdassign();
=C2=A0
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Make sure the tty is opened read/write. */=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (isatty(0)) {
diff --git a/Src/params.c b/Src/params.c
index 1499e3a40..2347ee9c3 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -102,7 +102,8 @@ zlong lastval,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 /* $?=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0*/
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0zterm_lines,=C2=A0 =C2=A0 =C2=A0 /* $LI= NES=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0rprompt_indent,=C2=A0 =C2=A0/* $ZLE_RPR= OMPT_INDENT */
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ppid,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0/* $PPID=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0zsh_subshell;=C2=A0 =C2=A0 =C2=A0/* $ZSH_SUB= SHELL */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0zsh_subshell,=C2=A0 =C2=A0 =C2=A0/* $ZSH_SUB= SHELL */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0zsh_xtracefd;=C2=A0 =C2=A0 =C2=A0/* $ZSH_XTR= ACEFD */
=C2=A0
=C2=A0/* $FUNCNEST=C2=A0=C2=A0=C2=A0=C2=A0*/
=C2=A0/**/
@@ -264,6 +265,9 @@ static const struct gsu_array pipestatus_gsu =3D
=C2=A0static const struct gsu_integer rprompt_indent_gsu =3D
=C2=A0{ intvargetfn, zlevarsetfn, rprompt_indent_unsetfn };
=C2=A0
+static const struct gsu_integer xtracefd_gsu =3D
+{ intvargetfn, xtracefdsetfn, xtracefdunsetfn };
+
=C2=A0/* Nodes for special parameters for parameter hash table */
=C2=A0
=C2=A0#ifdef HAVE_UNION_INIT
@@ -353,6 +357,7 @@ IPDEF5("LINES", &zterm_lines, zlevar_gsu)= ,
=C2=A0IPDEF5U("ZLE_RPROMPT_INDENT", &rprompt_indent, rprompt_= indent_gsu),
=C2=A0IPDEF5("SHLVL", &shlvl, varinteger_gsu),
=C2=A0IPDEF5("FUNCNEST", &zsh_funcnest, varinteger_gsu),
+IPDEF5("ZSH_XTRACEFD", &zsh_xtracefd, xtracefd_gsu),
=C2=A0
=C2=A0/* Don't import internal integer status variables. */
=C2=A0#define IPDEF6(A,B,F) {{NULL,A,PM_INTEGER|PM_SPECIAL|PM_DONTIMPORT},B= R((void *)B),GSU(F),10,0,NULL,NULL,NULL,0}
@@ -4387,6 +4392,71 @@ setsecondstype(Param pm, int on, int off)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 0;
=C2=A0}
=C2=A0
+/* Open / assign the XTRACE fd */
+
+/**/
+void xtracefdassign(void)
+{
+=C2=A0=C2=A0=C2=A0=C2=A0int fd =3D (int)zsh_xtracefd;
+=C2=A0=C2=A0=C2=A0=C2=A0switch (fd)
+=C2=A0=C2=A0=C2=A0=C2=A0{
+=C2=A0=C2=A0=C2=A0=C2=A0case 0:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* bizarre, but handle for consistency */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0xtrerr =3D stdin;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+
+=C2=A0=C2=A0=C2=A0=C2=A0case 1:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0xtrerr =3D stdout;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+
+=C2=A0=C2=A0=C2=A0=C2=A0case 2:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0xtrerr =3D stderr;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+
+=C2=A0=C2=A0=C2=A0=C2=A0default:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0xtrerr =3D fdopen(fd, "w");
+=C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0=C2=A0=C2=A0=C2=A0}
+=C2=A0=C2=A0=C2=A0=C2=A0xtrace_file =3D xtrerr;
+}
+
+/* Function to set value of special parameter `ZSH_XTRACEFD' */
+
+/**/
+void
+xtracefdsetfn(Param pm, zlong fd)
+{
+=C2=A0=C2=A0=C2=A0=C2=A0int current_fd;
+
+=C2=A0=C2=A0=C2=A0=C2=A0/* Check that the given file descriptor is valid *= /
+=C2=A0=C2=A0=C2=A0=C2=A0if (fcntl(fd, F_GETFD) !=3D -1 || errno !=3D EBADF= ) {
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0current_fd =3D intvargetfn(pm);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* We never close file descriptors 0 (= stdin), 1 (stdout) or 2 stderr) */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (current_fd > 2)
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fclose(xtrerr);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0intvarsetfn(pm, fd);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0xtracefdassign();
+=C2=A0=C2=A0=C2=A0=C2=A0} else
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0zwarn("file descriptor %d is not = valid", fd);
+
+}
+
+/* Function to unset value of special parameter `ZSH_XTRACEFD' */
+
+/**/
+void
+xtracefdunsetfn(Param pm, UNUSED(int exp))
+{
+=C2=A0=C2=A0=C2=A0=C2=A0int current_fd =3D intvargetfn(pm);
+=C2=A0=C2=A0=C2=A0=C2=A0if (current_fd =3D=3D 2)=C2=A0=C2=A0/* Nothing to = do, already using stderr */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return;
+=C2=A0=C2=A0=C2=A0=C2=A0else {=C2=A0=C2=A0/* Reset to file descriptor 2 (s= tderr) */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0intvarsetfn(pm, 2);
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (current_fd > 2)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0fclose(xtrerr);=C2=A0=C2=A0/* Never= close standard descriptors */
+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0xtrerr =3D xtrace_file =3D stderr;
+=C2=A0=C2=A0=C2=A0=C2=A0}
+}
+
=C2=A0/* Function to get value for special parameter `USERNAME' */
=C2=A0
=C2=A0/**/
diff --git a/Src/utils.c b/Src/utils.c
index 46cf7bcf6..2eee27697 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1760,12 +1760,19 @@ checkmailpath(char **s)
=C2=A0/**/
=C2=A0FILE *xtrerr =3D 0;
=C2=A0
+/* This records the last file XTRACE was open too.
+ * It's used for restoring XTRACE after a possible redirection.gggg + */
+
+/**/
+FILE *xtrace_file;
+
=C2=A0/**/
=C2=A0void
=C2=A0printprompt4(void)
=C2=A0{
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!xtrerr)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0xtrerr =3D stderr;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0xtracefdassign();
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (prompt4) {
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0int l, t =3D opts[XTRACE];
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0char *s =3D dupstring(prompt4);
--0000000000006b7a2105a3a24618-- --0000000000006b7a2305a3a2461a Content-Type: text/x-patch; charset="US-ASCII"; name="0001-44752-Implement-ZSH_XTRACEFD-feature.patch" Content-Disposition: attachment; filename="0001-44752-Implement-ZSH_XTRACEFD-feature.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_k96wswrm0 RnJvbSA3MGEwNjlhNDNmYzE1ZWZmNTE2MzI5MGVjYWE3OWQ3YzcxNzA4NDYwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/VGltb3RoPUMzPUE5ZT0yME1henp1Y290ZWxs aT89IDxwYXdhbW95QHBtLm1lPgpEYXRlOiBTYXQsIDE4IEFwciAyMDIwIDE3OjIyOjAzICswMjAw ClN1YmplY3Q6IFtQQVRDSF0gNDQ3NTI6IEltcGxlbWVudCBaU0hfWFRSQUNFRkQgZmVhdHVyZQoK LS0tCiBTcmMvZXhlYy5jICAgICAgICAgICAgfCAgMiArLQogU3JjL2luaXQuYyAgICAgICAgICAg IHwgIDYgKystLQogU3JjL3BhcmFtcy5jICAgICAgICAgIHwgNzIgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLQogU3JjL3V0aWxzLmMgICAgICAgICAgIHwgIDkgKysr KystCiBUZXN0L0EwNHJlZGlyZWN0Lnp0c3QgfCAxMCArKysrKysKIDUgZmlsZXMgY2hhbmdlZCwg OTQgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9TcmMvZXhlYy5j IGIvU3JjL2V4ZWMuYwppbmRleCAyYjhlMjE2N2YuLjBlMzRmNWY5NiAxMDA2NDQKLS0tIGEvU3Jj L2V4ZWMuYworKysgYi9TcmMvZXhlYy5jCkBAIC01NDIxLDcgKzU0MjEsNyBAQCBleGVjc2hmdW5j KFNoZnVuYyBzaGYsIExpbmtMaXN0IGFyZ3MpCiAgICAgY21kc3AgPSAwOwogICAgIGlmICgob3Nm YyA9IHNmY29udGV4dCkgPT0gU0ZDX05PTkUpCiAJc2Zjb250ZXh0ID0gU0ZDX0RJUkVDVDsKLSAg ICB4dHJlcnIgPSBzdGRlcnI7CisgICAgeHRyZXJyID0geHRyYWNlX2ZpbGU7CiAKICAgICBkb3No ZnVuYyhzaGYsIGFyZ3MsIDApOwogCmRpZmYgLS1naXQgYS9TcmMvaW5pdC5jIGIvU3JjL2luaXQu YwppbmRleCAzZDZjOTRkMDQuLjg5YzUwYjE3ZSAxMDA2NDQKLS0tIGEvU3JjL2luaXQuYworKysg Yi9TcmMvaW5pdC5jCkBAIC02MTYsOCArNjE2LDEwIEBAIGluaXRfaW8oY2hhciAqY21kKQogCVNI VFRZID0gLTE7CiAgICAgfQogCi0gICAgLyogU2VuZCB4dHJhY2Ugb3V0cHV0IHRvIHN0ZGVyciAt LSBzZWUgZXhlY2NtZCgpICovCi0gICAgeHRyZXJyID0gc3RkZXJyOworICAgIC8qIFNlbmQgeHRy YWNlIG91dHB1dCB0byB6c2hfeHRyYWNlZmQgZmlsZSBkZXNjcmlwdG9yIC0tIHNlZSBleGVjY21k KCkgKi8KKyAgICBpZiAoenNoX3h0cmFjZWZkID09IDApCisgICAgICAgenNoX3h0cmFjZWZkID0g MjsKKyAgICB4dHJhY2VmZGFzc2lnbigpOwogCiAgICAgLyogTWFrZSBzdXJlIHRoZSB0dHkgaXMg b3BlbmVkIHJlYWQvd3JpdGUuICovCiAgICAgaWYgKGlzYXR0eSgwKSkgewpkaWZmIC0tZ2l0IGEv U3JjL3BhcmFtcy5jIGIvU3JjL3BhcmFtcy5jCmluZGV4IDg2M2IzMjYwMC4uNTY5YzIxMzA0IDEw MDY0NAotLS0gYS9TcmMvcGFyYW1zLmMKKysrIGIvU3JjL3BhcmFtcy5jCkBAIC0xMDYsNyArMTA2 LDggQEAgemxvbmcgbGFzdHZhbCwJCS8qICQ/ICAgICAgICAgICAqLwogICAgICB6dGVybV9saW5l cywJLyogJExJTkVTICAgICAgICovCiAgICAgIHJwcm9tcHRfaW5kZW50LAkvKiAkWkxFX1JQUk9N UFRfSU5ERU5UICovCiAgICAgIHBwaWQsCQkvKiAkUFBJRCAgICAgICAgKi8KLSAgICAgenNoX3N1 YnNoZWxsOwkvKiAkWlNIX1NVQlNIRUxMICovCisgICAgIHpzaF9zdWJzaGVsbCwJLyogJFpTSF9T VUJTSEVMTCAqLworICAgICB6c2hfeHRyYWNlZmQ7CS8qICRaU0hfWFRSQUNFRkQgKi8KIAogLyog JEZVTkNORVNUICAgICovCiAvKiovCkBAIC0yNjgsNiArMjY5LDkgQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBnc3VfYXJyYXkgcGlwZXN0YXR1c19nc3UgPQogc3RhdGljIGNvbnN0IHN0cnVjdCBnc3Vf aW50ZWdlciBycHJvbXB0X2luZGVudF9nc3UgPQogeyBpbnR2YXJnZXRmbiwgemxldmFyc2V0Zm4s IHJwcm9tcHRfaW5kZW50X3Vuc2V0Zm4gfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBnc3VfaW50 ZWdlciB4dHJhY2VmZF9nc3UgPQoreyBpbnR2YXJnZXRmbiwgeHRyYWNlZmRzZXRmbiwgeHRyYWNl ZmR1bnNldGZuIH07CisKIC8qIE5vZGVzIGZvciBzcGVjaWFsIHBhcmFtZXRlcnMgZm9yIHBhcmFt ZXRlciBoYXNoIHRhYmxlICovCiAKICNpZmRlZiBIQVZFX1VOSU9OX0lOSVQKQEAgLTM1Nyw2ICsz NjEsNyBAQCBJUERFRjUoIkxJTkVTIiwgJnp0ZXJtX2xpbmVzLCB6bGV2YXJfZ3N1KSwKIElQREVG NVUoIlpMRV9SUFJPTVBUX0lOREVOVCIsICZycHJvbXB0X2luZGVudCwgcnByb21wdF9pbmRlbnRf Z3N1KSwKIElQREVGNSgiU0hMVkwiLCAmc2hsdmwsIHZhcmludGVnZXJfZ3N1KSwKIElQREVGNSgi RlVOQ05FU1QiLCAmenNoX2Z1bmNuZXN0LCB2YXJpbnRlZ2VyX2dzdSksCitJUERFRjUoIlpTSF9Y VFJBQ0VGRCIsICZ6c2hfeHRyYWNlZmQsIHh0cmFjZWZkX2dzdSksCiAKIC8qIERvbid0IGltcG9y dCBpbnRlcm5hbCBpbnRlZ2VyIHN0YXR1cyB2YXJpYWJsZXMuICovCiAjZGVmaW5lIElQREVGNihB LEIsRikge3tOVUxMLEEsUE1fSU5URUdFUnxQTV9TUEVDSUFMfFBNX0RPTlRJTVBPUlR9LEJSKCh2 b2lkICopQiksR1NVKEYpLDEwLDAsTlVMTCxOVUxMLE5VTEwsMH0KQEAgLTQzOTksNiArNDQwNCw3 MSBAQCBzZXRzZWNvbmRzdHlwZShQYXJhbSBwbSwgaW50IG9uLCBpbnQgb2ZmKQogICAgIHJldHVy biAwOwogfQogCisvKiBPcGVuIC8gYXNzaWduIHRoZSBYVFJBQ0UgZmQgKi8KKworLyoqLwordm9p ZCB4dHJhY2VmZGFzc2lnbih2b2lkKQoreworICAgIGludCBmZCA9IChpbnQpenNoX3h0cmFjZWZk OworICAgIHN3aXRjaCAoZmQpCisgICAgeworICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAg IC8qIGJpemFycmUsIGJ1dCBoYW5kbGUgZm9yIGNvbnNpc3RlbmN5ICovCisgICAgICAgeHRyZXJy ID0gc3RkaW47CisgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgeHRyZXJyID0g c3Rkb3V0OworICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgIHh0cmVyciA9IHN0 ZGVycjsKKyAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgeHRyZXJyID0gZmRv cGVuKGZkLCAidyIpOworICAgICAgIGJyZWFrOworICAgIH0KKyAgICB4dHJhY2VfZmlsZSA9IHh0 cmVycjsKK30KKworLyogRnVuY3Rpb24gdG8gc2V0IHZhbHVlIG9mIHNwZWNpYWwgcGFyYW1ldGVy IGBaU0hfWFRSQUNFRkQnICovCisKKy8qKi8KK3ZvaWQKK3h0cmFjZWZkc2V0Zm4oUGFyYW0gcG0s IHpsb25nIGZkKQoreworICAgIGludCBjdXJyZW50X2ZkOworCisgICAgLyogQ2hlY2sgdGhhdCB0 aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGlzIHZhbGlkICovCisgICAgaWYgKGZjbnRsKGZkLCBG X0dFVEZEKSAhPSAtMSB8fCBlcnJubyAhPSBFQkFERikgeworICAgICAgY3VycmVudF9mZCA9IGlu dHZhcmdldGZuKHBtKTsKKyAgICAgIC8qIFdlIG5ldmVyIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMg MCAoc3RkaW4pLCAxIChzdGRvdXQpIG9yIDIgc3RkZXJyKSAqLworICAgICAgaWYgKGN1cnJlbnRf ZmQgPiAyKQorICAgICAgICBmY2xvc2UoeHRyZXJyKTsKKyAgICAgIGludHZhcnNldGZuKHBtLCBm ZCk7CisgICAgICB4dHJhY2VmZGFzc2lnbigpOworICAgIH0gZWxzZQorICAgICAgendhcm4oImZp bGUgZGVzY3JpcHRvciAlZCBpcyBub3QgdmFsaWQiLCBmZCk7CisKK30KKworLyogRnVuY3Rpb24g dG8gdW5zZXQgdmFsdWUgb2Ygc3BlY2lhbCBwYXJhbWV0ZXIgYFpTSF9YVFJBQ0VGRCcgKi8KKwor LyoqLwordm9pZAoreHRyYWNlZmR1bnNldGZuKFBhcmFtIHBtLCBVTlVTRUQoaW50IGV4cCkpCit7 CisgICAgaW50IGN1cnJlbnRfZmQgPSBpbnR2YXJnZXRmbihwbSk7CisgICAgaWYgKGN1cnJlbnRf ZmQgPT0gMikgIC8qIE5vdGhpbmcgdG8gZG8sIGFscmVhZHkgdXNpbmcgc3RkZXJyICovCisgICAg ICByZXR1cm47CisgICAgZWxzZSB7ICAvKiBSZXNldCB0byBmaWxlIGRlc2NyaXB0b3IgMiAoc3Rk ZXJyKSAqLworICAgICAgaW50dmFyc2V0Zm4ocG0sIDIpOworICAgICAgaWYgKGN1cnJlbnRfZmQg PiAyKQorICAgICAgICAgZmNsb3NlKHh0cmVycik7ICAvKiBOZXZlciBjbG9zZSBzdGFuZGFyZCBk ZXNjcmlwdG9ycyAqLworICAgICAgeHRyZXJyID0geHRyYWNlX2ZpbGUgPSBzdGRlcnI7CisgICAg fQorfQorCiAvKiBGdW5jdGlvbiB0byBnZXQgdmFsdWUgZm9yIHNwZWNpYWwgcGFyYW1ldGVyIGBV U0VSTkFNRScgKi8KIAogLyoqLwpkaWZmIC0tZ2l0IGEvU3JjL3V0aWxzLmMgYi9TcmMvdXRpbHMu YwppbmRleCA2OTg4NWZlZDMuLmE4MTdjOWFhOCAxMDA2NDQKLS0tIGEvU3JjL3V0aWxzLmMKKysr IGIvU3JjL3V0aWxzLmMKQEAgLTE3NjAsMTIgKzE3NjAsMTkgQEAgY2hlY2ttYWlscGF0aChjaGFy ICoqcykKIC8qKi8KIEZJTEUgKnh0cmVyciA9IDA7CiAKKy8qIFRoaXMgcmVjb3JkcyB0aGUgbGFz dCBmaWxlIFhUUkFDRSB3YXMgb3BlbiB0b28uCisgKiBJdCdzIHVzZWQgZm9yIHJlc3RvcmluZyBY VFJBQ0UgYWZ0ZXIgYSBwb3NzaWJsZSByZWRpcmVjdGlvbi4KKyAqLworCisvKiovCitGSUxFICp4 dHJhY2VfZmlsZTsKKwogLyoqLwogdm9pZAogcHJpbnRwcm9tcHQ0KHZvaWQpCiB7CiAgICAgaWYg KCF4dHJlcnIpCi0JeHRyZXJyID0gc3RkZXJyOworCXh0cmFjZWZkYXNzaWduKCk7CiAgICAgaWYg KHByb21wdDQpIHsKIAlpbnQgbCwgdCA9IG9wdHNbWFRSQUNFXTsKIAljaGFyICpzID0gZHVwc3Ry aW5nKHByb21wdDQpOwpkaWZmIC0tZ2l0IGEvVGVzdC9BMDRyZWRpcmVjdC56dHN0IGIvVGVzdC9B MDRyZWRpcmVjdC56dHN0CmluZGV4IGQ2MDUxOTA2NC4uZmQwNjg1NGUxIDEwMDY0NAotLS0gYS9U ZXN0L0EwNHJlZGlyZWN0Lnp0c3QKKysrIGIvVGVzdC9BMDRyZWRpcmVjdC56dHN0CkBAIC03MDgs MyArNzA4LDEzIEBACiAgIGNhdCA8JiR0ZXN0ZmQKIDA6UmVncmVzc2lvbiB0ZXN0IGZvciBoZXJl IGRvY3VtZW50IHdpdGggZmQgZGVjbGFyYXRvcgogPiAgVGhpcyBpcywgaW4gc29tZSBzZW5zZSwg YSBoZXJlIGRvY3VtZW50LgorCisgIHJtIC1mIHJlZGlyCisgIHNldCAteAorICBaU0hfWFRSQUNF RkQ9NCBwcmludCAnVGhpcyBpcyBaU0hfWFRSQUNFRkQgcmVkaXInIDQ+cmVkaXIKKyAgc2V0ICt4 CisgIGNhdCByZWRpcgorMDpSZWRpcmVjdCB4dHJhY2Ugb3V0cHV0IHRvIFpTSF9YVFJBQ0VGRCBm aWxlIGRlc2NyaXB0b3IKKz5UaGlzIGlzIFpTSF9YVFJBQ0VGRCByZWRpcgorPisoZXZhbCk6Mz4g cHJpbnQgJ1RoaXMgaXMgWlNIX1hUUkFDRUZEIHJlZGlyJworPysoZXZhbCk6Mz4gWlNIX1hUUkFD RUZEPTQgKyhldmFsKTo0PiBzZXQgK3gKLS0gCjIuMjYuMAoK --0000000000006b7a2305a3a2461a--