# HG changeset patch # User Jason Rumney # Date 1201309669 0 # Node ID f7a641e1f03d8f391510f73356fa355822aa3c09 # Parent 5ca564f6a9e64238d758471714cb9cf393021468 (logon_network_drive): New function. (stat): Use it. diff -r 5ca564f6a9e6 -r f7a641e1f03d src/w32.c --- a/src/w32.c Sat Jan 26 01:00:44 2008 +0000 +++ b/src/w32.c Sat Jan 26 01:07:49 2008 +0000 @@ -1938,6 +1938,36 @@ return attrs; } +/* Ensure a network connection is authenticated. */ +static void +logon_network_drive (const char *path) +{ + NETRESOURCE resource; + char share[MAX_PATH]; + int i, n_slashes; + + /* Only logon to networked drives. */ + if (!IS_DIRECTORY_SEP (path[0]) || !IS_DIRECTORY_SEP (path[1])) + return; + n_slashes = 2; + strncpy (share, path, MAX_PATH); + /* Truncate to just server and share name. */ + for (i = 2; i < MAX_PATH; i++) + { + if (IS_DIRECTORY_SEP (share[i]) && ++n_slashes > 3) + { + share[i] = '\0'; + break; + } + } + + resource.dwType = RESOURCETYPE_DISK; + resource.lpLocalName = NULL; + resource.lpRemoteName = share; + resource.lpProvider = NULL; + + WNetAddConnection2 (&resource, NULL, NULL, CONNECT_INTERACTIVE); +} /* Shadow some MSVC runtime functions to map requests for long filenames to reasonable short names if necessary. This was originally added to @@ -2495,6 +2525,9 @@ } else { + if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1])) + logon_network_drive (name); + fh = FindFirstFile (name, &wfd); if (fh == INVALID_HANDLE_VALUE) {