Opened 7 years ago
Closed 6 years ago
#161 closed enhancement (fixed)
dash: Support BEGINLIBPATH and LIBPATHSTRICT
Reported by: | dmik | Owned by: | dmik |
---|---|---|---|
Priority: | major | Milestone: | |
Component: | dash | Version: | |
Severity: | medium | Keywords: | |
Cc: |
Description
Currently, dash completely lacks support for these pseudo environment variables so it's impossible to set them from a shell script (ash is capable of it). We need to fix it (this doesn't look too difficult).
Change History (4)
comment:1 by , 6 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
comment:2 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
This is done in r2289. Note that I mimic CMD.EXE behavior there in that it doesn't allow assigning BEGINLIBPATH and friends an arbitrary value. This is a limitation (feature?) of DosSetExtLIBPATH
API, to be exact: it corrects the input string as needed and only assigns what it thinks is OK. I.e., doing this:
set BEGINLIBPATH=D:\Temp;BLAHBLAH set LIBPATHSTRICT=True echo %BEGINLIBPATH% echo %LIBPATHSTRICT%
will output this:
D:\Temp; T
I.e. wrong input will be simply discarded. CMD.EXE doesn't do it on its own, it just reads the real result with DosQueryExtLIBPATH
after each assignment and updates its variable representation accordingly. So does dash.
Note that ash (from kLIBC) is not that smart; it keeps the user input even though it was refused by the Dos API which might give some unexpected side effects. The other cool thing dash does and ash doesn't is slash conversion: within dash, all slashes in BEGINLIBPATH and ENDLIBPATH will be converted to forward ones (good that Dos API eats them well too). And when calling external commands, they will be converted back to backward slashes (for DOS compatibility) — just like any other PATH-like variable (which is also a dash unique feature, see #104).
I will test the new dash locally for a while and then release a new RPM.
comment:3 by , 6 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
I found one failing case that works in CMD.EXE. Consider you have bin/myapp.exe
and bin/myapp.dll
needed by that exe. Then this bin/myapp.cmd
script will make the exe work well:
set BEGINLIBPATH=..\lib myapp.exe
However, the respective shell scrip:
BEGINLIBPATH=../lib myapp.exe
will not work.
If you change it to:
BEGINLIBPATH=..\\lib myapp.exe
it will work too, but it's really not a good idea to force backward slashes in POXSIX shell, it's about to break a lot of code.
For some reason DosSetExtLIBPATH API accepts forward slashes in full paths but doesn't accept them in relative paths (while accepting relative paths themselves which is a bit of as surprise) — it simply discards such paths as bad input.
I guess that converting all forward slashes into backward ones before feeding them to DosSetExtLIBPATH will fix this problem.
We need this urgently for https://github.com/bitwiseworks/qtbase-os2/issues/31.