CryptAcquireContext(&crypt_prov, NULL, NULL,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if (!CryptGenRandom(crypt_prov, n, buffer)) {
- char *msg_buf = ovs_lasterror_to_string();
+ VLOG_ERR("CryptGenRandom: read error (%s)", ovs_lasterror_to_string());
error = EINVAL;
- VLOG_ERR("CryptGenRandom: read error (%s)", msg_buf);
- LocalFree(msg_buf);
}
CryptReleaseContext(crypt_prov, 0);
retval = LockFileEx(lock_handle, LOCKFILE_EXCLUSIVE_LOCK
| LOCKFILE_FAIL_IMMEDIATELY, 0, 1, 0, &overl);
if (!retval) {
- char *msg_buf = ovs_lasterror_to_string();
- VLOG_WARN("Failed to lock file : %s", msg_buf);
- LocalFree(msg_buf);
+ VLOG_WARN("Failed to lock file : %s", ovs_lasterror_to_string());
return EEXIST;
}
* space for a null terminator. */
#define MAX_UN_LEN (sizeof(((struct sockaddr_un *) 0)->sun_path) - 1)
-#ifdef _WIN32
-/* Buffer used by sock_strerror(). */
-DEFINE_STATIC_PER_THREAD_DATA(struct { char s[128]; },
- sockerror_buffer,
- { "" });
-#endif
-
static int getsockopt_int(int fd, int level, int option, const char *optname,
int *valuep);
/* For Windows socket calls, 'errno' is not set. One has to call
* WSAGetLastError() to get the error number and then pass it to
- * FormatMessage() (through this function) to get the correct error string.
-
+ * this function to get the correct error string.
+ *
* ovs_strerror() calls strerror_r() and would not get the correct error
* string for Windows sockets, but is good for POSIX. */
const char *
sock_strerror(int error)
{
#ifdef _WIN32
- enum { BUFSIZE = sizeof sockerror_buffer_get()->s };
- char *buffer = sockerror_buffer_get()->s;
-
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0,
- buffer, BUFSIZE, NULL);
- return buffer;
+ return ovs_format_message(error);
#else
return ovs_strerror(error);
#endif
/* --version option output. */
static char *program_version;
-/* Buffer used by ovs_strerror(). */
+/* Buffer used by ovs_strerror() and ovs_format_message(). */
DEFINE_STATIC_PER_THREAD_DATA(struct { char s[128]; },
strerror_buffer,
{ "" });
#ifdef _WIN32
\f
-/* Calls FormatMessage() with GetLastError() as an argument. Returns
- * pointer to a buffer that receives the null-terminated string that specifies
- * the formatted message and that has to be freed by the caller with
- * LocalFree(). */
char *
-ovs_lasterror_to_string(void)
+ovs_format_message(int error)
{
- char *buffer;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0,
- (char *)&buffer, 0, NULL);
+ enum { BUFSIZE = sizeof strerror_buffer_get()->s };
+ char *buffer = strerror_buffer_get()->s;
+
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, error, 0, buffer, BUFSIZE, NULL);
return buffer;
}
+
+/* Returns a null-terminated string that explains the last error.
+ * Use this function to get the error string for WINAPI calls. */
+char *
+ovs_lasterror_to_string(void)
+{
+ return ovs_format_message(GetLastError());
+}
#endif
#ifdef _WIN32
\f
+char *ovs_format_message(int error);
char *ovs_lasterror_to_string(void);
#endif