~n-muench/ubuntu/precise/open-vm-tools/open-vm-tools.march-merge

1 by Daniel Baumann
Import upstream version 2008.06.03-96374
1
/*********************************************************
2
 * Copyright (C) 2003 VMware, Inc. All rights reserved.
3
 *
4
 * This program is free software; you can redistribute it and/or modify it
5
 * under the terms of the GNU Lesser General Public License as published
6
 * by the Free Software Foundation version 2.1 and no later version.
7
 *
8
 * This program is distributed in the hope that it will be useful, but
9
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser GNU General Public
11
 * License for more details.
12
 *
13
 * You should have received a copy of the GNU Lesser General Public License
14
 * along with this program; if not, write to the Free Software Foundation, Inc.,
15
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
16
 *
17
 *********************************************************/
18
19
/*
20
 * vixTranslateErrorOpenSource.c --
21
 *
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
22
 * Routines which translate between various other error code systems
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
23
 * into foundry errors.
24
 *
25
 * This is the minimal functions needed to build the tools for open source.
26
 * Most of the error translation functions are in foundryTranslateError.c,
27
 * which is NOT being released as open source. We do not want to include
28
 * any unnecessary error functions, since those use lots of different
29
 * error code definitions, and that would drag in a lot of headers from
30
 * bora/lib/public.
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
31
 */
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
32
33
#include "vmware.h"
34
#include "vixOpenSource.h"
35
#include <errno.h>
36
#include <string.h>
37
1.4.3 by Serge Hallyn
Import upstream version 2011.03.28-387002
38
#ifdef _WIN32
39
#include "win32u.h"
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
40
#endif
41
42
43
/*
44
 *-----------------------------------------------------------------------------
45
 *
46
 * Vix_TranslateGuestRegistryError --
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
47
 *
48
 *     Translate a guest windows registry error to a Foundry error.
49
 *
50
 * Results:
51
 *      VixError
52
 *
53
 * Side effects:
54
 *      None.
55
 *
56
 *-----------------------------------------------------------------------------
57
 */
58
59
VixError
60
Vix_TranslateGuestRegistryError(int systemError) // IN
61
{
62
   VixError err = VIX_E_FAIL;
63
#ifdef _WIN32
64
   Unicode msg;
65
66
   switch (systemError) {
67
   case ERROR_INVALID_PARAMETER:
68
   case ERROR_FILE_NOT_FOUND:
69
      err = VIX_E_REG_KEY_INVALID;
70
      break;
71
   case ERROR_ACCESS_DENIED:
72
      err = VIX_E_GUEST_USER_PERMISSIONS;
73
      break;
74
   default:
75
      return Vix_TranslateSystemError(systemError);
76
   }
77
   msg = Win32U_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
78
                              NULL, systemError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
79
                              NULL);
80
81
   Log("Foundry operation failed with guest windows registry error: %s (%d), translated to %"FMT64"d\n",
82
       msg, systemError, err);
83
   Unicode_Free(msg);
84
85
#endif
86
   return err;
87
} // Vix_TranslateGuestRegistryError
88
89
90
/*
91
 *-----------------------------------------------------------------------------
92
 *
93
 * Vix_TranslateSystemError --
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
94
 *
95
 *     Translate a System error to a Foundry error.
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
96
 *
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
97
 * Results:
98
 *      VixError
99
 *
100
 * Side effects:
101
 *
102
 *-----------------------------------------------------------------------------
103
 */
104
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
105
VixError
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
106
Vix_TranslateSystemError(int systemError) // IN
107
{
108
   VixError err = VIX_E_FAIL;
109
#ifdef _WIN32
110
   Unicode msg;
1.1.1 by Devid Antonio Filoni
Import upstream version 2008.08.08-109361
111
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
112
   switch (systemError) {
113
   case ERROR_ACCESS_DENIED:
114
      err = VIX_E_FILE_ACCESS_ERROR;
115
      break;
116
   case ERROR_INVALID_NAME:
1.4.3 by Serge Hallyn
Import upstream version 2011.03.28-387002
117
      err = VIX_E_FILE_NAME_INVALID;
118
      break;
119
   case ERROR_FILENAME_EXCED_RANGE:
120
      err = VIX_E_FILE_NAME_TOO_LONG;
121
      break;
122
   case ERROR_FILE_NOT_FOUND:
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
123
   case ERROR_PATH_NOT_FOUND:
124
   case ERROR_BAD_PATHNAME:
125
   case ERROR_DIRECTORY:
126
   case ERROR_BUFFER_OVERFLOW:
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
127
      err = VIX_E_FILE_NOT_FOUND;
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
128
      break;
129
   case ERROR_DIR_NOT_EMPTY:
1.4.3 by Serge Hallyn
Import upstream version 2011.03.28-387002
130
      err = VIX_E_DIRECTORY_NOT_EMPTY;
131
      break;
132
   case ERROR_TOO_MANY_OPEN_FILES:
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
133
   case ERROR_NO_MORE_FILES:
134
   case ERROR_WRITE_PROTECT:
1.4.5 by Nate Muench
Import upstream version 2011.12.20-562307
135
   case ERROR_WRITE_FAULT:
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
136
   case ERROR_READ_FAULT:
137
   case ERROR_SHARING_VIOLATION:
138
   case ERROR_SEEK:
139
   case ERROR_CANNOT_MAKE:
140
      Log("%s: system error = %d\n", __FUNCTION__,
1.3.2 by Daniel Baumann
Import upstream version 2008.12.23-137496
141
          systemError);
142
      err = VIX_E_FILE_ERROR;
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
143
      break;
144
   case ERROR_HANDLE_DISK_FULL:
145
   case ERROR_DISK_FULL:
146
      err = VIX_E_DISK_FULL;
147
      break;
148
   case ERROR_FILE_EXISTS:
149
   case ERROR_ALREADY_EXISTS:
150
      err = VIX_E_FILE_ALREADY_EXISTS;
151
      break;
152
   case ERROR_BUSY:
153
   case ERROR_PATH_BUSY:
154
      err = VIX_E_OBJECT_IS_BUSY;
155
      break;
156
   case ERROR_INVALID_PARAMETER:
157
      err = VIX_E_INVALID_ARG;
158
      break;
159
   case ERROR_NOT_SUPPORTED:
160
      err = VIX_E_NOT_SUPPORTED;
161
      break;
162
   case ERROR_NO_DATA:
163
   case ERROR_INVALID_DATA:
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
164
      err = VIX_E_NOT_FOUND;
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
165
      break;
166
   case ERROR_NOT_ENOUGH_MEMORY:
167
      err = VIX_E_OUT_OF_MEMORY;
168
      break;
169
   default:
170
      err = VIX_E_FAIL;
171
   }
172
   msg = Win32U_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
1.1.1 by Devid Antonio Filoni
Import upstream version 2008.08.08-109361
173
                              NULL, systemError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
174
                              NULL);
175
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
176
   Log("Foundry operation failed with system error: %s (%d), translated to %"FMT64"d\n",
177
       msg, systemError, err);
1.1.1 by Devid Antonio Filoni
Import upstream version 2008.08.08-109361
178
   Unicode_Free(msg);
179
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
180
#else // linux, other *nix
181
   err = Vix_TranslateErrno(systemError);
1.4.3 by Serge Hallyn
Import upstream version 2011.03.28-387002
182
#endif
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
183
184
   return err;
185
} // Vix_TranslateSystemError
186
187
188
/*
189
 *-----------------------------------------------------------------------------
190
 *
191
 * Vix_TranslateCOMError --
192
 *
193
 *     Translate a COM (Windows) error to a Foundry error.
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
194
 *
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
195
 * Results:
196
 *     VixError.
197
 *
198
 * Side effects:
199
 *     None.
200
 *
201
 *-----------------------------------------------------------------------------
202
 */
203
204
#ifdef _WIN32
205
VixError
206
Vix_TranslateCOMError(HRESULT hrError) // IN
207
{
208
   VixError err = VIX_E_FAIL;
209
210
   switch (hrError) {
211
   case E_ACCESSDENIED:
212
      err = VIX_E_FILE_ACCESS_ERROR;
213
      break;
214
215
   case STG_E_PATHNOTFOUND:
216
   case STG_E_FILENOTFOUND:
217
      err = VIX_E_FILE_NOT_FOUND;
218
      break;
219
220
   case STG_E_MEDIUMFULL:
221
      err = VIX_E_DISK_FULL;
222
      break;
223
224
   case STG_E_FILEALREADYEXISTS:
225
      err = VIX_E_FILE_ALREADY_EXISTS;
226
      break;
227
228
   case E_INVALIDARG:
229
   case E_POINTER:
230
      err = VIX_E_INVALID_ARG;
231
      break;
232
233
   case E_NOTIMPL:
234
   case E_NOINTERFACE:
235
      err = VIX_E_NOT_SUPPORTED;
236
      break;
237
238
   case E_OUTOFMEMORY:
239
      err = VIX_E_OUT_OF_MEMORY;
240
      break;
241
242
   case E_FAIL:
243
   default:
244
      err = VIX_E_FAIL;
245
   }
246
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
247
   return err;
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
248
} // Vix_TranslateCOMError
249
#endif
250
251
252
/*
253
 *-----------------------------------------------------------------------------
254
 *
255
 * Vix_TranslateCryptoError --
256
 *
257
 *     Translate a Crypto error to a Foundry error.
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
258
 *
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
259
 * Results:
260
 *      VixError
261
 *
262
 * Side effects:
263
 *
264
 *-----------------------------------------------------------------------------
265
 */
266
1.4.7 by Nate Muench
Import upstream version 2012.03.13-651368
267
VixError
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
268
Vix_TranslateCryptoError(CryptoError cryptoError) // IN
269
{
270
   if (CRYPTO_ERROR_SUCCESS == cryptoError) {
271
      return VIX_OK;
272
   } else if (CRYPTO_ERROR_OPERATION_FAILED == cryptoError) {
273
      return VIX_E_GUEST_USER_PERMISSIONS;
274
   } else if (CRYPTO_ERROR_UNKNOWN_ALGORITHM == cryptoError) {
275
      return VIX_E_CRYPTO_UNKNOWN_ALGORITHM;
276
   } else if (CRYPTO_ERROR_BAD_BUFFER_SIZE == cryptoError) {
277
      return VIX_E_CRYPTO_BAD_BUFFER_SIZE;
278
   } else if (CRYPTO_ERROR_INVALID_OPERATION == cryptoError) {
279
      return VIX_E_CRYPTO_INVALID_OPERATION;
280
   } else if (CRYPTO_ERROR_NOMEM == cryptoError) {
281
      return VIX_E_OUT_OF_MEMORY;
282
   } else if (CRYPTO_ERROR_NEED_PASSWORD == cryptoError) {
283
      return VIX_E_CRYPTO_NEED_PASSWORD;
284
   } else if (CRYPTO_ERROR_BAD_PASSWORD == cryptoError) {
285
      return VIX_E_CRYPTO_BAD_PASSWORD;
1.1.5 by Daniel Baumann
Import upstream version 2009.05.22-167859
286
   } else if (CRYPTO_ERROR_IO_ERROR == cryptoError) {
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
287
      Log("%s: crypto error = %d\n", __FUNCTION__,
1.3.2 by Daniel Baumann
Import upstream version 2008.12.23-137496
288
          (int)cryptoError);
289
      return VIX_E_FILE_ERROR;
1 by Daniel Baumann
Import upstream version 2008.06.03-96374
290
   } else if (CRYPTO_ERROR_UNKNOWN_ERROR == cryptoError) {
291
      return VIX_E_FAIL;
292
   } else if (CRYPTO_ERROR_NAME_NOT_FOUND == cryptoError) {
293
      return VIX_E_CRYPTO_NOT_IN_DICTIONARY;
294
   } else if (CRYPTO_ERROR_NO_CRYPTO == cryptoError) {
295
      return VIX_E_CRYPTO_NO_CRYPTO;
296
   }
297
298
   return VIX_E_FAIL;
299
}
300
301
1.4.3 by Serge Hallyn
Import upstream version 2011.03.28-387002
302
/*
303
 *-----------------------------------------------------------------------------
304
 *
305
 * Vix_TranslateErrno --
306
 *
307
 *     Translate a Posix errno to a Foundry error.
308
 *
309
 * Results:
310
 *      VixError
311
 *
312
 * Side effects:
313
 *      None
314
 *
315
 *-----------------------------------------------------------------------------
316
 */
317
318
VixError
319
Vix_TranslateErrno(int systemError)             // IN
320
{
321
   VixError err = VIX_E_FAIL;
322
323
   /*
324
    * Be careful while adding new error code translations. This function is
325
    * complied for both Windows and POSIX guests. Few errors i.e. ETIMEDOUT,
326
    * ENOBUFS are defined only for POSIX guests. When a new error code
327
    * translation is added, make sure you build a sandbox job and it is
328
    * successful.
329
    */
330
331
   switch (systemError) {
332
   case EPERM:
333
   case EACCES:
334
      err = VIX_E_FILE_ACCESS_ERROR;
335
      break;
336
   case EAGAIN:
337
   case EBUSY:
338
      err = VIX_E_OBJECT_IS_BUSY;
339
      break;
340
   case EEXIST:
341
      err = VIX_E_FILE_ALREADY_EXISTS;
342
      break;
343
   case EFBIG:
344
      err = VIX_E_FILE_TOO_BIG;
345
      break;
346
   case ENOTEMPTY:
347
      err = VIX_E_DIRECTORY_NOT_EMPTY;
348
      break;
349
   case ENOTDIR:
350
      err = VIX_E_NOT_A_DIRECTORY;
351
      break;
352
#ifndef _WIN32
353
   case ETIMEDOUT:
354
   case ENOBUFS:
355
#endif
356
   case EIO:
357
   case EMFILE:
358
   case ENFILE:
359
   case EMLINK:
360
   case EROFS:
361
      Log("%s: errno = %d\n", __FUNCTION__,
362
                              systemError);
363
      err = VIX_E_FILE_ERROR;
364
      break;
365
   case ENODEV:
366
   case ENOENT:
367
      err = VIX_E_FILE_NOT_FOUND;
368
      break;
369
   case ENOSPC:
370
      err = VIX_E_DISK_FULL;
371
      break;
372
   case EISDIR:
373
      err = VIX_E_NOT_A_FILE;
374
      break;
375
   case ESRCH:
376
      err = VIX_E_NO_SUCH_PROCESS;
377
      break;
378
   case ENAMETOOLONG:
379
      err = VIX_E_FILE_NAME_TOO_LONG;
380
      break;
381
#ifndef _WIN32
382
   case EMSGSIZE:
383
#endif
384
   case EINVAL:
385
      err = VIX_E_INVALID_ARG;
386
      break;
387
#ifndef _WIN32
388
   case ELOOP:
389
#endif
390
   case ENOMEM:
391
      err = VIX_E_OUT_OF_MEMORY;
392
      break;
393
   default:
394
      err = VIX_E_FAIL;
395
   }
396
   Log("Foundry operation failed with system error: %s (%d), translated to %"FMT64"d\n",
397
       strerror(systemError), systemError, err);
398
399
   return err;
400
} // Vix_TranslateErrno
401
402