author | Michael Krelin <hacker@klever.net> | 2013-02-12 20:37:10 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2013-02-12 20:37:10 (UTC) |
commit | 13fb4abba3fd3cac0d5cb25d3eccddc298220d41 (patch) (unidiff) | |
tree | 8a086ffef06f153e739674a5c8beab1db9388238 /src/eyetil.h | |
parent | b80844f51353339cfbb8b35a5585911cdb4301e2 (diff) | |
download | iii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.zip iii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.tar.gz iii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.tar.bz2 |
introduce throwable_exit for nicer stack unwinding
yes, I enjoy abusing features
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | src/eyetil.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/eyetil.h b/src/eyetil.h index eff2c43..03b9ba8 100644 --- a/src/eyetil.h +++ b/src/eyetil.h | |||
@@ -1,57 +1,62 @@ | |||
1 | #ifndef __EYETIL_H | 1 | #ifndef __EYETIL_H |
2 | #define __EYETIL_H | 2 | #define __EYETIL_H |
3 | 3 | ||
4 | #include <vector> | 4 | #include <vector> |
5 | #include <string> | 5 | #include <string> |
6 | #include <archive.h> | 6 | #include <archive.h> |
7 | #include <archive_entry.h> | 7 | #include <archive_entry.h> |
8 | #include "openssl/md5.h" | 8 | #include "openssl/md5.h" |
9 | 9 | ||
10 | struct throwable_exit { | ||
11 | int rc; | ||
12 | throwable_exit(int rc_) : rc(rc_) { } | ||
13 | }; | ||
14 | |||
10 | class binary_t : public std::vector<unsigned char> { | 15 | class binary_t : public std::vector<unsigned char> { |
11 | public: | 16 | public: |
12 | binary_t() { } | 17 | binary_t() { } |
13 | binary_t(size_type n) : std::vector<unsigned char>(n) { } | 18 | binary_t(size_type n) : std::vector<unsigned char>(n) { } |
14 | binary_t(const std::string& h) { from_hex(h); } | 19 | binary_t(const std::string& h) { from_hex(h); } |
15 | binary_t(const void *d,size_t s) { from_data(d,s); } | 20 | binary_t(const void *d,size_t s) { from_data(d,s); } |
16 | 21 | ||
17 | binary_t& from_hex(const std::string& h); | 22 | binary_t& from_hex(const std::string& h); |
18 | binary_t& from_data(const void *d,size_t s); | 23 | binary_t& from_data(const void *d,size_t s); |
19 | binary_t& make_nonce(); | 24 | binary_t& make_nonce(); |
20 | 25 | ||
21 | std::string hex() const; | 26 | std::string hex() const; |
22 | binary_t md5() const; | 27 | binary_t md5() const; |
23 | }; | 28 | }; |
24 | 29 | ||
25 | struct md5_digester { | 30 | struct md5_digester { |
26 | MD5_CTX ctx; | 31 | MD5_CTX ctx; |
27 | md5_digester() { init(); } | 32 | md5_digester() { init(); } |
28 | 33 | ||
29 | void init(); | 34 | void init(); |
30 | void update(const void *d,size_t l); | 35 | void update(const void *d,size_t l); |
31 | binary_t final(); | 36 | binary_t final(); |
32 | 37 | ||
33 | template<typename T> | 38 | template<typename T> |
34 | void update(const T& x) { update(&x,sizeof(x)); } | 39 | void update(const T& x) { update(&x,sizeof(x)); } |
35 | 40 | ||
36 | template<typename T> | 41 | template<typename T> |
37 | struct update_iterator : public std::iterator<std::output_iterator_tag,T,void,T*,T&> { | 42 | struct update_iterator : public std::iterator<std::output_iterator_tag,T,void,T*,T&> { |
38 | md5_digester *d; | 43 | md5_digester *d; |
39 | update_iterator(md5_digester *d_) : d(d_) { } | 44 | update_iterator(md5_digester *d_) : d(d_) { } |
40 | update_iterator(const update_iterator& x) : d(x.d) { } | 45 | update_iterator(const update_iterator& x) : d(x.d) { } |
41 | 46 | ||
42 | update_iterator& operator*() { return *this; } | 47 | update_iterator& operator*() { return *this; } |
43 | update_iterator& operator++() { return *this; } | 48 | update_iterator& operator++() { return *this; } |
44 | update_iterator& operator++(int) { return *this; } | 49 | update_iterator& operator++(int) { return *this; } |
45 | 50 | ||
46 | update_iterator& operator=(const T& x) { | 51 | update_iterator& operator=(const T& x) { |
47 | d->update(x); return *this; | 52 | d->update(x); return *this; |
48 | } | 53 | } |
49 | }; | 54 | }; |
50 | 55 | ||
51 | template<typename T> | 56 | template<typename T> |
52 | update_iterator<T> updater() { | 57 | update_iterator<T> updater() { |
53 | return update_iterator<T>(this); | 58 | return update_iterator<T>(this); |
54 | } | 59 | } |
55 | 60 | ||
56 | }; | 61 | }; |
57 | template<> inline void md5_digester::update<binary_t>(const binary_t& x) { | 62 | template<> inline void md5_digester::update<binary_t>(const binary_t& x) { |