Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^2: Poll: Is your $^X an absolute path? (argv[0])

by xdg (Monsignor)
on Aug 18, 2006 at 02:53 UTC ( #568066=note: print w/replies, xml ) Need Help??


in reply to Re: Poll: Is your $^X an absolute path? (argv[0])
in thread Poll: Is your $^X an absolute path?

Win32 Perl has always had GetModulePathName()

At least my cursory grep didn't find that function in the perl source -- but perhaps it's called via some libraries or alias. It looks like it's just getting the name from whatever the compiler sets up as argv[0].

Based on 'case 3' in this article, I thought it might be possible to spoof the executable name with a bogus argv[0] via CreateProcess, but my experiments with Win32::Process and Win32::Job weren't successful at getting anything other than the absolute path. I didn't try with Win32::API directly as that doesn't (yet) compile for Vanilla Perl.

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

  • Comment on Re^2: Poll: Is your $^X an absolute path? (argv[0])

Replies are listed 'Best First'.
Re^3: Poll: Is your $^X an absolute path? (argv[0])
by tye (Sage) on Aug 18, 2006 at 05:13 UTC
    Win32 Perl has always had GetModulePathName()
    At least my cursory grep didn't find that function in the perl source

    Sorry, my transcription error (s/Path/File/):

    perllib.c:171: GetModuleFileName(NULL, szModuleName, sizeof(szModul +eName)); win32.c:135: GetModuleFileName((HMODULE)((w32_perldll_handle == INV +ALID_HANDLE_VALUE) win32.c:136: ? GetModuleHandle(NULL)
    It looks like it's just getting the name from whatever the compiler sets up as argv[0].

    No, Win32 Perl has never figured out $^X based on argv[0] (except before it was released). The function called is os2_execna­me(aTHX) (yes, Win32 is consider OS/2-ish).

    - tye        

      No, Win32 Perl has never figured out $^X based on argv[0]

      I freely admit to being very new to reading the Perl source (what's that line about 'a maze of twisty passages'?) but what about this excerpt from perllib.c around the line you quoted (for Perl 5.8.8 anyway):

      EXTERN_C DllExport int RunPerl(int argc, char **argv, char **env) { int exitstatus; PerlInterpreter *my_perl, *new_perl = NULL; #ifndef __BORLANDC__ /* XXX this _may_ be a problem on some compilers (e.g. Borland) th +at * want to free() argv after main() returns. As luck would have i +t, * Borland's CRT does the right thing to argv[0] already. */ char szModuleName[MAX_PATH]; GetModuleFileName(NULL, szModuleName, sizeof(szModuleName)); (void)win32_longpath(szModuleName); argv[0] = szModuleName; #endif

      It looks like win32 Perl fixes up argv[0] itself -- and that this is what is used later by S_set_caret_X (a new function as of 5.8.7).

      However, that perllib.c line is a great find for Vanilla Perl -- it means we should be able to use relocatable perl pretty easily in most circumstances. (I'm not going to worry about mod_perl on win32 at first.)

      The downside is that the expansion uses the full path -- including spaces if installed somewhere like "C:\Program Files\Perl". That will still be problematic for people who call system("$^X program.pl arg1 arg2 etc") as the shell is going to have problems as the program name is not quoted. Of course -- that's not really a portable call anyway, so maybe we tackle that problem with documentation.

      -xdg

      Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://568066]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (3)
As of 2018-05-22 03:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?