Running a script with cyradm throwing ReadLine errors
ellie timoney
ellie at fastmail.com
Tue Dec 18 19:38:23 EST 2018
Hi Binarus,
> 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?
> 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__
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!
> 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'll have a bit of a play with it and see if I can find/fix the discrepancy between the interfaces :)
Cheers,
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
More information about the Info-cyrus
mailing list