VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSharedFolders.cpp@ 44109

Last change on this file since 44109 was 44109, checked in by vboxsync, 12 years ago

forward-ported r82653 from 4.2 branch (Additions/VBoxTray: don't refuse to start VBoxTray if we cannot connect to the shared folders host service)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.4 KB
Line 
1/* $Id: VBoxSharedFolders.cpp 44109 2012-12-12 14:34:07Z vboxsync $ */
2/** @file
3 * VBoxSharedFolders - Handling for shared folders
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include "VBoxSharedFolders.h"
19#include "VBoxTray.h"
20#include "VBoxHelpers.h"
21
22#include <iprt/mem.h>
23#include <VBox/VBoxGuestLib.h>
24
25int VBoxSharedFoldersAutoMount(void)
26{
27 uint32_t u32ClientId;
28 int rc = VbglR3SharedFolderConnect(&u32ClientId);
29 if (RT_SUCCESS(rc))
30 {
31 uint32_t cMappings;
32 VBGLR3SHAREDFOLDERMAPPING *paMappings;
33
34 rc = VbglR3SharedFolderGetMappings(u32ClientId, true /* Only process auto-mounted folders */,
35 &paMappings, &cMappings);
36 if (RT_SUCCESS(rc))
37 {
38#if 0
39 /* Check for a fixed/virtual auto-mount share. */
40 if (VbglR3SharedFolderExists(u32ClientId, "vbsfAutoMount"))
41 {
42 Log(("VBoxTray: Hosts supports auto-mount root\n"));
43 }
44 else
45 {
46#endif
47 Log(("VBoxTray: Got %u shared folder mappings\n", cMappings));
48 for (uint32_t i = 0; i < cMappings && RT_SUCCESS(rc); i++)
49 {
50 char *pszName = NULL;
51 rc = VbglR3SharedFolderGetName(u32ClientId, paMappings[i].u32Root, &pszName);
52 if ( RT_SUCCESS(rc)
53 && *pszName)
54 {
55 Log(("VBoxTray: Connecting share %u (%s) ...\n", i+1, pszName));
56
57 char *pszShareName;
58 if (RTStrAPrintf(&pszShareName, "\\\\vboxsrv\\%s", pszName) >= 0)
59 {
60 char chDrive = 'D'; /* Start probing whether drive D: is free to use. */
61 do
62 {
63 char szCurDrive[3];
64 RTStrPrintf(szCurDrive, sizeof(szCurDrive), "%c:", chDrive++);
65
66 NETRESOURCE resource;
67 RT_ZERO(resource);
68 resource.dwType = RESOURCETYPE_ANY;
69 resource.lpLocalName = TEXT(szCurDrive);
70 resource.lpRemoteName = TEXT(pszShareName);
71 /* Go straight to our network provider in order to get maximum lookup speed. */
72 resource.lpProvider = TEXT("VirtualBox Shared Folders");
73
74 /** @todo Figure out how to map the drives in a block (F,G,H, ...).
75 Save the mapping for later use. */
76 DWORD dwErr = WNetAddConnection2A(&resource, NULL, NULL, 0);
77 if (dwErr == NO_ERROR)
78 {
79 LogRel(("VBoxTray: Shared folder \"%s\" was mounted to drive \"%s\"\n", pszName, szCurDrive));
80 break;
81 }
82 else
83 {
84 LogRel(("VBoxTray: Mounting \"%s\" to \"%s\" resulted in dwErr = %ld\n", pszName, szCurDrive, dwErr));
85
86 switch (dwErr)
87 {
88 /*
89 * The local device specified by the lpLocalName member is already
90 * connected to a network resource. Try next drive ...
91 */
92 case ERROR_ALREADY_ASSIGNED:
93 break;
94
95 default:
96 LogRel(("VBoxTray: Error while mounting shared folder \"%s\" to \"%s\", error = %ld\n",
97 pszName, szCurDrive, dwErr));
98 break;
99 }
100 }
101 } while (chDrive <= 'Z');
102
103 if (chDrive > 'Z')
104 {
105 LogRel(("VBoxTray: No free driver letter found to assign shared folder \"%s\", aborting\n", pszName));
106 break;
107 }
108
109 RTStrFree(pszShareName);
110 }
111 else
112 rc = VERR_NO_STR_MEMORY;
113 RTStrFree(pszName);
114 }
115 else
116 Log(("VBoxTray: Error while getting the shared folder name for root node = %u, rc = %Rrc\n",
117 paMappings[i].u32Root, rc));
118 }
119#if 0
120 }
121#endif
122 VbglR3SharedFolderFreeMappings(paMappings);
123 }
124 else
125 Log(("VBoxTray: Error while getting the shared folder mappings, rc = %Rrc\n", rc));
126 VbglR3SharedFolderDisconnect(u32ClientId);
127 }
128 else
129 {
130 Log(("VBoxTray: Failed to connect to the shared folder service, error %Rrc\n", rc));
131 /* return success, otherwise VBoxTray will not start! */
132 rc = VINF_SUCCESS;
133 }
134 return rc;
135}
136
137int VBoxSharedFoldersAutoUnmount(void)
138{
139 uint32_t u32ClientId;
140 int rc = VbglR3SharedFolderConnect(&u32ClientId);
141 if (!RT_SUCCESS(rc))
142 Log(("VBoxTray: Failed to connect to the shared folder service, error %Rrc\n", rc));
143 else
144 {
145 uint32_t cMappings;
146 VBGLR3SHAREDFOLDERMAPPING *paMappings;
147
148 rc = VbglR3SharedFolderGetMappings(u32ClientId, true /* Only process auto-mounted folders */,
149 &paMappings, &cMappings);
150 if (RT_SUCCESS(rc))
151 {
152 for (uint32_t i = 0; i < cMappings && RT_SUCCESS(rc); i++)
153 {
154 char *pszName = NULL;
155 rc = VbglR3SharedFolderGetName(u32ClientId, paMappings[i].u32Root, &pszName);
156 if ( RT_SUCCESS(rc)
157 && *pszName)
158 {
159 Log(("VBoxTray: Disconnecting share %u (%s) ...\n", i+1, pszName));
160
161 char *pszShareName;
162 if (RTStrAPrintf(&pszShareName, "\\\\vboxsrv\\%s", pszName) >= 0)
163 {
164 DWORD dwErr = WNetCancelConnection2(pszShareName, 0, FALSE /* Force disconnect */);
165 if (dwErr == NO_ERROR)
166 {
167 LogRel(("VBoxTray: Share \"%s\" was disconnected\n", pszShareName));
168 RTStrFree(pszShareName);
169 RTStrFree(pszName);
170 break;
171 }
172
173 LogRel(("VBoxTray: Disconnecting \"%s\" failed, dwErr = %ld\n", pszShareName, dwErr));
174
175 switch (dwErr)
176 {
177 case ERROR_NOT_CONNECTED:
178 break;
179
180 default:
181 LogRel(("VBoxTray: Error while disconnecting shared folder \"%s\", error = %ld\n",
182 pszShareName, dwErr));
183 break;
184 }
185
186 RTStrFree(pszShareName);
187 }
188 else
189 rc = VERR_NO_MEMORY;
190 RTStrFree(pszName);
191 }
192 else
193 Log(("VBoxTray: Error while getting the shared folder name for root node = %u, rc = %Rrc\n",
194 paMappings[i].u32Root, rc));
195 }
196 VbglR3SharedFolderFreeMappings(paMappings);
197 }
198 else
199 Log(("VBoxTray: Error while getting the shared folder mappings, rc = %Rrc\n", rc));
200 VbglR3SharedFolderDisconnect(u32ClientId);
201 }
202 return rc;
203}
204
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette