fix part of realpath for drive-qualified DOS paths:
if a path or symlink target is drive-qualified, keep the drive letter (this part from komh) and, if present, a leading (back)slash (from me) missing: if a drive qualification is *not* followed by a (back)slash, we must retrieve the per-drive cwd for the target drive and insert it just like we insert the cwd for (normal/Unix) relative paths; maybe consider redoing absolute/relative path logic, DOS paths are tristate komh’s commit: fix realpath failure on OS/2 On OS/2, an absolute path is 'x:/path/to/file'. Because it has not a leading slash, '/' is prepended, that is, '/x:/path/to/file'. As a result, it fails to find a requested file.
This commit is contained in:
20
misc.c
20
misc.c
@@ -32,7 +32,7 @@
|
|||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.279 2017/08/07 21:39:25 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.280 2017/10/10 21:30:43 tg Exp $");
|
||||||
|
|
||||||
#define KSH_CHVT_FLAG
|
#define KSH_CHVT_FLAG
|
||||||
#ifdef MKSH_SMALL
|
#ifdef MKSH_SMALL
|
||||||
@@ -1783,6 +1783,24 @@ do_realpath(const char *upath)
|
|||||||
/* keep them, e.g. for UNC pathnames */
|
/* keep them, e.g. for UNC pathnames */
|
||||||
Xput(xs, xp, '/');
|
Xput(xs, xp, '/');
|
||||||
}
|
}
|
||||||
|
#ifdef MKSH_DOSPATH
|
||||||
|
/* drive letter? */
|
||||||
|
if (ctype(ip[0], C_ALPHA) && ip[1] == ':') {
|
||||||
|
/* keep it */
|
||||||
|
Xput(xs, xp, *ip++);
|
||||||
|
Xput(xs, xp, *ip++);
|
||||||
|
/* as well as a leading (back)slash */
|
||||||
|
if (mksh_cdirsep(*ip))
|
||||||
|
Xput(xs, xp, *ip++);
|
||||||
|
/*
|
||||||
|
* XXX else: get the cwd on that drive
|
||||||
|
* XXX and prepend it here as this is
|
||||||
|
* XXX a drive-qualified relative path
|
||||||
|
* XXX which we are supposed to convert
|
||||||
|
* XXX to an absolute (with drive) one
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* otherwise (no symlink) merely go on */
|
/* otherwise (no symlink) merely go on */
|
||||||
|
Reference in New Issue
Block a user