OSDN Git Service

* dtable.cc (dtable::build_fhandler_from_name): Just pass posix path along to
authorcgf <cgf>
Fri, 24 May 2002 05:44:10 +0000 (05:44 +0000)
committercgf <cgf>
Fri, 24 May 2002 05:44:10 +0000 (05:44 +0000)
set_name via return_and_clear_normalized_path.
(dtable::build_fhandler): New method with const char * argument.
(dtable::reset_unix_path_name): Eliminate.
(dtable::dup_worker): Use correct build_fhandler method.
* mmap.cc (mmap_record::alloc_fh): Ditto.
* dtable.h (dtable::build_fhandler): New method.
(dtable::reset_unix_path_name): Eliminate.
* fhandler.cc (fhandler_base::set_name): Assume that unix_name has already been
cmalloced.
(fhandler_base::reset_unix_path_name): Eliminate.
(fhandler_base::~fhandler_base): Coercion for cfree.
* fhandler.h (fhandler_base::unix_path_name): Make const char *.
(fhandler_base::win32_path_name): Ditto.
(fhandler_base::reset_unix_path_name): Eliminate.
* fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Accommodate const char
*ness of win32_path_name.
* fhandler_socket.cc (fhandler_socket::fstat): Accommodate new set_name
requirements.
* path.cc (path_conv::return_and_clear_normalized_path): New method.
(path_conv::clear_normalized_path): Eliminate.
(path_conv::~path_conv): Ditto.
(path_conv::check): Accommodate new build_fhandler method.
* path.h (path_conv::~path_conv): Eliminate.
(path_conv::clear_normalized_path): Ditto.
(path_conv::return_and_clear_normalized_path): Declare new method.

winsup/cygwin/ChangeLog
winsup/cygwin/dtable.cc
winsup/cygwin/dtable.h
winsup/cygwin/fhandler.cc
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/mmap.cc
winsup/cygwin/path.cc
winsup/cygwin/path.h

index 512fe72..cd682cb 100644 (file)
@@ -1,3 +1,32 @@
+2002-05-24  Christopher Faylor  <cgf@redhat.com>
+
+       * dtable.cc (dtable::build_fhandler_from_name): Just pass posix path
+       along to set_name via return_and_clear_normalized_path.
+       (dtable::build_fhandler): New method with const char * argument.
+       (dtable::reset_unix_path_name): Eliminate.
+       (dtable::dup_worker): Use correct build_fhandler method.
+       * mmap.cc (mmap_record::alloc_fh): Ditto.
+       * dtable.h (dtable::build_fhandler): New method.
+       (dtable::reset_unix_path_name): Eliminate.
+       * fhandler.cc (fhandler_base::set_name): Assume that unix_name has
+       already been cmalloced.
+       (fhandler_base::reset_unix_path_name): Eliminate.
+       (fhandler_base::~fhandler_base): Coercion for cfree.
+       * fhandler.h (fhandler_base::unix_path_name): Make const char *.
+       (fhandler_base::win32_path_name): Ditto.
+       (fhandler_base::reset_unix_path_name): Eliminate.
+       * fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Accommodate
+       const char *ness of win32_path_name.
+       * fhandler_socket.cc (fhandler_socket::fstat): Accommodate new set_name
+       requirements.
+       * path.cc (path_conv::return_and_clear_normalized_path): New method.
+       (path_conv::clear_normalized_path): Eliminate.
+       (path_conv::~path_conv): Ditto.
+       (path_conv::check): Accommodate new build_fhandler method.
+       * path.h (path_conv::~path_conv): Eliminate.
+       (path_conv::clear_normalized_path): Ditto.
+       (path_conv::return_and_clear_normalized_path): Declare new method.
+
 2002-05-23  Christopher Faylor  <cgf@redhat.com>
 
        * path.cc (path_conv::check): Make sure any trailing path component is
index e4f2ddf..3c91e50 100644 (file)
@@ -287,16 +287,24 @@ dtable::build_fhandler_from_name (int fd, const char *name, HANDLE handle,
       return NULL;
     }
 
-  fhandler_base *fh = build_fhandler (fd, pc.get_devn (), pc.normalized_path, pc, pc.get_unitn ());
-  pc.clear_normalized_path ();
+  fhandler_base *fh = build_fhandler (fd, pc.get_devn (),
+                                     pc.return_and_clear_normalized_path (),
+                                     pc, pc.get_unitn ());
   return fh;
 }
 
-#define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name
 fhandler_base *
 dtable::build_fhandler (int fd, DWORD dev, const char *unix_name,
                        const char *win32_name, int unit)
 {
+  return build_fhandler (fd, dev, cstrdup (unix_name), win32_name, unit);
+}
+
+#define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name
+fhandler_base *
+dtable::build_fhandler (int fd, DWORD dev, char *unix_name,
+                       const char *win32_name, int unit)
+{
   fhandler_base *fh;
 
   dev &= FH_DEVMASK;
@@ -400,7 +408,7 @@ dtable::build_fhandler (int fd, DWORD dev, const char *unix_name,
 fhandler_base *
 dtable::dup_worker (fhandler_base *oldfh)
 {
-  fhandler_base *newfh = build_fhandler (-1, oldfh->get_device (), NULL);
+  fhandler_base *newfh = build_fhandler (-1, oldfh->get_device ());
   *newfh = *oldfh;
   newfh->set_io_handle (NULL);
   if (oldfh->dup (newfh))
@@ -478,14 +486,6 @@ done:
   return res;
 }
 
-void
-dtable::reset_unix_path_name (int fd, const char *name)
-{
-  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "reset_unix_name");
-  fds[fd]->reset_unix_path_name (name);
-  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "reset_unix_name");
-}
-
 select_record *
 dtable::select_read (int fd, select_record *s)
 {
index 47e0a3b..5a8f569 100644 (file)
@@ -50,6 +50,8 @@ public:
   void fixup_after_fork (HANDLE);
   fhandler_base *build_fhandler (int fd, DWORD dev, const char *unix_name,
                                 const char *win32_name = NULL, int unit = -1);
+  fhandler_base *build_fhandler (int fd, DWORD dev, char *unix_name = NULL,
+                                const char *win32_name = NULL, int unit = -1);
   fhandler_base *build_fhandler_from_name (int fd, const char *name, HANDLE h,
                                           path_conv& pc,
                                           unsigned opts = PC_SYM_FOLLOW,
@@ -63,7 +65,6 @@ public:
     ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "not open");
     return res;
   }
-  void reset_unix_path_name (int fd, const char *name);
   int find_unused_handle (int start);
   int find_unused_handle () { return find_unused_handle (first_fd_for_open);}
   void release (int fd);
index d1b0a4a..ff334bf 100644 (file)
@@ -161,8 +161,9 @@ fhandler_base::set_name (const char *unix_path, const char *win32_path, int unit
   else
     {
       const char *fmt = get_native_name ();
-      win32_path_name = (char *) cmalloc (HEAP_STR, strlen(fmt) + 16);
-      __small_sprintf (win32_path_name, fmt, unit);
+      char *w =  (char *) cmalloc (HEAP_STR, strlen(fmt) + 16);
+      __small_sprintf (w, fmt, unit);
+      win32_path_name = w;
     }
 
   if (win32_path_name == NULL)
@@ -178,12 +179,15 @@ fhandler_base::set_name (const char *unix_path, const char *win32_path, int unit
      path_conv. Ideally, we should pass in a format string and build the
      unix_path, too. */
   if (!is_device () || *win32_path_name != '\\')
-    unix_path_name = cstrdup (unix_path);
+    unix_path_name = unix_path;
   else
     {
-      unix_path_name = cstrdup (win32_path_name);
-      for (char *p = unix_path_name; (p = strchr (p, '\\')); p++)
-       *p = '/';
+      char *p = cstrdup (win32_path_name);
+      unix_path_name = p;
+      while ((p = strchr (p, '\\')) != NULL)
+       *p++ = '/';
+      if (unix_path)
+       cfree ((void *) unix_path);
     }
 
   if (unix_path_name == NULL)
@@ -194,13 +198,6 @@ fhandler_base::set_name (const char *unix_path, const char *win32_path, int unit
   namehash = hash_path_name (0, win32_path_name);
 }
 
-void
-fhandler_base::reset_unix_path_name (const char *unix_path)
-{
-  cfree (unix_path_name);
-  unix_path_name = cstrdup (unix_path);
-}
-
 /* Detect if we are sitting at EOF for conditions where Windows
    returns an error but UNIX doesn't.  */
 static int __stdcall
@@ -1047,9 +1044,9 @@ fhandler_base::fhandler_base (DWORD devtype, int unit):
 fhandler_base::~fhandler_base (void)
 {
   if (unix_path_name != NULL)
-    cfree (unix_path_name);
+    cfree ((void *) unix_path_name);
   if (win32_path_name != NULL)
-    cfree (win32_path_name);
+    cfree ((void *) win32_path_name);
   if (rabuf)
     free (rabuf);
   unix_path_name = win32_path_name = NULL;
index a30364b..740a296 100644 (file)
@@ -149,15 +149,13 @@ class fhandler_base
   size_t raixput;
   size_t rabuflen;
 
-  char *unix_path_name;
-  char *win32_path_name;
+  const char *unix_path_name;
+  const char *win32_path_name;
   DWORD open_status;
 
  public:
-  void set_name (const char * unix_path, const char * win32_path = NULL,
-                int unit = 0);
+  void set_name (const char * unix_path, const char *win32_path = NULL, int unit = 0);
 
-  void reset_unix_path_name (const char *);
   virtual fhandler_base& operator =(fhandler_base &x);
   fhandler_base (DWORD dev, int unit = 0);
   virtual ~fhandler_base ();
index 99f8b7a..347d1fd 100644 (file)
@@ -775,10 +775,10 @@ void
 fhandler_cygdrive::set_drives ()
 {
   const int len = 1 + 26 * DRVSZ;
-  win32_path_name = (char *) crealloc (win32_path_name, len);
+  char *p = (char *) crealloc ((void *) win32_path_name, len);
 
-  ndrives = GetLogicalDriveStrings (len, win32_path_name) / DRVSZ;
-  pdrive = win32_path_name;
+  win32_path_name = pdrive = p;
+  ndrives = GetLogicalDriveStrings (len, p) / DRVSZ;
 }
 
 int
index e343c90..e0e5c63 100644 (file)
@@ -248,7 +248,7 @@ int __stdcall
 fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc)
 {
   fhandler_disk_file fh;
-  fh.set_name (get_name (), get_win32_name ());
+  fh.set_name (cstrdup (get_name ()), get_win32_name ());
   return fh.fstat (buf, pc);
 }
 
index c9db998..93afa85 100644 (file)
@@ -251,7 +251,7 @@ mmap_record::alloc_fh ()
      the call to fork(). This requires creating a fhandler
      of the correct type to be sure to call the method of the
      correct class. */
-  return cygheap->fdtab.build_fhandler (-1, get_device (), NULL);
+  return cygheap->fdtab.build_fhandler (-1, get_device ());
 }
 
 void
index 9ae5df8..14c5d00 100644 (file)
@@ -366,20 +366,12 @@ fs_info::update (const char *win32_path)
   return true;
 }
 
-void
-path_conv::clear_normalized_path ()
-{
-  // not thread safe
-  if (normalized_path)
-    {
-      cfree (normalized_path);
-      normalized_path = NULL;
-    }
-}
-
-path_conv::~path_conv ()
+char *
+path_conv::return_and_clear_normalized_path ()
 {
-  clear_normalized_path ();
+  char *s = normalized_path;
+  normalized_path = NULL;
+  return s;
 }
 
 /* Convert an arbitrary path SRC to a pure Win32 path, suitable for
@@ -520,7 +512,7 @@ path_conv::check (const char *src, unsigned opt,
             {
              /* FIXME: Calling build_fhandler here is not the right way to handle this. */
               fhandler_virtual *fh =
-                (fhandler_virtual *) cygheap->fdtab.build_fhandler (-1, devn, path_copy, NULL, unit);
+                (fhandler_virtual *) cygheap->fdtab.build_fhandler (-1, devn, (const char *) path_copy, NULL, unit);
               int file_type = fh->exists ();
               switch (file_type)
                 {
@@ -731,7 +723,6 @@ out:
        *tail = '/';
       normalized_path = cstrdup (path_copy);
       debug_printf ("path_copy %s", path_copy);
-      opt ^= PC_POSIX;
     }
   /* Deal with Windows stupidity which considers filename\. to be valid
      even when "filename" is not a directory. */
index 7024610..079bd54 100644 (file)
@@ -134,7 +134,6 @@ class path_conv
                unit (0), fileattr (INVALID_FILE_ATTRIBUTES),
                normalized_path (NULL) {path[0] = '\0';}
 
-  ~path_conv ();
   inline char *get_win32 () { return path; }
   operator char *() {return path;}
   operator const char *() {return path;}
@@ -147,7 +146,7 @@ class path_conv
   DWORD get_drive_type () {return fs.drive_type;}
   BOOL fs_fast_ea () {return fs.sym_opt & PC_CHECK_EA;}
   void set_path (const char *p) {strcpy (path, p);}
-  void clear_normalized_path ();
+  char *return_and_clear_normalized_path ();
 };
 
 /* Symlink marker */