Chromium Code Reviews| 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..f7b70686d83836695ab09c20aa5fe916dc60d2e2 |
| --- /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> |
|
Robert Sesek
2014/09/10 20:01:04
Just for NSIG? (maybe "// for NSIG" if that's the
Mark Mentovai
2014/09/10 20:30:52
rsesek wrote:
|
| + |
| +#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 std::string(kSigPrefix).append(signal_name); |
|
Robert Sesek
2014/09/10 20:01:04
StringPrintf instead? Not sure which would be more
|
| +} |
| + |
| +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 |