delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2000/06/05/03:55:50

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sourceware DOT cygnus DOT com>
List-Archive: <http://sourceware.cygnus.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sourceware DOT cygnus DOT com>
List-Help: <mailto:cygwin-help AT sourceware DOT cygnus DOT com>, <http://sourceware.cygnus.com/ml/#faqs>
Sender: cygwin-owner AT sourceware DOT cygnus DOT com
Delivered-To: mailing list cygwin AT sourceware DOT cygnus DOT com
Message-ID: <000901bfcec3$5e9c2820$8e8c97cf@dsp>
From: "Mark Grosen" <mark AT grosen DOT org>
To: <cygwin AT sourceware DOT cygnus DOT com>
Subject: Possible insight into find/du problems
Date: Mon, 5 Jun 2000 00:55:04 -0700
MIME-Version: 1.0
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 5.00.2615.200
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2615.200

I have been looking into the problem with the "find" command returning error
messages like "No such file or directory".

http://sourceware.cygnus.com/ml/cygwin/2000-05/msg01156.html

(I'll admit to being a newbie to cygwin upfront, so apologies for any
obvious mistakes in what follows. This problem was biting me as I got
started with cygwin so I took it as a challenge to get my feet wet.)

I did some tracing through find and determined that what is happening
relates to chdir() and mounted directories. Here is my mount output (after a
default net setup):

Device              Directory           Type         Flags
C:\bin              /usr/bin            user         binmode
C:\lib              /usr/lib            user         binmode
c:                  /                   user         binmode

(Also,   569k 2000/05/15 C:\bin\cygwin1.dll)

Assume autoexec.bat exists in c:\ (this is in Win98).

The following program illustrates the problem:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/unistd.h>

int main(int argc, char * argv[])
{
  struct stat  statBuf;
  int  i;
  char  dir[1024] = {'\0'};

  chdir("/");
  getcwd(dir, sizeof(dir));
  printf("cwd: %s\n", dir);

  for (i = 1; i < argc; i++) {
    if (lstat(argv[i], &statBuf) != 0) {
      fprintf(stderr, "stat failed on %s\n", argv[i]);
      exit(1);
    }
    if (S_ISDIR(statBuf.st_mode)) {
      printf("%s is a directory\n", argv[i]);
      chdir(argv[i]);
      chdir("..");
      getcwd(dir, sizeof(dir));
      printf("cwd: %s\n", dir);
    }
  }

  return (0);
}

The following results when run:

/% ~/stat bin autoexec.bat
cwd: /
bin is a directory
cwd: /usr
stat failed on autoexec.bat
/% ~/stat windows autoexec.bat
cwd: /
windows is a directory
cwd: /
/%

Note that bin is mounted as /usr/bin while windows has no mount point. The
relative chdir(..) gets confused and makes cwd /usr instead of c:\
(/). Obviously, autoexec.bat does not exist in /usr so the lstat()
fails. This is what essentially happens in find, as well.

Note that on the same system, the following works correctly:

/% cd bin
/bin% cd ..
/% cygpath -w /bin
c:\bin
/% cygpath -w /usr/bin
C:\bin

I looked through path.cc, but w/o being able to trace through the code in
gdb, I do not grok what is happening in path_conv::check(). (I have not
figured out how to build and debug cygwin1.dll yet. Any hints?)

Hopefully someone more up on the intricacies of path.cc and mounts can
sort this one out.

Mark







--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019