Hi,
> While this would be a cleaner fix, it also requires extensive changes and > it is not always easy to decide where to use M_ERRNO and where to use > M_WINERR. E.g., without looking into the internals of platform.c one > doesn't know whether platform_open() uses _wopen() or CreateFile(). > True. > A possible option is to continue the use of M_ERRNO on WIndows as is > (except for socket errors), continue to use GetLastError() in x_msg(), but > if/when the latter if it returns zero, try errno and strerrror(). Not ideal > but less changes and easier and transparent to the user of msg(). That > said, I haven't checked whether GetLastError() returns zero or a valid and > correct error code for C runtime errors -- without which this approach wont > work. > I did some tests, ::GetLastError appears to return zero or correct error code: sqrt(-1); int err = errno; // -33 EDOM DWORD lasterr = GetLastError(); // 0 _open("c:\\Temp\\notfound", _O_RDONLY); err = errno; // 2 ENOENT lasterr = GetLastError(); // 2 ERROR_FILE_NOT_FOUND _open("c:\\Temp\\directory", _O_RDONLY); err = errno; // 13 EACCES lasterr = GetLastError(); // 5 ERROR_ACCESS_DENIED malloc(10000000000); err = errno; // 12 ENOMEM lasterr = GetLastError(); // 8 ERROR_NOT_ENOUGH_MEMORY So let's go with this approach. > BTW, there are a couple of uses of strerror() in check_status() (error.c) > missed by the original patch. > Thanks, I will address it in this "proper" fix. -- -Lev
_______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel