[OpenAFS] Re: [OpenAFS-devel] exposing RPC code<->name mappings via rxgen extension, a library, and a new utility

Felix Frank Felix.Frank@Desy.de
Wed, 6 May 2009 15:05:39 +0200 (CEST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--579669762-1684871921-1241614760=:16521
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; FORMAT=flowed

Attached is my suggestion for a functional translation mechanism.
This patch contains my original changes towards generation of lookup 
tables and Steven's translate_rpc.patch.

A proof of concept implementation is already running in DESY's OpenAFS+OSD 
test cell.

Is this conceptionally sound?

  - Felix

On Wed, 6 May 2009, Felix Frank wrote:

> On Tue, 5 May 2009, Steven Jenkins wrote:
>
>> I'm glad you revived this thread.  Some time ago I started a similar
>> implementation for this that leverages the output from rxgen.  The
>> translate_rpc mechanism just does a simple string or numeric match
>> (and I can't seem to find that at the moment, so I may not have
>> written anything beyond a throw-away program...).
>
> That'll be straight forward, yes. I'll look into it.
>
>> rxgen can be told to dump out its data definitions (via the -h
>> option), which looks like it will do almost everything we need in
>> terms of collecting the data.   I've attached the patch of what I
>> hacked up in the rxgen source, but I actually don't think it's
>> necessary.
>
> Isn't that -x? "Not necessary" - are you implying your patch was gratuitous?
> Which I wouldn't deem true.
>
>> The one problem I hadn't decided how to handle is that two of the Rx
>> IDL specifications overlap (FS and CM, if I recall correctly), so that
>> needs to be resolved.
>
> Does it? Won't the translate functions retain the package prefix? I thought
> there might be going to be one for each interface. Or should callers not be
> required to know what package they are talking about?
>
> The only user in the immediate future will be RxOSD's fs and osd, which need 
> only translate fileserver and rxosd operations respectively,
> for example.
>
>> I think it's probably only a little more work to get this to a usable
>> state.  Even if the -h output won't quite work, the hacking I started
>> in rxgen (or the changes you've started) could be leveraged.
>> 
>> Also, note that I don't think the gperf approach is necessary for the
>> first implementation.  We're only looking at a few hundred RPCs, so
>> the search time, even though O(n), will be fairly fast.  If someone
>> finds a need to do a repeated programmatic use of the table, then we
>> could add a better hashing function at that time.
>
> On Tue, 5 May 2009, Jeffrey Hutzelman wrote:
>
>> --On Tuesday, May 05, 2009 10:12:49 AM +0200 Felix Frank 
>> <Felix.Frank@Desy.de> wrote:
>> 
>>> Is that about what you had in mind?
>>> Further suggestions/criticism?
>> 
>> Hm?  For number->name mapping, the right thing is to _generate a function_ 
>> which works exactly like the ExecuteRequest function that rxgen already 
>> generates, except that instead of calling a server RPC implementation, it 
>> returns a (static) string containing the procedure name.
>
> I fully agree. Steven suggested that the inverse translation should
> work the same way, which would be much to my liking as well.
>
>> At first glance, the patch you included does appear to generate a table 
>> like the one I was describing.  No, I wouldn't feed these into gperf or 
>> modify rxgen or any other component to use gperf.  My point was to use them 
>> as input to a tool analogous to /afs/cs.cmu.edu/user/jhutz/scripts/error, 
>> which is a perl script that parses a directory of com_err tables to 
>> translate an error code or name:
>
>> ]] [jhutz@minbar ~] 3> error 101
>> ]]         101          ENETUNREACH
>> ]]   Network is unreachable
>> ]]         101          VSALVAGE
>> ]]   volume needs to be salvaged
>> ]]
>> ]]
>> ]] [jhutz@minbar ~] 4> error VNOVOL
>> ]]         103          ECONNABORTED
>> ]]   Software caused connection abort
>> ]]         103          VNOVOL
>> ]]   volume does not exist / did not salvage
>> ]]
>> ]] [jhutz@minbar ~] 19> error krb5.7
>> ]] -1765328377 krb5.7   KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN
>> ]]   Server not found in Kerberos database
>> 
>> The tables aren't large enough for it to be worth doing anything fancy; 
>> just slurp them all in and look for what you're looking for.
>
> So the consesus is to
> - generate very simple translation functions and
> - generate lookup tables and branch off a proper script to parse them?
>
> Thanks for all the input
> - Felix
> _______________________________________________
> OpenAFS-devel mailing list
> OpenAFS-devel@openafs.org
> https://lists.openafs.org/mailman/listinfo/openafs-devel
>
--579669762-1684871921-1241614760=:16521
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME=translate_rpc_full.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: ATTACHMENT; FILENAME=translate_rpc_full.patch

SW5kZXg6IHNyYy9yeGdlbi9ycGNfcGFyc2UuYw0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQ0KLS0tIHNyYy9yeGdlbi9ycGNfcGFyc2UuYwkocmV2aXNpb24g
NjQ2KQ0KKysrIHNyYy9yeGdlbi9ycGNfcGFyc2UuYwkocmV2aXNpb24gNjQ5
KQ0KQEAgLTc5LDYgKzc5LDEzIEBADQogY2hhciBmdW5jdGlvbl9saXN0W01B
WF9QQUNLQUdFU10NCiAgICAgW01BWF9GVU5DVElPTlNfUEVSX1BBQ0tBR0Vd
DQogICAgIFtNQVhfRlVOQ1RJT05fTkFNRV9MRU5dOw0KKy8qDQorICogSW50
ZWdlciBhcnJheSB0byAga2VlcCBsaXN0IG9mIG9wY29kZXMgYXMgd2UgcHJv
Y2VzcyB0aGUgZmlsZSwga2VwdA0KKyAqIGluIHN5bmMgd2l0aCB0aGUgZnVu
Y3Rpb25fbGlzdDogaS5lLiwgb3Bjb2RlX2xpc3RbcGFja2FnZV1bbl0gaXMg
dGhlIA0KKyAqIG9wY29kZSBmb3IgZnVuY3Rpb25fbGlzdFtwYWNrYWdlXVtu
XS4NCisgKi8NCitpbnQgb3Bjb2RlX2xpc3RbTUFYX1BBQ0tBR0VTXQ0KKyAg
ICBbTUFYX0ZVTkNUSU9OU19QRVJfUEFDS0FHRV07DQogaW50IGZ1bmN0aW9u
X2xpc3RfaW5kZXg7DQogDQogLyogc3RhdGljIHByb3RvdHlwZXMgKi8NCkBA
IC04MzMsNiArODQwLDcgQEANCiAgICAgfQ0KICAgICBzcHJpbnRmKGZ1bmN0
aW9uX2xpc3RbUGFja2FnZUluZGV4XVtmdW5jdGlvbl9saXN0X2luZGV4XSwg
IiVzJXMlcyIsDQogCSAgICBwcmVmaXgsIFBhY2thZ2VQcmVmaXhbUGFja2Fn
ZUluZGV4XSwgZGVmcC0+cGMucHJvY19uYW1lKTsNCisgICAgb3Bjb2RlX2xp
c3RbUGFja2FnZUluZGV4XVtmdW5jdGlvbl9saXN0X2luZGV4XSA9IGRlZnAt
PnBjLnByb2Nfb3Bjb2RlbnVtOw0KIA0KICAgICBmdW5jdGlvbl9saXN0X2lu
ZGV4Kys7DQogICAgIG5vX29mX3N0YXRfZnVuY3NfaGVhZGVyW1BhY2thZ2VJ
bmRleF0rKzsNCkBAIC0yMTUxLDcgKzIxNTksMjkgQEANCiAgICAgZl9wcmlu
dChmb3V0LCAiXHRyZXR1cm4gel9yZXN1bHQ7XG59XG4iKTsNCiB9DQogDQor
dm9pZA0KK3RvX1Byb2NfQ29kZUdlbmVyYXRpb24oaW50IHBrZ0luZGV4KQ0K
K3sNCisgICAgY2hhciAqcCA9IFBhY2thZ2VQcmVmaXhbcGtnSW5kZXhdOw0K
KyAgICBmX3ByaW50KGZvdXQsICJpbnQgJXNUcmFuc2xhdGVPcE5hbWUoY29u
c3QgY2hhciAqb3BfbmFtZSlcbntcbiIsIHApOw0KKyAgICBmX3ByaW50KGZv
dXQsICJcdGludCBpO1xuIik7DQorICAgIGZfcHJpbnQoZm91dCwgIlx0Zm9y
IChpID0gMCA7IGkgPCAlZCA7IGkrKylcbiIsDQorICAgIAkJCQkJbm9fb2Zf
c3RhdF9mdW5jc19oZWFkZXJbcGtnSW5kZXhdKTsNCisgICAgZl9wcmludChm
b3V0LCAiXHRcdGlmIChzdHJjbXAob3BfbmFtZSwgJXNmdW5jdGlvbl9uYW1l
c1tpXSkgPT0gMClcbiIsIHApOw0KKyAgICBmX3ByaW50KGZvdXQsICJcdFx0
XHRyZXR1cm4gJXNmdW5jdGlvbl9vcGNvZGVzW2ldO1xuIiwgcCk7DQorICAg
IGZfcHJpbnQoZm91dCwgIlx0cmV0dXJuIC0xO1xuIik7DQorICAgIGZfcHJp
bnQoZm91dCwgIn1cblxuIik7DQogDQorICAgIGZfcHJpbnQoZm91dCwgImNo
YXIgKiAlc1RyYW5zbGF0ZU9wQ29kZShpbnQgb3BfY29kZSlcbntcbiIsIHAp
Ow0KKyAgICBmX3ByaW50KGZvdXQsICJcdGludCBpO1xuIik7DQorICAgIGZf
cHJpbnQoZm91dCwgIlx0Zm9yIChpID0gMCA7IGkgPCAlZCA7IGkrKylcbiIs
DQorICAgIAkJCQkJbm9fb2Zfc3RhdF9mdW5jc19oZWFkZXJbcGtnSW5kZXhd
KTsNCisgICAgZl9wcmludChmb3V0LCAiXHRcdGlmIChvcF9jb2RlID09ICVz
ZnVuY3Rpb25fb3Bjb2Rlc1tpXSlcbiIsIHApOw0KKyAgICBmX3ByaW50KGZv
dXQsICJcdFx0XHRyZXR1cm4gJXNmdW5jdGlvbl9uYW1lc1tpXTtcbiIsIHAp
Ow0KKyAgICBmX3ByaW50KGZvdXQsICJcdHJldHVybiBOVUxMO1xuIik7DQor
ICAgIGZfcHJpbnQoZm91dCwgIn1cblxuIik7DQorfQ0KKw0KIHZvaWQNCiBo
X29wY29kZV9zdGF0cyh2b2lkKQ0KIHsNCkBAIC0yMTY5LDggKzIxOTksMTAg
QEANCiAJICAgIGZfcHJpbnQoZm91dCwgIiNkZWZpbmUgJXNOT19PRl9TVEFU
X0ZVTkNTXHQlZFxuXG4iLCBNYXN0ZXJQcmVmaXgsDQogCQkgICAgbm9fb2Zf
c3RhdF9mdW5jc19oZWFkZXJbMF0pOw0KIAkgICAgZl9wcmludChmb3V0LCAi
QUZTX1JYR0VOX0VYUE9SVFxuIik7DQotCSAgICBmX3ByaW50KGZvdXQsICJl
eHRlcm4gY29uc3QgY2hhciAqJXNmdW5jdGlvbl9uYW1lc1tdO1xuXG4iLA0K
KwkgICAgZl9wcmludChmb3V0LCAiZXh0ZXJuIGNvbnN0IGNoYXIgKiVzZnVu
Y3Rpb25fbmFtZXNbXTtcbiIsDQogCQkgICAgTWFzdGVyUHJlZml4KTsNCisJ
ICAgIGZfcHJpbnQoZm91dCwgImV4dGVybiBjb25zdCBpbnQgJXNmdW5jdGlv
bl9vcGNvZGVzW107XG5cbiIsDQorCQkgICAgTWFzdGVyUHJlZml4KTsNCiAJ
fQ0KICAgICB9IGVsc2Ugew0KIAlpbnQgaTsNCkBAIC0yMTg4LDggKzIyMjAs
MTAgQEANCiAJCWZfcHJpbnQoZm91dCwgIiNkZWZpbmUgJXNOT19PRl9TVEFU
X0ZVTkNTXHQlZFxuXG4iLA0KIAkJCVBhY2thZ2VQcmVmaXhbaV0sIG5vX29m
X3N0YXRfZnVuY3NfaGVhZGVyW2ldKTsNCiAJCWZfcHJpbnQoZm91dCwgIkFG
U19SWEdFTl9FWFBPUlRcbiIpOw0KLQkJZl9wcmludChmb3V0LCAiZXh0ZXJu
IGNvbnN0IGNoYXIgKiVzZnVuY3Rpb25fbmFtZXNbXTtcblxuIiwNCisJCWZf
cHJpbnQoZm91dCwgImV4dGVybiBjb25zdCBjaGFyIColc2Z1bmN0aW9uX25h
bWVzW107XG4iLA0KIAkJCVBhY2thZ2VQcmVmaXhbaV0pOw0KKwkJZl9wcmlu
dChmb3V0LCAiZXh0ZXJuIGNvbnN0IGludCAlc2Z1bmN0aW9uX29wY29kZXNb
XTtcblxuIiwNCisJCQlQYWNrYWdlUHJlZml4W2ldKTsNCiAJICAgIH0NCiAJ
fQ0KICAgICB9DQpJbmRleDogc3JjL3J4Z2VuL3JwY191dGlsLmgNCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0NCi0tLSBzcmMvcnhnZW4vcnBjX3V0aWwuaAko
cmV2aXNpb24gNjQ2KQ0KKysrIHNyYy9yeGdlbi9ycGNfdXRpbC5oCShyZXZp
c2lvbiA2NDkpDQpAQCAtMTM2LDYgKzEzNiw3IEBADQogZXh0ZXJuIGNoYXIg
ZnVuY3Rpb25fbGlzdFtNQVhfUEFDS0FHRVNdDQogICAgIFtNQVhfRlVOQ1RJ
T05TX1BFUl9QQUNLQUdFXQ0KICAgICBbTUFYX0ZVTkNUSU9OX05BTUVfTEVO
XTsNCitleHRlcm4gaW50IG9wY29kZV9saXN0W01BWF9QQUNLQUdFU11bTUFY
X0ZVTkNUSU9OU19QRVJfUEFDS0FHRV07DQogZXh0ZXJuIGludCBmdW5jdGlv
bl9saXN0X2luZGV4Ow0KIA0KIGV4dGVybiBkZWZpbml0aW9uICpnZXRfZGVm
aW5pdGlvbih2b2lkKTsNCkluZGV4OiBzcmMvcnhnZW4vcnBjX3NjYW4uYw0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNyYy9yeGdlbi9ycGNfc2Nh
bi5jCShyZXZpc2lvbiA2NDYpDQorKysgc3JjL3J4Z2VuL3JwY19zY2FuLmMJ
KHJldmlzaW9uIDY0OSkNCkBAIC01Nyw2ICs1Nyw3IEBADQogaW50IHB1c2hl
ZCA9IDA7CQkJLyogaXMgYSB0b2tlbiBwdXNoZWQgKi8NCiB0b2tlbiBsYXN0
dG9rOwkJCS8qIGxhc3QgdG9rZW4sIGlmIHB1c2hlZCAqLw0KIGludCBzY2Fu
X3ByaW50ID0gMTsNCitpbnQgcHV0X2RpcmVjdGl2ZXMgPSAxOwkJLyogc2V0
IHRvIDAgdG8gc3VwcHJlc3MgcHJpbnRkaXJlY3RpdmUoKXMgKi8NCiANCiAv
KiBzdGF0aWMgcHJvdG90eXBlcyAqLw0KIHN0YXRpYyB2b2lkIGZpbmRzdHJj
b25zdChjaGFyICoqc3RyLCBjaGFyICoqdmFsKTsNCkBAIC00NzAsNiArNDcx
LDggQEANCiB2b2lkDQogcHJpbnRkaXJlY3RpdmUoY2hhciAqbGluZSkNCiB7
DQorICAgIGlmICggIXB1dF9kaXJlY3RpdmVzICkNCisJcmV0dXJuOw0KICAg
ICBmX3ByaW50KGZvdXQsICIlcyIsIGxpbmUgKyAxKTsNCiB9DQogDQpJbmRl
eDogc3JjL3J4Z2VuL3JwY19tYWluLmMNCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0NCi0tLSBzcmMvcnhnZW4vcnBjX21haW4uYwkocmV2aXNpb24gNjQ2KQ0K
KysrIHNyYy9yeGdlbi9ycGNfbWFpbi5jCShyZXZpc2lvbiA2NDkpDQpAQCAt
NzUsNiArNzUsNyBAQA0KICAgICBpbnQgeGZsYWc7DQogICAgIGludCB5Zmxh
ZzsNCiAgICAgaW50IHVmbGFnOw0KKyAgICBpbnQgdGZsYWc7DQogICAgIGNo
YXIgKmluZmlsZTsNCiAgICAgY2hhciAqb3V0ZmlsZTsNCiB9Ow0KQEAgLTEy
Myw2ICsxMjQsOCBAQA0KIH07DQogI2VuZGlmDQogDQorZXh0ZXJuIGludCBw
dXRfZGlyZWN0aXZlczsNCisNCiAjaW5jbHVkZSAiQUZTX2NvbXBvbmVudF92
ZXJzaW9uX251bWJlci5jIg0KIA0KIC8qIHN0YXRpYyBwcm90b3R5cGVzICov
DQpAQCAtMTQyLDYgKzE0NSw3IEBADQogCQkgICAgIGludCBhcHBlbmQpOw0K
IHN0YXRpYyB2b2lkIFNfb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVm
aW5lLCBpbnQgZXh0ZW5kLCBjaGFyICpvdXRmaWxlLA0KIAkJICAgICBpbnQg
YXBwZW5kKTsNCitzdGF0aWMgdm9pZCB0X291dHB1dChjaGFyICppbmZpbGUs
IGludCBleHRlbmQsIGNoYXIgKm91dGZpbGUsIGludCBhcHBlbmQpOw0KIHN0
YXRpYyBjaGFyICp1cHBlcmNhc2UoY2hhciAqc3RyKTsNCiANCiBpbnQNCkBA
IC0xNzQsNyArMTc4LDcgQEANCiAgICAgaWYgKCFwYXJzZWFyZ3MoYXJnYywg
YXJndiwgJmNtZCkpIHsNCiAJZl9wcmludChzdGRlcnIsICJ1c2FnZTogJXMg
aW5maWxlXG4iLCBjbWRuYW1lKTsNCiAJZl9wcmludChzdGRlcnIsDQotCQki
ICAgICAgICVzIFstYyB8IC1oIHwgLWwgfCAtbSB8IC1DIHwgLVMgfCAtciB8
IC1rIHwgLVIgfCAtcCB8IC1kIHwgLXogfCAtdV0gWy1QcHJlZml4XSBbLUlk
aXJdIFstbyBvdXRmaWxlXSBbaW5maWxlXVxuIiwNCisJCSIgICAgICAgJXMg
Wy1jIHwgLWggfCAtbCB8IC1tIHwgLUMgfCAtUyB8IC1yIHwgLWsgfCAtUiB8
IC1wIHwgLWQgfCAteiB8IC11IHwgLXRdIFstUHByZWZpeF0gWy1JZGlyXSBb
LW8gb3V0ZmlsZV0gW2luZmlsZV1cbiIsDQogCQljbWRuYW1lKTsNCiAJZl9w
cmludChzdGRlcnIsICIgICAgICAgJXMgWy1zIHVkcHx0Y3BdKiBbLW8gb3V0
ZmlsZV0gW2luZmlsZV1cbiIsDQogCQljbWRuYW1lKTsNCkBAIC0xOTksNiAr
MjAzLDkgQEANCiAgICAgfSBlbHNlIGlmIChjbWQuU2ZsYWcpIHsNCiAJT3V0
RmlsZUZsYWcgPSBOVUxMOw0KIAlTX291dHB1dChjbWQuaW5maWxlLCAiLURS
UENfU0VSVkVSIiwgIUVYVEVORCwgY21kLm91dGZpbGUsIDEpOw0KKyAgICB9
IGVsc2UgaWYgKGNtZC50ZmxhZykgew0KKwlPdXRGaWxlRmxhZyA9IE5VTEw7
DQorCXRfb3V0cHV0KGNtZC5pbmZpbGUsICFFWFRFTkQsIGNtZC5vdXRmaWxl
LCAxKTsNCiAgICAgfSBlbHNlIHsNCiAJaWYgKE91dEZpbGVGbGFnICYmIChz
dHJyY2hyKE91dEZpbGUsICcuJykgPT0gTlVMTCkpDQogCSAgICBzdHJjYXQo
T3V0RmlsZSwgIi4iKTsNCkBAIC00MTMsOCArNDIwLDIxIEBADQogCQkgICAg
Zl9wcmludChmb3V0LCAiLFxuXHRcIiVzXCIiLCBmdW5jdGlvbl9saXN0W2pd
W2ldKTsNCiAJCX0NCiAJICAgIH0NCisJICAgIGZfcHJpbnQoZm91dCwgIlxu
fTtcbiIpOw0KIA0KKwkgICAgZl9wcmludChmb3V0LCAiY29uc3QgaW50ICVz
ZnVuY3Rpb25fb3Bjb2Rlc1tdID0ge1xuIiwNCisJCQlQYWNrYWdlUHJlZml4
W2pdKTsNCisJICAgIGZvciAoaSA9IDA7IGkgPCBub19vZl9zdGF0X2Z1bmNz
X2hlYWRlcltqXTsgaSsrKSB7DQorCQlpZiAoaSA9PSAwKSB7DQorCQkgICAg
Zl9wcmludChmb3V0LCAiXHQlZCIsIG9wY29kZV9saXN0W2pdW2ldKTsNCisJ
CX0gZWxzZSB7DQorCQkgICAgZl9wcmludChmb3V0LCAiLFxuXHQlZCIsIG9w
Y29kZV9saXN0W2pdW2ldKTsNCisJCX0NCisJICAgIH0NCisNCiAJICAgIGZf
cHJpbnQoZm91dCwgIlxufTtcbiIpOw0KKw0KKwkgICAgdG9fUHJvY19Db2Rl
R2VuZXJhdGlvbihqKTsNCiAJfQ0KICAgICB9DQogDQpAQCAtNzU3LDYgKzc3
Nyw0NyBAQA0KICAgICBTZmxhZyA9IDA7DQogfQ0KIA0KKy8qDQorICogY3Jl
YXRlIGEgc2ltcGxlIGxvb2t1cCB0YWJsZSBmcm9tIGludGVyZmFjZSBkZWZp
bml0aW9uDQorICovDQorc3RhdGljIHZvaWQNCit0X291dHB1dChjaGFyICpp
bmZpbGUsIGludCBleHRlbmQsIGNoYXIgKm91dGZpbGUsIGludCBhcHBlbmQp
DQorew0KKyAgICBjaGFyICppbmNsdWRlOw0KKyAgICBjaGFyICpvdXRmaWxl
bmFtZTsNCisgICAgY2hhciBmdWxsbmFtZVsxMDI0XTsNCisgICAgZGVmaW5p
dGlvbiAqZGVmOw0KKyAgICBsb25nIHRlbGw7DQorICAgIGNoYXIgKmN1cnJm
aWxlID0gKE91dEZpbGVGbGFnID8gT3V0RmlsZSA6IGluZmlsZSk7DQorDQor
ICAgIHB1dF9kaXJlY3RpdmVzID0gMDsNCisNCisgICAgb3Blbl9pbnB1dChp
bmZpbGUsICIiKTsNCisgICAgbWVtc2V0KGZ1bGxuYW1lLCAwLCBzaXplb2Yo
ZnVsbG5hbWUpKTsNCisgICAgaWYgKGFwcGVuZCkgew0KKwlzdHJjcHkoZnVs
bG5hbWUsIHByZWZpeCk7DQorCXN0cmNhdChmdWxsbmFtZSwgaW5maWxlKTsN
CisgICAgfSBlbHNlDQorCXN0cmNweShmdWxsbmFtZSwgaW5maWxlKTsNCisg
ICAgb3V0ZmlsZW5hbWUgPSBleHRlbmQgPyBleHRlbmRmaWxlKGZ1bGxuYW1l
LCBvdXRmaWxlKSA6IG91dGZpbGU7DQorICAgIG9wZW5fb3V0cHV0KGluZmls
ZSwgb3V0ZmlsZW5hbWUpOw0KKw0KKyAgICB0ZWxsID0gZnRlbGwoZm91dCk7
DQorICAgIGZmbHVzaChmb3V0KTsNCisgICAgd2hpbGUgKGRlZiA9IGdldF9k
ZWZpbml0aW9uKCkpIHsNCisJaWYgKCBkZWYtPmRlZl9raW5kICE9IERFRl9Q
Uk9DICkNCisJICAgIGNvbnRpbnVlOw0KKwlmZmx1c2goZm91dCk7DQorCWZw
cmludGYoZm91dCwgIiVkXHQlc1xuIiwgZGVmLT5wYy5wcm9jX29wY29kZW51
bSwgZGVmLT5wYy5wcm9jX25hbWUpOw0KKyAgICB9DQorDQorICAgIGlmIChl
eHRlbmQgJiYgdGVsbCA9PSBmdGVsbChmb3V0KSkgew0KKwkodm9pZCl1bmxp
bmsob3V0ZmlsZW5hbWUpOw0KKyAgICB9DQorDQorICAgIHB1dF9kaXJlY3Rp
dmVzID0gMTsNCit9DQorDQogc3RhdGljIGNoYXIgKg0KIHVwcGVyY2FzZShj
aGFyICpzdHIpDQogew0KQEAgLTgxMiw2ICs4NzMsNyBAQA0KIAkJY2FzZSAn
ayc6DQogCQljYXNlICdwJzoNCiAJCWNhc2UgJ2QnOg0KKwkJY2FzZSAndCc6
DQogCQljYXNlICd1JzoNCiAJCWNhc2UgJ3gnOg0KIAkJY2FzZSAneSc6DQpA
QCAtODczLDYgKzkzNSw3IEBADQogICAgIGNtZC0+dWZsYWcgPSB1ZmxhZyA9
IGZsYWdbJ3UnXTsNCiAgICAgY21kLT5rZmxhZyA9IGtmbGFnID0gZmxhZ1sn
ayddOw0KICAgICBjbWQtPnBmbGFnID0gZmxhZ1sncCddOw0KKyAgICBjbWQt
PnRmbGFnID0gZmxhZ1sndCddOw0KICAgICBjbWQtPmRmbGFnID0gZGVidWcg
PSBmbGFnWydkJ107DQogICAgIHpmbGFnID0gZmxhZ1sneiddOw0KICAgICBp
ZiAoY21kLT5wZmxhZykNCg==

--579669762-1684871921-1241614760=:16521--