/* --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,
{ "" });
+static char *xreadlink(const char *filename);
+
void
ovs_assert_failure(const char *where, const char *function,
const char *condition)
: ovs_strerror(retval));
}
+/* This function returns the string describing the error number in 'error'
+ * for POSIX platforms. For Windows, this function can be used for C library
+ * calls. For socket calls that are also used in Windows, use sock_strerror()
+ * instead. For WINAPI calls, look at ovs_lasterror_to_string(). */
const char *
ovs_strerror(int error)
{
#ifdef _WIN32
char *basename;
size_t max_len = strlen(argv0) + 1;
+
+ if (program_name) {
+ return;
+ }
basename = xmalloc(max_len);
_splitpath_s(argv0, NULL, 0, NULL, 0, basename, max_len, NULL, 0);
assert_single_threaded();
/* Like readlink(), but returns the link name as a null-terminated string in
* allocated memory that the caller must eventually free (with free()).
* Returns NULL on error, in which case errno is set appropriately. */
-char *
+static char *
xreadlink(const char *filename)
{
size_t size;
*
* - Only symlinks in the final component of 'filename' are dereferenced.
*
+ * For Windows platform, this function returns a string that has the same
+ * value as the passed string.
+ *
* The caller must eventually free the returned string (with free()). */
char *
follow_symlinks(const char *filename)
{
+#ifndef _WIN32
struct stat s;
char *fn;
int i;
VLOG_WARN("%s: too many levels of symlinks", filename);
free(fn);
+#endif
return xstrdup(filename);
}
return ok;
}
+#ifdef _WIN32
+\f
+char *
+ovs_format_message(int error)
+{
+ 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