Finding exact case of paths

Igor Pechtchanski pechtcha@cs.nyu.edu
Thu Sep 12 20:14:00 GMT 2002


On Thu, 12 Sep 2002, Igor Pechtchanski wrote:

> On Fri, 13 Sep 2002, Paul Johnston wrote:
>
> > > Oh, I see, add a modifier similar to '-s', so that it verifies the case of
> > > each element in the path...  Yeah, that could work, something like:
> > >   -e, --exact-case      print exact case of NAME
> >
> > Yep, exactly. Now, cygpath seems to generally not hit the filesystem -
> > cygpath c:/complete/crap gives me /c/complete/crap so using that switch
> > will necessarily involve a performance hit. Given that, I think I'm
> > happy with my solution based on dirent/strcasecmp. I've attached a
> > stand-alone utility that seems to work (just on cygwin paths), although
> > it has the side effect of squishing down multiple slashes
> > ///like////this//path down to /like/this/path.
> >
> > I think it would be ok to restrict --exact-case to cygwin paths.
>
> I don't think there's a need to search the directory yourself.  Upon
> browsing the cygpath code some more, I realized that it is doing exactly
> what we need (i.e. convert to the exact path) when returning the system
> directory (the '-S' flag).  Quoting the code (cygpath.cc:396):
>
>     case 'S':
>       GetSystemDirectory (buf, MAX_PATH);
>       FindFirstFile (buf, &w32_fd);
>       strcpy (strrchr (buf, '\\') + 1, w32_fd.cFileName);
>       break;
>
> So we can do the same trick with each filename when our option ('-e') is
> in effect.  I'm looking at a fix to cygpath now, and will submit a patch
> as soon as I have it ready.
>
> On a separate note, I found that "cygpath -l -w <path>" does not work on
> my Win2k SP2 system, returning the same garbage (hex 20 FB 22 0a)
> regardless of the path.  Anyone else have that problem?

Well, after further reading of the code and experimenting I've determined
two things:
1) the '-l' option of cygpath works in the cvs HEAD, and
2) it does exactly what we need (thanks, Corinna).

So we can use $(cygpath -u $(cygpath -l -w "$WINETC/$WFILE")) in the
script.  This would require people to upgrade to the new cygpath (which
they would have to anyway, if they were to use the option we proposed),
which means that this script can not be released before the next cygwin,
but that is probably fine.  New version and diff attached.
	Igor
P.S. I'm racking my brain trying to figure out why -l didn't work for me
in version 1.21 of cygpath, but did in version 1.22.  As far as I could
see, the only changes to cygpath were some added newlines...
-- 
				http://cs.nyu.edu/~pechtcha/
      |\      _,,,---,,_		pechtcha@cs.nyu.edu
ZZZzz /,`.-'`'    -.  ;-;;,_		igor@watson.ibm.com
     |,4-  ) )-,_. ,\ (  `'-'		Igor Pechtchanski
    '---''(_/--'  `-'\_) fL	a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

It took the computational power of three Commodore 64s to fly to the moon.
It takes a 486 to run Windows 95.  Something is wrong here. -- SC sig file

-------------- next part --------------
#!/bin/sh
#--
# Create symbolic links from some /etc files to the Windows equivalents
#--

FILES="hosts protocols services networks"

OSNAME=`/bin/uname -s`
WINHOME=`/bin/cygpath -W`

case "$OSNAME" in
  CYGWIN_NT*) WINETC="$WINHOME/system32/drivers/etc" ;;
  CYGWIN_9*|CYGWIN_ME*) WINETC="$WINHOME" ;;
  *) 
    echo "Unknown system type $OSNAME; exiting" >&2
    exit 0
  ;;
esac

if [ ! -d "$WINETC" ]
then
  echo "Directory $WINETC does not exist; exiting" >&2
  exit 0
fi

for FILE in $FILES
do
  if [ ! -e "/etc/$FILE" -a ! -L "/etc/$FILE" ]
  then
    # Windows only uses the first 8 characters
    WFILE="$WINETC/"`expr substr "$FILE" 1 8`
    WFILE=$(cygpath -u "$(cygpath -w -l "$WFILE")")
    /bin/ln -s -v "$WFILE" "/etc/$FILE"
  fi
done


-------------- next part --------------
--- make-etc-links.sh-0.7	2002-09-12 13:05:02.000000000 -0400
+++ make-etc-links.sh	2002-09-12 22:37:16.000000000 -0400
@@ -28,8 +28,9 @@ do
   if [ ! -e "/etc/$FILE" -a ! -L "/etc/$FILE" ]
   then
     # Windows only uses the first 8 characters
-    WFILE=`expr substr "$FILE" 1 8`
-    /bin/ln -s -v "$WINETC/$WFILE" "/etc/$FILE"
+    WFILE="$WINETC/"`expr substr "$FILE" 1 8`
+    WFILE=$(cygpath -u "$(cygpath -w -l "$WFILE")")
+    /bin/ln -s -v "$WFILE" "/etc/$FILE"
   fi
 done
 
-------------- next part --------------
--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


More information about the Cygwin mailing list