2 * msvcrt.dll errno functions
4 * Copyright 2000 Jon Griffiths
13 #include "msvcrt/conio.h"
14 #include "msvcrt/stdlib.h"
15 #include "msvcrt/string.h"
18 #include "wine/debug.h"
20 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
23 /* INTERNAL: Set the crt and dos errno's from the OS error given. */
24 void MSVCRT__set_errno(int err)
26 int *errno = GET_THREAD_VAR_PTR(errno);
27 unsigned long *doserrno = GET_THREAD_VAR_PTR(doserrno);
33 #define ERR_CASE(oserr) case oserr:
34 #define ERR_MAPS(oserr,crterr) case oserr:*errno = crterr;break;
35 ERR_CASE(ERROR_ACCESS_DENIED)
36 ERR_CASE(ERROR_NETWORK_ACCESS_DENIED)
37 ERR_CASE(ERROR_CANNOT_MAKE)
38 ERR_CASE(ERROR_SEEK_ON_DEVICE)
39 ERR_CASE(ERROR_LOCK_FAILED)
40 ERR_CASE(ERROR_FAIL_I24)
41 ERR_CASE(ERROR_CURRENT_DIRECTORY)
42 ERR_CASE(ERROR_DRIVE_LOCKED)
43 ERR_CASE(ERROR_NOT_LOCKED)
44 ERR_CASE(ERROR_INVALID_ACCESS)
45 ERR_MAPS(ERROR_LOCK_VIOLATION, MSVCRT_EACCES);
46 ERR_CASE(ERROR_FILE_NOT_FOUND)
47 ERR_CASE(ERROR_NO_MORE_FILES)
48 ERR_CASE(ERROR_BAD_PATHNAME)
49 ERR_CASE(ERROR_BAD_NETPATH)
50 ERR_CASE(ERROR_INVALID_DRIVE)
51 ERR_CASE(ERROR_BAD_NET_NAME)
52 ERR_CASE(ERROR_FILENAME_EXCED_RANGE)
53 ERR_MAPS(ERROR_PATH_NOT_FOUND, MSVCRT_ENOENT);
54 ERR_MAPS(ERROR_IO_DEVICE, MSVCRT_EIO);
55 ERR_MAPS(ERROR_BAD_FORMAT, MSVCRT_ENOEXEC);
56 ERR_MAPS(ERROR_INVALID_HANDLE, MSVCRT_EBADF);
57 ERR_CASE(ERROR_OUTOFMEMORY)
58 ERR_CASE(ERROR_INVALID_BLOCK)
59 ERR_CASE(ERROR_NOT_ENOUGH_QUOTA);
60 ERR_MAPS(ERROR_ARENA_TRASHED, MSVCRT_ENOMEM);
61 ERR_MAPS(ERROR_BUSY, MSVCRT_EBUSY);
62 ERR_CASE(ERROR_ALREADY_EXISTS)
63 ERR_MAPS(ERROR_FILE_EXISTS, MSVCRT_EEXIST);
64 ERR_MAPS(ERROR_BAD_DEVICE, MSVCRT_ENODEV);
65 ERR_MAPS(ERROR_TOO_MANY_OPEN_FILES, MSVCRT_EMFILE);
66 ERR_MAPS(ERROR_DISK_FULL, MSVCRT_ENOSPC);
67 ERR_MAPS(ERROR_BROKEN_PIPE, MSVCRT_EPIPE);
68 ERR_MAPS(ERROR_POSSIBLE_DEADLOCK, MSVCRT_EDEADLK);
69 ERR_MAPS(ERROR_DIR_NOT_EMPTY, MSVCRT_ENOTEMPTY);
70 ERR_MAPS(ERROR_BAD_ENVIRONMENT, MSVCRT_E2BIG);
71 ERR_CASE(ERROR_WAIT_NO_CHILDREN)
72 ERR_MAPS(ERROR_CHILD_NOT_COMPLETE, MSVCRT_ECHILD);
73 ERR_CASE(ERROR_NO_PROC_SLOTS)
74 ERR_CASE(ERROR_MAX_THRDS_REACHED)
75 ERR_MAPS(ERROR_NESTING_NOT_ALLOWED, MSVCRT_EAGAIN);
77 /* Remaining cases map to EINVAL */
78 /* FIXME: may be missing some errors above */
79 *errno = MSVCRT_EINVAL;
83 /*********************************************************************
86 int* MSVCRT__errno(void)
88 return GET_THREAD_VAR_PTR(errno);
91 /*********************************************************************
92 * __doserrno (MSVCRT.@)
94 unsigned long* __doserrno(void)
96 return GET_THREAD_VAR_PTR(doserrno);
99 /*********************************************************************
100 * strerror (MSVCRT.@)
102 char* MSVCRT_strerror(int err)
104 return strerror(err); /* FIXME */
107 /**********************************************************************
108 * _strerror (MSVCRT.@)
110 char* _strerror(const char* err)
112 static char strerrbuff[256]; /* FIXME: Per thread, nprintf */
113 sprintf(strerrbuff,"%s: %s\n",err,MSVCRT_strerror(GET_THREAD_VAR(errno)));
117 /*********************************************************************
120 void MSVCRT_perror(const char* str)
122 _cprintf("%s: %s\n",str,MSVCRT_strerror(GET_THREAD_VAR(errno)));