Updated.
[wine] / dlls / msvcrt / errno.c
1 /*
2  * msvcrt.dll errno functions
3  *
4  * Copyright 2000 Jon Griffiths
5  */
6
7 #include "msvcrt.h"
8 #include "ms_errno.h"
9
10 DEFAULT_DEBUG_CHANNEL(msvcrt);
11
12
13 /* INTERNAL: Set the crt and dos errno's from the OS error given. */
14 void MSVCRT__set_errno(int err)
15 {
16   int *errno = GET_THREAD_VAR_PTR(errno);
17   int *doserrno = GET_THREAD_VAR_PTR(doserrno);
18
19   *doserrno = err;
20
21   switch(err)
22   {
23 #define ERR_CASE(oserr) case oserr:
24 #define ERR_MAPS(oserr,crterr) case oserr:*errno = crterr;break;
25     ERR_CASE(ERROR_ACCESS_DENIED)
26     ERR_CASE(ERROR_NETWORK_ACCESS_DENIED)
27     ERR_CASE(ERROR_CANNOT_MAKE)
28     ERR_CASE(ERROR_SEEK_ON_DEVICE)
29     ERR_CASE(ERROR_LOCK_FAILED)
30     ERR_CASE(ERROR_FAIL_I24)
31     ERR_CASE(ERROR_CURRENT_DIRECTORY)
32     ERR_CASE(ERROR_DRIVE_LOCKED)
33     ERR_CASE(ERROR_NOT_LOCKED)
34     ERR_CASE(ERROR_INVALID_ACCESS)
35     ERR_MAPS(ERROR_LOCK_VIOLATION,       MSVCRT_EACCES);
36     ERR_CASE(ERROR_FILE_NOT_FOUND)
37     ERR_CASE(ERROR_NO_MORE_FILES)
38     ERR_CASE(ERROR_BAD_PATHNAME)
39     ERR_CASE(ERROR_BAD_NETPATH)
40     ERR_CASE(ERROR_INVALID_DRIVE)
41     ERR_CASE(ERROR_BAD_NET_NAME)
42     ERR_CASE(ERROR_FILENAME_EXCED_RANGE)
43     ERR_MAPS(ERROR_PATH_NOT_FOUND,       MSVCRT_ENOENT);
44     ERR_MAPS(ERROR_IO_DEVICE,            MSVCRT_EIO);
45     ERR_MAPS(ERROR_BAD_FORMAT,           MSVCRT_ENOEXEC);
46     ERR_MAPS(ERROR_INVALID_HANDLE,       MSVCRT_EBADF);
47     ERR_CASE(ERROR_OUTOFMEMORY)
48     ERR_CASE(ERROR_INVALID_BLOCK)
49     ERR_CASE(ERROR_NOT_ENOUGH_QUOTA);
50     ERR_MAPS(ERROR_ARENA_TRASHED,        MSVCRT_ENOMEM);
51     ERR_MAPS(ERROR_BUSY,                 MSVCRT_EBUSY);
52     ERR_CASE(ERROR_ALREADY_EXISTS)
53     ERR_MAPS(ERROR_FILE_EXISTS,          MSVCRT_EEXIST);
54     ERR_MAPS(ERROR_BAD_DEVICE,           MSVCRT_ENODEV);
55     ERR_MAPS(ERROR_TOO_MANY_OPEN_FILES,  MSVCRT_EMFILE);
56     ERR_MAPS(ERROR_DISK_FULL,            MSVCRT_ENOSPC);
57     ERR_MAPS(ERROR_BROKEN_PIPE,          MSVCRT_EPIPE);
58     ERR_MAPS(ERROR_POSSIBLE_DEADLOCK,    MSVCRT_EDEADLK);
59     ERR_MAPS(ERROR_DIR_NOT_EMPTY,        MSVCRT_ENOTEMPTY);
60     ERR_MAPS(ERROR_BAD_ENVIRONMENT,      MSVCRT_E2BIG);
61     ERR_CASE(ERROR_WAIT_NO_CHILDREN)
62     ERR_MAPS(ERROR_CHILD_NOT_COMPLETE,   MSVCRT_ECHILD);
63     ERR_CASE(ERROR_NO_PROC_SLOTS)
64     ERR_CASE(ERROR_MAX_THRDS_REACHED)
65     ERR_MAPS(ERROR_NESTING_NOT_ALLOWED,  MSVCRT_EAGAIN);
66   default:
67     /*  Remaining cases map to EINVAL */
68     /* FIXME: may be missing some errors above */
69     *errno = MSVCRT_EINVAL;
70   }
71 }
72
73 /*********************************************************************
74  *              _errno (MSVCRT.@)
75  */
76 int *__cdecl MSVCRT__errno(void)
77 {
78   return GET_THREAD_VAR_PTR(errno);
79 }
80
81 /*********************************************************************
82  *              __doserrno (MSVCRT.@)
83  */
84 int *__cdecl MSVCRT___doserrno(void)
85 {
86   return GET_THREAD_VAR_PTR(doserrno);
87 }
88
89 char *strerror(int);
90
91 /*********************************************************************
92  *              strerror (MSVCRT.@)
93  */
94 char * __cdecl MSVCRT_strerror (int err)
95 {
96   return strerror(err); /* FIXME */
97 }
98
99 /**********************************************************************
100  *              _strerror       (MSVCRT.@)
101  */
102 extern int sprintf(char *str, const char *format, ...);
103
104 const char *__cdecl MSVCRT__strerror (const char *err)
105 {
106   static char strerrbuff[256]; /* FIXME: Per thread, nprintf */
107   sprintf(strerrbuff,"%s: %s\n",err,MSVCRT_strerror(GET_THREAD_VAR(errno)));
108   return strerrbuff;
109 }
110
111 int __cdecl MSVCRT__cprintf( const char * format, ... );
112
113 /*********************************************************************
114  *              perror (MSVCRT.@)
115  */
116 void __cdecl MSVCRT_perror (const char *str)
117 {
118   MSVCRT__cprintf("%s: %s\n",str,MSVCRT_strerror(GET_THREAD_VAR(errno)));
119 }