aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/src/firebase/firestore/util/strerror.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Firestore/core/src/firebase/firestore/util/strerror.cc')
-rw-r--r--Firestore/core/src/firebase/firestore/util/strerror.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/Firestore/core/src/firebase/firestore/util/strerror.cc b/Firestore/core/src/firebase/firestore/util/strerror.cc
new file mode 100644
index 0000000..ab1bbbb
--- /dev/null
+++ b/Firestore/core/src/firebase/firestore/util/strerror.cc
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2018 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Implementation note:
+//
+// This is ported from //base/strerror.cc, with several local modifications:
+//
+// * Removed non-portable optimization around to use sys_errlist where
+// available without warnings.
+// * Added __attribute__((unused)) to compile with -Wno-unused-functions.
+// * Conformed to style/lint rules.
+
+#include "Firestore/core/src/firebase/firestore/util/strerror.h"
+
+#include <cerrno>
+#include <cstring>
+
+#if defined(_WIN32)
+#define HAVE_STRERROR_S 1
+
+#elif defined(__GLIBC__)
+#if (_POSIX_C_SOURCE >= 200112L) && !_GNU_SOURCE
+#define HAVE_POSIX_STRERROR_R 1
+#else
+#define HAVE_GNU_STRERROR_R 1
+#endif
+
+#else
+#define HAVE_POSIX_STRERROR_R 1
+
+#endif
+
+namespace firebase {
+namespace firestore {
+namespace util {
+
+namespace {
+
+inline const char* StrErrorAdaptor(int errnum, char* buf, size_t buflen) {
+#if HAVE_STRERROR_S
+ int rc = strerror_s(buf, buflen, errnum);
+ buf[buflen - 1] = '\0'; // guarantee NUL termination
+
+ if (rc == 0 && strcmp(buf, "Unknown error") == 0) {
+ *buf = '\0';
+ }
+ return buf;
+
+#elif HAVE_POSIX_STRERROR_R
+ if (strerror_r(errnum, buf, buflen)) {
+ *buf = '\0';
+ }
+ return buf;
+
+#elif HAVE_GNU_STRERROR_R
+ return strerror_r(errnum, buf, buflen);
+
+#endif // HAVE_STRERROR_S
+}
+
+} // namespace
+
+std::string StrError(int errnum) {
+ const int saved_errno = errno;
+
+ char buf[100];
+ const char* str = StrErrorAdaptor(errnum, buf, sizeof buf);
+ if (*str == '\0') {
+ snprintf(buf, sizeof buf, "Unknown error %d", errnum);
+ str = buf;
+ }
+
+ errno = saved_errno;
+ return str;
+}
+
+} // namespace util
+} // namespace firestore
+} // namespace firebase