* 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.
This commit is contained in:
Christopher Faylor 2002-05-24 05:44:10 +00:00
parent 7a364eb364
commit ff93854697
10 changed files with 70 additions and 55 deletions

View 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> 2002-05-23 Christopher Faylor <cgf@redhat.com>
* path.cc (path_conv::check): Make sure any trailing path component is * path.cc (path_conv::check): Make sure any trailing path component is

View File

@ -287,14 +287,22 @@ dtable::build_fhandler_from_name (int fd, const char *name, HANDLE handle,
return NULL; return NULL;
} }
fhandler_base *fh = build_fhandler (fd, pc.get_devn (), pc.normalized_path, pc, pc.get_unitn ()); fhandler_base *fh = build_fhandler (fd, pc.get_devn (),
pc.clear_normalized_path (); pc.return_and_clear_normalized_path (),
pc, pc.get_unitn ());
return fh; return fh;
} }
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 #define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name
fhandler_base * fhandler_base *
dtable::build_fhandler (int fd, DWORD dev, const char *unix_name, dtable::build_fhandler (int fd, DWORD dev, char *unix_name,
const char *win32_name, int unit) const char *win32_name, int unit)
{ {
fhandler_base *fh; fhandler_base *fh;
@ -400,7 +408,7 @@ dtable::build_fhandler (int fd, DWORD dev, const char *unix_name,
fhandler_base * fhandler_base *
dtable::dup_worker (fhandler_base *oldfh) 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 = *oldfh;
newfh->set_io_handle (NULL); newfh->set_io_handle (NULL);
if (oldfh->dup (newfh)) if (oldfh->dup (newfh))
@ -478,14 +486,6 @@ done:
return res; 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 * select_record *
dtable::select_read (int fd, select_record *s) dtable::select_read (int fd, select_record *s)
{ {

View File

@ -50,6 +50,8 @@ public:
void fixup_after_fork (HANDLE); void fixup_after_fork (HANDLE);
fhandler_base *build_fhandler (int fd, DWORD dev, const char *unix_name, fhandler_base *build_fhandler (int fd, DWORD dev, const char *unix_name,
const char *win32_name = NULL, int unit = -1); 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, fhandler_base *build_fhandler_from_name (int fd, const char *name, HANDLE h,
path_conv& pc, path_conv& pc,
unsigned opts = PC_SYM_FOLLOW, unsigned opts = PC_SYM_FOLLOW,
@ -63,7 +65,6 @@ public:
ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "not open"); ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "not open");
return res; return res;
} }
void reset_unix_path_name (int fd, const char *name);
int find_unused_handle (int start); int find_unused_handle (int start);
int find_unused_handle () { return find_unused_handle (first_fd_for_open);} int find_unused_handle () { return find_unused_handle (first_fd_for_open);}
void release (int fd); void release (int fd);

View File

@ -161,8 +161,9 @@ fhandler_base::set_name (const char *unix_path, const char *win32_path, int unit
else else
{ {
const char *fmt = get_native_name (); const char *fmt = get_native_name ();
win32_path_name = (char *) cmalloc (HEAP_STR, strlen(fmt) + 16); char *w = (char *) cmalloc (HEAP_STR, strlen(fmt) + 16);
__small_sprintf (win32_path_name, fmt, unit); __small_sprintf (w, fmt, unit);
win32_path_name = w;
} }
if (win32_path_name == NULL) 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 path_conv. Ideally, we should pass in a format string and build the
unix_path, too. */ unix_path, too. */
if (!is_device () || *win32_path_name != '\\') if (!is_device () || *win32_path_name != '\\')
unix_path_name = cstrdup (unix_path); unix_path_name = unix_path;
else else
{ {
unix_path_name = cstrdup (win32_path_name); char *p = cstrdup (win32_path_name);
for (char *p = unix_path_name; (p = strchr (p, '\\')); p++) unix_path_name = p;
*p = '/'; while ((p = strchr (p, '\\')) != NULL)
*p++ = '/';
if (unix_path)
cfree ((void *) unix_path);
} }
if (unix_path_name == NULL) 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); 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 /* Detect if we are sitting at EOF for conditions where Windows
returns an error but UNIX doesn't. */ returns an error but UNIX doesn't. */
static int __stdcall static int __stdcall
@ -1047,9 +1044,9 @@ fhandler_base::fhandler_base (DWORD devtype, int unit):
fhandler_base::~fhandler_base (void) fhandler_base::~fhandler_base (void)
{ {
if (unix_path_name != NULL) if (unix_path_name != NULL)
cfree (unix_path_name); cfree ((void *) unix_path_name);
if (win32_path_name != NULL) if (win32_path_name != NULL)
cfree (win32_path_name); cfree ((void *) win32_path_name);
if (rabuf) if (rabuf)
free (rabuf); free (rabuf);
unix_path_name = win32_path_name = NULL; unix_path_name = win32_path_name = NULL;

View File

@ -149,15 +149,13 @@ class fhandler_base
size_t raixput; size_t raixput;
size_t rabuflen; size_t rabuflen;
char *unix_path_name; const char *unix_path_name;
char *win32_path_name; const char *win32_path_name;
DWORD open_status; DWORD open_status;
public: public:
void set_name (const char * unix_path, const char * win32_path = NULL, void set_name (const char * unix_path, const char *win32_path = NULL, int unit = 0);
int unit = 0);
void reset_unix_path_name (const char *);
virtual fhandler_base& operator =(fhandler_base &x); virtual fhandler_base& operator =(fhandler_base &x);
fhandler_base (DWORD dev, int unit = 0); fhandler_base (DWORD dev, int unit = 0);
virtual ~fhandler_base (); virtual ~fhandler_base ();

View File

@ -775,10 +775,10 @@ void
fhandler_cygdrive::set_drives () fhandler_cygdrive::set_drives ()
{ {
const int len = 1 + 26 * DRVSZ; 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; win32_path_name = pdrive = p;
pdrive = win32_path_name; ndrives = GetLogicalDriveStrings (len, p) / DRVSZ;
} }
int int

View File

@ -248,7 +248,7 @@ int __stdcall
fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc) fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc)
{ {
fhandler_disk_file fh; 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); return fh.fstat (buf, pc);
} }

View File

@ -251,7 +251,7 @@ mmap_record::alloc_fh ()
the call to fork(). This requires creating a fhandler the call to fork(). This requires creating a fhandler
of the correct type to be sure to call the method of the of the correct type to be sure to call the method of the
correct class. */ correct class. */
return cygheap->fdtab.build_fhandler (-1, get_device (), NULL); return cygheap->fdtab.build_fhandler (-1, get_device ());
} }
void void

View File

@ -366,20 +366,12 @@ fs_info::update (const char *win32_path)
return true; return true;
} }
void char *
path_conv::clear_normalized_path () path_conv::return_and_clear_normalized_path ()
{ {
// not thread safe char *s = normalized_path;
if (normalized_path) normalized_path = NULL;
{ return s;
cfree (normalized_path);
normalized_path = NULL;
}
}
path_conv::~path_conv ()
{
clear_normalized_path ();
} }
/* Convert an arbitrary path SRC to a pure Win32 path, suitable for /* 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. */ /* FIXME: Calling build_fhandler here is not the right way to handle this. */
fhandler_virtual *fh = 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 (); int file_type = fh->exists ();
switch (file_type) switch (file_type)
{ {
@ -731,7 +723,6 @@ out:
*tail = '/'; *tail = '/';
normalized_path = cstrdup (path_copy); normalized_path = cstrdup (path_copy);
debug_printf ("path_copy %s", path_copy); debug_printf ("path_copy %s", path_copy);
opt ^= PC_POSIX;
} }
/* Deal with Windows stupidity which considers filename\. to be valid /* Deal with Windows stupidity which considers filename\. to be valid
even when "filename" is not a directory. */ even when "filename" is not a directory. */

View File

@ -134,7 +134,6 @@ class path_conv
unit (0), fileattr (INVALID_FILE_ATTRIBUTES), unit (0), fileattr (INVALID_FILE_ATTRIBUTES),
normalized_path (NULL) {path[0] = '\0';} normalized_path (NULL) {path[0] = '\0';}
~path_conv ();
inline char *get_win32 () { return path; } inline char *get_win32 () { return path; }
operator char *() {return path;} operator char *() {return path;}
operator const char *() {return path;} operator const char *() {return path;}
@ -147,7 +146,7 @@ class path_conv
DWORD get_drive_type () {return fs.drive_type;} DWORD get_drive_type () {return fs.drive_type;}
BOOL fs_fast_ea () {return fs.sym_opt & PC_CHECK_EA;} BOOL fs_fast_ea () {return fs.sym_opt & PC_CHECK_EA;}
void set_path (const char *p) {strcpy (path, p);} void set_path (const char *p) {strcpy (path, p);}
void clear_normalized_path (); char *return_and_clear_normalized_path ();
}; };
/* Symlink marker */ /* Symlink marker */