Running a script with cyradm throwing ReadLine errors
Binarus
lists at binarus.de
Wed Dec 19 04:29:15 EST 2018
Dear ellie,
On 19.12.2018 01:38, ellie timoney wrote:
>> Then I have replaced the following code in Cyrus::IMAP::Shell
>
> That's very interesting. Does the same modified code continue to work if you uninstall Term::Readline::Gnu again? That is to say, does the non-gnu version break with that addition, or continue to work?
I have just done that test: Yes, the same modified code continues to
work even if Term::ReadLine::Gnu is uninstalled, i.e. my "patch" does
not break the non-gnu version.
>> In other words, I just have made sure that this mysterious *__DATA__
>> variable is reasonably defined in every case before _run is called.
>
> I had a look in Shell.pm and found this comment near the top:
>
>> # run(*FH|'FH')
>> # read commands from the filehandle and pass to exec(); defaults to
>> # __DATA__
I also had seen this comment, but couldn't make any sense from it.
> So maybe that explains where the expectation for __DATA__ is coming from... so:
>
>> # trivial; wrapper for _run with correct setup
>
> I wonder if the "correct setup" is not correct enough!
There are many aspects I didn't understand yet. To me, it seems that
_run is called with a bunch of uninitialized parameters. For example,
where are $cyradm and *__DATA__ initialized? I am currently lacking the
time to do my homework (i.e. to completely understand how this is
supposed to work under normal circumstances), so I don't want to let
other persons waste their time for explaining it to me ...
However, despite the fact that I haven't grasped the overall concept
yet, there is obviously a bug with parsing the command line.
>> I have no idea why the "buggy" command line / argument parsing does not
>> strike when Term::ReadLine::Gnu is uninstalled; I haven't grasped yet
>> how *__DATA__ is supposed to be assigned a reasonable value to during
>> the normal course of execution. I currently can only speculate that
>> Term::ReadLine::<default stub> does this for us, while
>> Term::ReadLine::Gnu doesn't.
>
> I did a bit of reading, and apparently Term::ReadLine is a stub module that just loads "an implementation", which in your case wants to be Term::ReadLine::Gnu. My guess is that, when you uninstall Term::ReadLine::Gnu, Term::ReadLine no longer successfully compiles because it's missing an implementation, and consequently the fallback code I pointed out previously is used instead. So, from this I'm concluding that the "correct setup" from above is adequate for the Cyrus::IMAP::DummyReadline interface, but is not sufficient for a real ReadLine implementation. Sounds like we've found our bug!
I have come to a similar conclusion, and "not sufficient" in this case
probably means that *__DATA__ is not initialized (or assigned to)
correctly. I still have no idea which part of the program is responsible
to assign it the desired file descriptor under normal circumstances.
Possibly Cyrus::IMAP::DummyReadLine does initialize *__DATA__ correctly
(because that module knows who it belongs to :-) and what is needed
later), while Term::ReadLine::Gnu can't know about *__DATA__'s existence
at all. But this is just a completely uneducated guess.
> I'll have a bit of a play with it and see if I can find/fix the discrepancy between the interfaces :)
I'll try to free some time and eventually have a look into
Cyrus::IMAP::DummyReadLine. I think we'll have to find out where
*__DATA__ is normally initialized, and move that initialization to
another place so that it happens regardless of the actual ReadLine "plugin".
> Cheers,
Again, thank you very much for all your help and your support!
Binarus
> ellie
>
> On Wed, Dec 19, 2018, at 5:00 AM, Binarus wrote:
>> Dear ellie,
>>
>> On 17.12.2018 23:57, ellie timoney wrote:
>>> Hi Binarus,
>>>
>>>> Could anybody please tell me what I might do wrong here?
>>>
>>> This kind of smells like maybe your system has two versions of perl installed (or two versions of Term::ReadLine, or maybe even two versions of Cyrus::IMAP::Shell), and they're getting in each other's way?
>>>
>>> I'm having a quick glance at the (2.5.10) source of Cyrus::IMAP::Shell and this caught my eye:
>>>
>>>> # ugh. ugh. suck. aieee.
>>>> my $use_rl = 'Cyrus::IMAP::DummyReadline';
>>>> {
>>>> if (eval { require Term::ReadLine; }) {
>>>> $use_rl = 'Term::ReadLine';
>>>> }
>>>> }
>>
>> I have done some further investigations (very roughly because I don't
>> have the time at the moment). It seems that the code which parses the
>> command line and the run parameters in Cyrus::IMAP::Shell is buggy (or
>> at least not prepared to handle Term::ReadLine::Gnu).
>>
>> As a proof, I have reinstalled Term::ReadLine:Gnu and verified that the
>> problem was showing again.
>>
>> Then I have replaced the following code in Cyrus::IMAP::Shell
>>
>> # trivial; wrapper for _run with correct setup
>> sub run {
>> my $cyradm;
>> _run(\$cyradm, [*STDIN, *STDOUT, *STDERR], *__DATA__);
>> }
>>
>> by the following code:
>>
>> # trivial; wrapper for _run with correct setup
>> sub run {
>> my $cyradm;
>> open(*__DATA__, "./000");
>> _run(\$cyradm, [*STDIN, *STDOUT, *STDERR], *__DATA__);
>> }
>>
>> In other words, I just have made sure that this mysterious *__DATA__
>> variable is reasonably defined in every case before _run is called.
>>
>> Now the command
>>
>> perl -MCyrus::IMAP::Shell -e 'run("000")'
>>
>> executed without any error message.
>>
>> To verify that the script worked as intended, I added a few lines to it:
>>
>> connect -noauthenticate localhost
>> auth cyrus
>> lm
>>
>> When run as shown above, it did exactly what it was supposed to. It
>> asked for the password and then listed all mailboxes and their subfolders.
>>
>> So now I have at least a system where I can have Term::ReadLine::Gnu
>> installed (and thus can have a history and command editing capabilities
>> in cyradm) _and_ can execute a script, although the script's filename is
>> hardcoded.
>>
>> Probably it would be absolutely trivial for the authors of
>> Cyrus::IMAP::Shell to fix this issue. It would be very nice if somebody
>> could care about it. Perhaps it's already fixed in the newer versions? I
>> am still on 2.5.10.
>>
>> I have no idea why the "buggy" command line / argument parsing does not
>> strike when Term::ReadLine::Gnu is uninstalled; I haven't grasped yet
>> how *__DATA__ is supposed to be assigned a reasonable value to during
>> the normal course of execution. I currently can only speculate that
>> Term::ReadLine::<default stub> does this for us, while
>> Term::ReadLine::Gnu doesn't.
>>
>> Regards,
>>
>> Binarus
>> ----
>> Cyrus Home Page: http://www.cyrusimap.org/
>> List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/
>> To Unsubscribe:
>> https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus
> ----
> Cyrus Home Page: http://www.cyrusimap.org/
> List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/
> To Unsubscribe:
> https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus
>
More information about the Info-cyrus
mailing list