* path.cc (path_conv::check): Move component to function scope. Set

PATH_RO only on *real* FH_NETDRIVEs or on non-FH_NETDRIVE virtual
	paths. Allow non-retrievable shares to be handled as files.
This commit is contained in:
Corinna Vinschen 2005-05-29 11:04:02 +00:00
parent f330e7b8e8
commit 7897d3fd88
2 changed files with 24 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2005-05-29 Corinna Vinschen <corinna@vinschen.de>
* path.cc (path_conv::check): Move component to function scope. Set
PATH_RO only on *real* FH_NETDRIVEs or on non-FH_NETDRIVE virtual
paths. Allow non-retrievable shares to be handled as files.
2005-05-29 Eric Blake <ebb9@byu.net> 2005-05-29 Eric Blake <ebb9@byu.net>
* include/limits.h (LLONG_MIN, LLONG_MAX, ULLONG_MAX): Always define. * include/limits.h (LLONG_MIN, LLONG_MAX, ULLONG_MAX): Always define.

View File

@ -550,6 +550,7 @@ path_conv::check (const char *src, unsigned opt,
memset (&dev, 0, sizeof (dev)); memset (&dev, 0, sizeof (dev));
fs.clear (); fs.clear ();
normalized_path = NULL; normalized_path = NULL;
int component = 0; // Number of translated components
if (!(opt & PC_NULLEMPTY)) if (!(opt & PC_NULLEMPTY))
error = 0; error = 0;
@ -582,7 +583,7 @@ path_conv::check (const char *src, unsigned opt,
Also: be careful to preserve the errno returned from Also: be careful to preserve the errno returned from
symlink.check as the caller may need it. */ symlink.check as the caller may need it. */
/* FIXME: Do we have to worry about multiple \'s here? */ /* FIXME: Do we have to worry about multiple \'s here? */
int component = 0; // Number of translated components component = 0; // Number of translated components
sym.contents[0] = '\0'; sym.contents[0] = '\0';
int symlen = 0; int symlen = 0;
@ -671,7 +672,8 @@ path_conv::check (const char *src, unsigned opt,
fileattr = INVALID_FILE_ATTRIBUTES; fileattr = INVALID_FILE_ATTRIBUTES;
goto virtual_component_retry; goto virtual_component_retry;
} }
path_flags |= PATH_RO; if (component == 0 || dev.devn != FH_NETDRIVE)
path_flags |= PATH_RO;
goto out; goto out;
} }
/* devn should not be a device. If it is, then stop parsing now. */ /* devn should not be a device. If it is, then stop parsing now. */
@ -886,8 +888,20 @@ out:
} }
else if (isvirtual_dev (dev.devn) && fileattr == INVALID_FILE_ATTRIBUTES) else if (isvirtual_dev (dev.devn) && fileattr == INVALID_FILE_ATTRIBUTES)
{ {
error = dev.devn == FH_NETDRIVE ? ENOSHARE : ENOENT; if (dev.devn == FH_NETDRIVE && component)
return; {
/* This case indicates a non-existant resp. a non-retrievable
share. This happens for instance if the share is a printer.
In this case the path must not be treated like a FH_NETDRIVE,
but like a FH_FS instead, so the usual open call for files
is used on it. */
dev.parse (FH_FS);
}
else
{
error = dev.devn == FH_NETDRIVE ? ENOSHARE : ENOENT;
return;
}
} }
else if (!need_directory || error) else if (!need_directory || error)
/* nothing to do */; /* nothing to do */;