From 302d7d5465573c17de07f3addbdc6a63180c0b57 Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Sat, 26 Jan 2008 01:08:53 +0000 Subject: [PATCH] (logon_network_drive): New function. (stat): Use it. --- src/ChangeLog | 5 +++++ src/w32.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index dddf544746..469bc63218 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-01-26 Jason Rumney + + * w32.c (logon_network_drive): New function. + (stat): Use it. + 2008-01-26 Chong Yidong * xdisp.c (pos_visible_p): Handle the case where charpos falls on diff --git a/src/w32.c b/src/w32.c index 5a8289789d..f1be902707 100644 --- a/src/w32.c +++ b/src/w32.c @@ -1938,6 +1938,36 @@ unc_volume_file_attributes (const char *path) 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 @@ stat (const char * path, struct stat * buf) } 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) { -- 2.20.1