* path.cc (path_conv::set_normalized_path): Drop strip_tail argument.

Never strip trailing dots and spaces.
	* (path_conv::check): Accomodate above change.
	* path.h (path_conv::operator=): Ditto
	* dtable.cc (build_fh_dev): Ditto.
	* fhandler.h (fhandler_base::set_name): Ditto.

	* path.cc (transform_chars): Disable converting trailing dots and
	spaces.

	* path.cc (path_conv::check): Remove two disabled code snippets.
This commit is contained in:
Corinna Vinschen 2008-05-13 13:44:04 +00:00
parent a065930a3a
commit a9e9da89fa
5 changed files with 26 additions and 47 deletions

View File

@ -1,3 +1,17 @@
2008-05-13 Corinna Vinschen <corinna@vinschen.de>
* path.cc (path_conv::set_normalized_path): Drop strip_tail argument.
Never strip trailing dots and spaces.
* (path_conv::check): Accomodate above change.
* path.h (path_conv::operator=): Ditto
* dtable.cc (build_fh_dev): Ditto.
* fhandler.h (fhandler_base::set_name): Ditto.
* path.cc (transform_chars): Disable converting trailing dots and
spaces.
* path.cc (path_conv::check): Remove two disabled code snippets.
2008-05-13 Corinna Vinschen <corinna@vinschen.de> 2008-05-13 Corinna Vinschen <corinna@vinschen.de>
* random.cc (initstate): Align to POSIX definition. * random.cc (initstate): Align to POSIX definition.

View File

@ -396,9 +396,9 @@ build_fh_dev (const device& dev, const char *unix_name)
{ {
path_conv pc (dev); path_conv pc (dev);
if (unix_name) if (unix_name)
pc.set_normalized_path (unix_name, false); pc.set_normalized_path (unix_name);
else else
pc.set_normalized_path (dev.name, false); pc.set_normalized_path (dev.name);
return build_fh_pc (pc); return build_fh_pc (pc);
} }

View File

@ -153,7 +153,7 @@ class fhandler_base
path_conv pc; path_conv pc;
virtual void set_name (path_conv &pc); virtual void set_name (path_conv &pc);
virtual void set_name (const char *s) {pc.set_normalized_path (s, false);} virtual void set_name (const char *s) {pc.set_normalized_path (s);}
int error () const {return pc.error;} int error () const {return pc.error;}
void set_error (int error) {pc.error = error;} void set_error (int error) {pc.error = error;}
bool exists () const {return pc.exists ();} bool exists () const {return pc.exists ();}

View File

@ -531,17 +531,9 @@ path_conv::fillin (HANDLE h)
} }
void void
path_conv::set_normalized_path (const char *path_copy, bool strip_tail) path_conv::set_normalized_path (const char *path_copy)
{ {
char *p = strchr (path_copy, '\0'); char *p = strchr (path_copy, '\0');
if (strip_tail)
{
while (*--p == '.' || *p == ' ')
continue;
*++p = '\0';
}
size_t n = 1 + p - path_copy; size_t n = 1 + p - path_copy;
normalized_path = path + sizeof (path) - n; normalized_path = path + sizeof (path) - n;
@ -605,10 +597,14 @@ transform_chars (PUNICODE_STRING upath, USHORT start_idx, bool managed)
for (buf += start_idx; buf <= end; ++buf) for (buf += start_idx; buf <= end; ++buf)
if (*buf < 128) if (*buf < 128)
*buf = tfx[*buf]; *buf = tfx[*buf];
#if 0
/* Win32 can't handle trailing dots and spaces. Transform the last of them /* Win32 can't handle trailing dots and spaces. Transform the last of them
to the private use area, too, to create a valid Win32 filename. */ to the private use area, too, to create a valid Win32 filename. */
if (*end == L'\\')
--end;
if (*end == L'.' || *end == L' ') if (*end == L'.' || *end == L' ')
*end |= 0xf000; *end |= 0xf000;
#endif
} }
PUNICODE_STRING PUNICODE_STRING
@ -1171,7 +1167,6 @@ virtual_component_retry:
add_ext_from_sym (sym); add_ext_from_sym (sym);
out: out:
bool strip_tail = false;
if (dev.devn == FH_NETDRIVE && component) if (dev.devn == FH_NETDRIVE && component)
{ {
/* This case indicates a non-existant resp. a non-retrievable /* This case indicates a non-existant resp. a non-retrievable
@ -1203,35 +1198,10 @@ out:
{ {
if (strncmp (path, "\\\\.\\", 4)) if (strncmp (path, "\\\\.\\", 4))
{ {
#if 0
/* Windows ignores trailing dots and spaces in the last path
component, and ignores exactly one trailing dot in inner
path components. */
char *tail = NULL;
for (char *p = path; *p; p++)
{
if (*p != '.' && *p != ' ')
tail = NULL;
else if (!tail)
tail = p;
if (tail && p[1] == '\\')
{
if (p > tail || *tail != '.')
{
error = ENOENT;
return;
}
tail = NULL;
}
}
#endif
if (!tail || tail == path) if (!tail || tail == path)
/* nothing */; /* nothing */;
else if (tail[-1] != '\\') else if (tail[-1] != '\\')
{ *tail = '\0';
*tail = '\0';
strip_tail = true;
}
else else
{ {
error = ENOENT; error = ENOENT;
@ -1255,11 +1225,6 @@ out:
set_exec (0); set_exec (0);
} }
#if 0
if (issocket ())
devn = FH_SOCKET;
#endif
if (opt & PC_NOFULL) if (opt & PC_NOFULL)
{ {
if (is_relpath) if (is_relpath)
@ -1296,7 +1261,7 @@ out:
{ {
if (tail < path_end && tail > path_copy + 1) if (tail < path_end && tail > path_copy + 1)
*tail = '/'; *tail = '/';
set_normalized_path (path_copy, strip_tail); set_normalized_path (path_copy);
if (is_msdos && !(opt & PC_NOWARN)) if (is_msdos && !(opt & PC_NOWARN))
warn_msdos (src); warn_msdos (src);
} }

View File

@ -253,7 +253,7 @@ class path_conv
path_conv &operator =(path_conv &pc) path_conv &operator =(path_conv &pc)
{ {
memcpy (this, &pc, pc.size ()); memcpy (this, &pc, pc.size ());
set_normalized_path (pc.normalized_path, false); set_normalized_path (pc.normalized_path);
wide_path = NULL; wide_path = NULL;
return *this; return *this;
} }
@ -280,7 +280,7 @@ class path_conv
unsigned __stdcall ndisk_links (DWORD); unsigned __stdcall ndisk_links (DWORD);
char *normalized_path; char *normalized_path;
size_t normalized_path_size; size_t normalized_path_size;
void set_normalized_path (const char *, bool) __attribute__ ((regparm (3))); void set_normalized_path (const char *) __attribute__ ((regparm (2)));
DWORD get_symlink_length () { return symlink_length; }; DWORD get_symlink_length () { return symlink_length; };
private: private:
DWORD symlink_length; DWORD symlink_length;