* fhandler_proc.cc (fhandler_proc::fstat): Use fhandler name rather than

path_conv name.
(fhandler_proc::open): Ditto.
* fhandler_process.cc (fhandler_process::fstat): Use fhandler name rather than
path_conv name.
(fhandler_process::open): Ditto.
* fhandler_registry.cc (fhandler_registry::fstat): Use fhandler name rather
than path_conv name.
(fhandler_registry::open): Ditto.
* path.cc (path_conv::check): Don't copy posix path when virtual.
(mount_info::conv_to_win32_path): Don't zero string when isproc.  Just derive
normal windows path.
* path.h (path_conv::clear_normalized_path): Declare new method.
* path.cc (path_conv::clear_normalized_path): Define new method.
* dtable.cc (build_fhandler_from_name): Clear normalized path when finished to
conserve space.
This commit is contained in:
Christopher Faylor 2002-05-03 02:43:45 +00:00
parent 3bb7eb449c
commit 335c87f94d
8 changed files with 53 additions and 24 deletions

View File

@ -1,3 +1,23 @@
2002-05-02 Christopher Faylor <cgf@redhat.com>
* fhandler_proc.cc (fhandler_proc::fstat): Use fhandler name rather
than path_conv name.
(fhandler_proc::open): Ditto.
* fhandler_process.cc (fhandler_process::fstat): Use fhandler name
rather than path_conv name.
(fhandler_process::open): Ditto.
* fhandler_registry.cc (fhandler_registry::fstat): Use fhandler name
rather than path_conv name.
(fhandler_registry::open): Ditto.
* path.cc (path_conv::check): Don't copy posix path when virtual.
(mount_info::conv_to_win32_path): Don't zero string when isproc. Just
derive normal windows path.
* path.h (path_conv::clear_normalized_path): Declare new method.
* path.cc (path_conv::clear_normalized_path): Define new method.
* dtable.cc (build_fhandler_from_name): Clear normalized path when
finished to conserve space.
2002-05-02 Christopher Faylor <cgf@redhat.com>
* fhandler_proc.cc (fhandler_proc::fstat): Prime with information from

View File

@ -287,7 +287,9 @@ dtable::build_fhandler_from_name (int fd, const char *name, HANDLE handle,
return NULL;
}
return build_fhandler (fd, pc.get_devn (), pc.normalized_path, pc, pc.get_unitn ());
fhandler_base *fh = build_fhandler (fd, pc.get_devn (), pc.normalized_path, pc, pc.get_unitn ());
pc.clear_normalized_path ();
return fh;
}
#define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name

View File

@ -124,7 +124,7 @@ fhandler_proc::fhandler_proc (DWORD devtype):
int
fhandler_proc::fstat (struct __stat64 *buf, path_conv *pc)
{
debug_printf ("fstat (%s)", (char *) *pc);
debug_printf ("fstat (%s)", get_name ());
const char *path = get_name ();
path += proc_len;
(void) fhandler_base::fstat (buf, pc);
@ -199,7 +199,7 @@ fhandler_proc::open (path_conv *pc, int flags, mode_t mode)
const char *path;
path = (char *) *pc + proc_len;
path = get_name () + proc_len;
if (!*path)
{

View File

@ -80,7 +80,7 @@ fhandler_process::fhandler_process ():
int
fhandler_process::fstat (struct __stat64 *buf, path_conv *pc)
{
int file_type = exists ((const char *) get_name ());
int file_type = exists (get_name ());
(void) fhandler_base::fstat (buf, pc);
buf->st_mode &= ~_IFMT & NO_W;
@ -126,7 +126,7 @@ fhandler_process::open (path_conv *pc, int flags, mode_t mode)
goto out;
const char *path;
path = (const char *) *pc + proc_len + 1;
path = get_name () + proc_len + 1;
pid = atoi (path);
while (*path != 0 && !SLASH_P (*path))
path++;

View File

@ -161,9 +161,9 @@ fhandler_registry::fhandler_registry ():
}
int
fhandler_registry::fstat (struct __stat64 *buf, path_conv *path)
fhandler_registry::fstat (struct __stat64 *buf, path_conv *pc)
{
this->fhandler_base::fstat (buf, path);
this->fhandler_base::fstat (buf, pc);
buf->st_mode &= ~_IFMT & NO_W;
int file_type = exists (get_name ());
switch (file_type)
@ -315,7 +315,7 @@ fhandler_registry::open (path_conv *pc, int flags, mode_t mode)
goto out;
const char *path;
path = (const char *) *pc + proc_len + 1 + registry_len;
path = get_name () + proc_len + 1 + registry_len;
if (!*path)
{
if ((mode & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))

View File

@ -45,9 +45,9 @@ fhandler_virtual::opendir (path_conv& pc)
DIR *res = NULL;
size_t len;
if (exists (pc) <= 0)
if (exists (get_name ()) <= 0)
set_errno (ENOTDIR);
else if ((len = strlen (pc)) > MAX_PATH - 3)
else if ((len = strlen (get_name ())) > MAX_PATH - 3)
set_errno (ENAMETOOLONG);
else if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL)
set_errno (ENOMEM);
@ -64,7 +64,7 @@ fhandler_virtual::opendir (path_conv& pc)
}
else
{
strcpy (dir->__d_dirname, pc);
strcpy (dir->__d_dirname, get_name ());
dir->__d_dirent->d_version = __DIRENT_VERSION;
cygheap_fdnew fd;
fd = this;

View File

@ -368,10 +368,20 @@ path_conv::update_fs_info (const char* win32_path)
}
}
void
path_conv::clear_normalized_path ()
{
// not thread safe
if (normalized_path)
{
cfree (normalized_path);
normalized_path = NULL;
}
}
path_conv::~path_conv ()
{
if (normalized_path)
cfree (normalized_path);
clear_normalized_path ();
}
/* Convert an arbitrary path SRC to a pure Win32 path, suitable for
@ -526,8 +536,6 @@ path_conv::check (const char *src, unsigned opt,
fileattr = 0;
}
delete fh;
if (!error)
strcpy (path, path_copy);
goto out;
}
/* devn should not be a device. If it is, then stop parsing now. */
@ -1428,7 +1436,13 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
/* Check if the cygdrive prefix was specified. If so, just strip
off the prefix and transform it into an MS-DOS path. */
MALLOC_CHECK;
if (iscygdrive (pathbuf))
if (isproc (pathbuf))
{
devn = fhandler_proc::get_proc_fhandler (pathbuf);
if (devn == FH_BAD)
return ENOENT;
}
else if (iscygdrive (pathbuf))
{
int n = mount_table->cygdrive_len - 1;
if (!pathbuf[n] ||
@ -1447,14 +1461,6 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
else if (mount_table->cygdrive_len > 1)
return ENOENT;
}
if (isproc (pathbuf))
{
devn = fhandler_proc::get_proc_fhandler (pathbuf);
dst[0] = '\0';
if (devn == FH_BAD)
return ENOENT;
goto out;
}
int chrooted_path_len;
chrooted_path_len = 0;

View File

@ -141,6 +141,7 @@ class path_conv
DWORD get_drive_type () {return drive_type;}
BOOL fs_fast_ea () {return sym_opt & PC_CHECK_EA;}
void set_path (const char *p) {strcpy (path, p);}
void clear_normalized_path ();
};
/* Symlink marker */