Support for nonstandard baud rate in SetCommState.
[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 #include <stdio.h>
11 #include <string.h>
12
13 #include "msvcrt/conio.h"
14 #include "msvcrt/stdlib.h"
15 #include "msvcrt/string.h"
16
17
18 #include "wine/debug.h"
19
20 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
21
22
23 /* INTERNAL: Set the crt and dos errno's from the OS error given. */
24 void MSVCRT__set_errno(int err)
25 {
26   int *errno = GET_THREAD_VAR_PTR(errno);
27   unsigned long *doserrno = GET_THREAD_VAR_PTR(doserrno);
28
29   *doserrno = err;
30
31   switch(err)
32   {
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);
76   default:
77     /*  Remaining cases map to EINVAL */
78     /* FIXME: may be missing some errors above */
79     *errno = MSVCRT_EINVAL;
80   }
81 }
82
83 /*********************************************************************
84  *              _errno (MSVCRT.@)
85  */
86 int* MSVCRT__errno(void)
87 {
88   return GET_THREAD_VAR_PTR(errno);
89 }
90
91 /*********************************************************************
92  *              __doserrno (MSVCRT.@)
93  */
94 unsigned long* __doserrno(void)
95 {
96   return GET_THREAD_VAR_PTR(doserrno);
97 }
98
99 /*********************************************************************
100  *              strerror (MSVCRT.@)
101  */
102 char* MSVCRT_strerror(int err)
103 {
104   return strerror(err); /* FIXME */
105 }
106
107 /**********************************************************************
108  *              _strerror       (MSVCRT.@)
109  */
110 char* _strerror(const char* err)
111 {
112   static char strerrbuff[256]; /* FIXME: Per thread, nprintf */
113   sprintf(strerrbuff,"%s: %s\n",err,MSVCRT_strerror(GET_THREAD_VAR(errno)));
114   return strerrbuff;
115 }
116
117 /*********************************************************************
118  *              perror (MSVCRT.@)
119  */
120 void MSVCRT_perror(const char* str)
121 {
122   _cprintf("%s: %s\n",str,MSVCRT_strerror(GET_THREAD_VAR(errno)));
123 }