Index: util/posix/symbolic_constants_posix.cc |
diff --git a/util/posix/symbolic_constants_posix.cc b/util/posix/symbolic_constants_posix.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6846c5d241910d8e522e7acc22cf7b7cdf22ba7b |
--- /dev/null |
+++ b/util/posix/symbolic_constants_posix.cc |
@@ -0,0 +1,166 @@ |
+// Copyright 2014 The Crashpad Authors. All rights reserved. |
+// |
+// 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. |
+ |
+#include "util/posix/symbolic_constants_posix.h" |
+ |
+#include <sys/signal.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/strings/stringprintf.h" |
+#include "util/stdlib/string_number_conversion.h" |
+ |
+namespace { |
+ |
+const char* kSignalNames[] = { |
+ NULL, |
+ |
+#if defined(OS_MACOSX) |
+ // sed -Ene 's/^#define[[:space:]]SIG([[:alnum:]]+)[[:space:]]+[[:digit:]]{1,2}([[:space:]]|$).*/ "\1",/p' |
+ // /usr/include/sys/signal.h |
+ // and fix up by removing the entry for SIGPOLL. |
+ "HUP", |
+ "INT", |
+ "QUIT", |
+ "ILL", |
+ "TRAP", |
+ "ABRT", |
+ "EMT", |
+ "FPE", |
+ "KILL", |
+ "BUS", |
+ "SEGV", |
+ "SYS", |
+ "PIPE", |
+ "ALRM", |
+ "TERM", |
+ "URG", |
+ "STOP", |
+ "TSTP", |
+ "CONT", |
+ "CHLD", |
+ "TTIN", |
+ "TTOU", |
+ "IO", |
+ "XCPU", |
+ "XFSZ", |
+ "VTALRM", |
+ "PROF", |
+ "WINCH", |
+ "INFO", |
+ "USR1", |
+ "USR2", |
+#elif defined(OS_LINUX) |
+ // sed -Ene 's/^#define[[:space:]]SIG([[:alnum:]]+)[[:space:]]+[[:digit:]]{1,2}([[:space:]]|$).*/ "\1",/p' |
+ // /usr/include/asm-generic/signal.h |
+ // and fix up by removing SIGIOT, SIGLOST, SIGUNUSED, and SIGRTMIN. |
+ "HUP", |
+ "INT", |
+ "QUIT", |
+ "ILL", |
+ "TRAP", |
+ "ABRT", |
+ "BUS", |
+ "FPE", |
+ "KILL", |
+ "USR1", |
+ "SEGV", |
+ "USR2", |
+ "PIPE", |
+ "ALRM", |
+ "TERM", |
+ "STKFLT", |
+ "CHLD", |
+ "CONT", |
+ "STOP", |
+ "TSTP", |
+ "TTIN", |
+ "TTOU", |
+ "URG", |
+ "XCPU", |
+ "XFSZ", |
+ "VTALRM", |
+ "PROF", |
+ "WINCH", |
+ "IO", |
+ "PWR", |
+ "SYS", |
+#endif |
+}; |
+#if defined(OS_LINUX) |
+// NSIG is 64 to account for real-time signals. |
+COMPILE_ASSERT(arraysize(kSignalNames) == 32, kSignalNames_length); |
+#else |
+COMPILE_ASSERT(arraysize(kSignalNames) == NSIG, kSignalNames_length); |
+#endif |
+ |
+const char kSigPrefix[] = "SIG"; |
+ |
+} // namespace |
+ |
+namespace crashpad { |
+ |
+std::string SignalToString(int signal, |
+ SymbolicConstantToStringOptions options) { |
+ const char* signal_name = |
+ static_cast<size_t>(signal) < arraysize(kSignalNames) |
+ ? kSignalNames[signal] |
+ : NULL; |
+ if (!signal_name) { |
+ if (options & kUnknownIsNumeric) { |
+ return base::StringPrintf("%d", signal); |
+ } |
+ return std::string(); |
+ } |
+ |
+ if (options & kUseShortName) { |
+ return std::string(signal_name); |
+ } |
+ return base::StringPrintf("%s%s", kSigPrefix, signal_name); |
+} |
+ |
+bool StringToSignal(const base::StringPiece& string, |
+ StringToSymbolicConstantOptions options, |
+ int* signal) { |
+ if ((options & kAllowFullName) || (options & kAllowShortName)) { |
+ bool can_match_full = |
+ (options & kAllowFullName) && |
+ string.substr(0, strlen(kSigPrefix)).compare(kSigPrefix) == 0; |
+ base::StringPiece short_string = |
+ can_match_full ? string.substr(strlen(kSigPrefix)) : string; |
+ for (int index = 0; |
+ index < static_cast<int>(arraysize(kSignalNames)); |
+ ++index) { |
+ const char* signal_name = kSignalNames[index]; |
+ if (!signal_name) { |
+ continue; |
+ } |
+ if (can_match_full && short_string.compare(signal_name) == 0) { |
+ *signal = index; |
+ return true; |
+ } |
+ if ((options & kAllowShortName) && string.compare(signal_name) == 0) { |
+ *signal = index; |
+ return true; |
+ } |
+ } |
+ } |
+ |
+ if (options & kAllowNumber) { |
+ return StringToNumber(string, signal); |
+ } |
+ |
+ return false; |
+} |
+ |
+} // namespace crashpad |