-/* Copyright (c) 2009, 2010 Nicira Networks
+/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
return error;
}
+/* Returns an ovsdb_error that represents an internal error for file name
+ * 'file' and line number 'line', with 'details' (formatted as with printf())
+ * as the associated message. The caller is responsible for freeing the
+ * returned error.
+ *
+ * If 'inner_error' is nonnull then the returned error is wrapped around
+ * 'inner_error'. Takes ownership of 'inner_error'. */
struct ovsdb_error *
-ovsdb_internal_error(const char *file, int line, const char *details, ...)
+ovsdb_internal_error(struct ovsdb_error *inner_error,
+ const char *file, int line, const char *details, ...)
{
struct ds ds = DS_EMPTY_INITIALIZER;
struct backtrace backtrace;
ds_put_char(&ds, ')');
}
- ds_put_format(&ds, " (%s %s%s)", program_name, VERSION, BUILDNR);
+ ds_put_format(&ds, " (%s %s)", program_name, VERSION);
+
+ if (inner_error) {
+ char *s = ovsdb_error_to_string(inner_error);
+ ds_put_format(&ds, " (generated from: %s)", s);
+ free(s);
+
+ ovsdb_error_destroy(inner_error);
+ }
error = ovsdb_error("internal error", "%s", ds_cstr(&ds));
}
}
-static const char *
-ovsdb_errno_string(int error)
-{
- return error == EOF ? "unexpected end of file" : strerror(error);
-}
-
struct json *
ovsdb_error_to_json(const struct ovsdb_error *error)
{
}
if (error->errno_) {
json_object_put_string(json, "io-error",
- ovsdb_errno_string(error->errno_));
+ ovs_retval_to_string(error->errno_));
}
return json;
}
ds_put_format(&ds, ": %s", error->details);
}
if (error->errno_) {
- ds_put_format(&ds, " (%s)", ovsdb_errno_string(error->errno_));
+ ds_put_format(&ds, " (%s)", ovs_retval_to_string(error->errno_));
}
return ds_steal_cstr(&ds);
}
ovsdb_error_destroy(error);
}
}
-