Opened 5 years ago

Last modified 15 months ago

#11893 assigned bug

When a shell script is the handling application for a mimetype, registrar does not propagate arguments to it

Reported by: waddlesplash Owned by: nobody
Priority: normal Milestone: R1
Component: Applications/Tracker Version: R1/Development
Keywords: Cc:
Blocked By: Blocking:
Has a Patch: no Platform: All

Description

I'm currently working on a launcher for Jar files. Everything currently works, except when Registrar launches the script because I double-click on a file in Tracker or use open, it doesn't pass the filename as an argument, even with B_ARGV_ONLY in the app_flags.

The script and RDEF are attached. Set them up with:

chmod +x hjava
rc hjava.rdef
resattr -o hjava hjava.rsrc

(Note that resattr was not included in the build until hrev48852, so prior to that you'll have to compile it yourself.)

Attachments (2)

hjava.rdef (2.5 KB ) - added by waddlesplash 5 years ago.
hjava (241 bytes ) - added by waddlesplash 5 years ago.

Download all attachments as: .zip

Change History (12)

by waddlesplash, 5 years ago

Attachment: hjava.rdef added

by waddlesplash, 5 years ago

Attachment: hjava added

comment:1 by bonefish, 5 years ago

Component: Servers/registrarApplications/Tracker
Owner: changed from bonefish to axeld

If the script can be registered as an application -- which surprises me a bit, but well ... -- the registrar isn't involved in its execution. The code you're looking for is generally in BRoster::Launch(), but I believe Tracker only gets the handling application from BRoster and does the launching itself.

comment:2 by waddlesplash, 5 years ago

Ah, makes sense. I did look at BRoster::Launch but I saw no reason why it wouldn't work...

comment:3 by hamish, 5 years ago

Looking at the BRoster code this seems intentional (and also applies to regular non-BApplication executables, not just scripts). If no additional arguments (argc, argv) are passed to BRoster::Launch() then it won't include the target file path in the argument vector.

It will send the file ref later in a message. It will try to send the message even if the app has the B_ARGV_ONLY flag — which seems to go against the definition given in the Be Book. Is this the BeOS behaviour, or a mistake?

comment:4 by bonefish, 5 years ago

At least the BRoster::Launch() unit tests for the B_MULTIPLE_LAUNCH | B_ARGV_ONLY cases suggest (here and here) that main() args are actually expected. At a quick glance, the argv cases are exercised by the test methods LaunchTester::LaunchTestC3(), LaunchTester::LaunchTestF8(), and LaunchTester::LaunchTestF9().

The tests were modelled to verify the BeOS R5 behavior and Haiku's app kit classes were written against the tests. It would be interesting to run the tests against the current Haiku.

comment:5 by hamish, 5 years ago

After some battling with the unit tests it seems that the argv is not expected to contain the file path if no additional args are passed. See http://cgit.haiku-os.org/haiku/tree/src/tests/kits/app/broster/LaunchTesterHelper.cpp#n426.

I'm curious if this is indeed the behaviour on BeOS for a B_ARGV_ONLY app, because it seems that a B_ARGV_ONLY app would have no other way to receive the target file in that case.

A few of the tests were also broken because the BMessage::ReturnAddress() of the messages sent to the launch context would refer to the launch context itself. On the test app side, it makes a copy of the RefsReceived message, and this also ends up copying the reply-to address of the message. If the tests pass under BeOS, that would suggest this behaviour is also wrong.

in reply to:  3 comment:6 by ttcoder, 5 years ago

Replying to hamish:

It will send the file ref later in a message. It will try to send the message even if the app has the B_ARGV_ONLY flag — which seems to go against the definition given in the Be Book. Is this the BeOS behaviour, or a mistake?

Is that part maybe adressed in hrev49064 ?

comment:7 by hamish, 5 years ago

Unfortunately not — this concerns the BRoster launching behaviour rather than BApplication's silent-relaunch.

comment:8 by hamish, 5 years ago

After some testing (thanks to Diver) it seems that this does indeed match the BeOS behaviour.

Is there a strong reason to keep this behaviour? None of our in-tree apps that use B_ARGV_ONLY expect to be launched as the handler of a file -- so they would not be affected by such a change.

comment:9 by axeld, 3 years ago

Owner: changed from axeld to nobody
Status: newassigned

comment:10 by waddlesplash, 15 months ago

Interestingly, it seems that as long as the passed ref is indeed a document, it gets put into argv anyway: http://xref.plausible.coop/source/xref/haiku/src/kits/app/Roster.cpp#518 -- http://xref.plausible.coop/source/xref/haiku/src/kits/app/Roster.cpp#1893. So I'm not entirely sure what's going on here.

Note: See TracTickets for help on using tickets.