libchromes: remove '-Wl,-z,defs' when asan enabled.
[chromiumos/platform/libchromeos.git] / chromeos / utility.h
1 // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROMEOS_UTILITY_H_
6 #define CHROMEOS_UTILITY_H_
7
8 #include <cstdlib>
9 #include <cstring>
10 #include <string>
11 #include <vector>
12
13 #include <base/values.h>
14
15 // Be VERY CAREFUL when touching this. It is include-order-sensitive.
16 // This library (libchromeos) is built with -fno-exceptions, but dbus-c++ uses
17 // exceptions heavily. In dbus-c++/types.h, there are overloaded operators for
18 // accessing DBus::MessageIters, which causes compilation to fail when they're
19 // included into libchromeos. Therefore, define away the throws in the header
20 // file, so that:
21 //    throw Foo();
22 // becomes:
23 //    abort(), Foo();
24 // The comma keeps the resulting expression one statement (which makes unbraced
25 // if statements work properly).
26 //
27 // The extra twist is that dbus-c++/error.h has some incompatible uses of throw
28 // (like the throw annotation on method declarations), so we explicitly include
29 // dbus-c++/error.h first so its include guards will have been set, then include
30 // dbus-c++/types.h.
31 #include <dbus-c++/error.h>
32 #define throw abort(),
33 #include <dbus-c++/types.h>
34 #undef throw
35
36 // For use in a switch statement to return the string from a label. Like:
37 // const char* CommandToName(CommandType command) {
38 //    switch (command) {
39 //       CHROMEOS_CASE_RETURN_LABEL(CMD_DELETE);
40 //       CHROMEOS_CASE_RETURN_LABEL(CMD_OPEN);
41 //    }
42 //    return "Unknown commmand";
43 // }
44 #define CHROMEOS_CASE_RETURN_LABEL(label) \
45     case label: return #label
46
47 namespace chromeos {
48
49 typedef std::vector<unsigned char> Blob;
50
51 // Returns a string that represents the hexadecimal encoded contents of blob.
52 // String will contain only the characters 0-9 and a-f.
53 //
54 // Parameters
55 //  blob   - The bytes to encode.
56 //  string - ASCII representation of the blob in hex.
57 //
58 std::string AsciiEncode(const Blob &blob);
59
60 // Converts a string representing a sequence of bytes in hex into the actual
61 // bytes.
62 //
63 // Parameters
64 //  str - The bytes to decode.
65 // Returns
66 //  The decoded bytes as a Blob.
67 //
68 Blob AsciiDecode(const std::string &str);
69
70 // Secure memset - volatile qualifier prevents a call to memset from being
71 // optimized away.
72 //
73 // Based on memset_s in:
74 // https://buildsecurityin.us-cert.gov/daisy/bsi-rules/home/g1/771-BSI.html
75 void* SecureMemset(void *v, int c, size_t n);
76
77 // Compare [n] bytes starting at [s1] with [s2] and return 0 if they match,
78 // 1 if they don't. Time taken to perform the comparison is only dependent on
79 // [n] and not on the relationship of the match between [s1] and [s2].
80 int SafeMemcmp(const void* s1, const void* s2, size_t n);
81
82 // Convert a DBus message into a Value.
83 //
84 // Parameters
85 //  message - Message to convert.
86 //  value - Result pointer.
87 // Returns
88 //  True if conversion succeeded, false if it didn't.
89 bool DBusMessageToValue(DBus::Message& message, Value** v);
90
91 // Convert a DBus message iterator a Value.
92 //
93 // Parameters
94 //  message - Message to convert.
95 //  value - Result pointer.
96 // Returns
97 //  True if conversion succeeded, false if it didn't.
98 bool DBusMessageIterToValue(DBus::MessageIter& message, Value** v);
99
100 // Convert a DBus property map to a Value.
101 //
102 // Parameters
103 //  message - Message to convert.
104 //  value - Result pointer.
105 // Returns
106 //  True if conversion succeeded, false if it didn't.
107 bool DBusPropertyMapToValue(std::map<std::string, DBus::Variant>&
108                             properties, Value** v);
109
110 }  // namespace chromeos
111
112
113 #endif /* CHROMEOS_UTILITY_H_ */