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,89 +1,94 @@ | |||
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) { |
58 | update((const unsigned char*)&(x.front()),x.size()); | 63 | update((const unsigned char*)&(x.front()),x.size()); |
59 | } | 64 | } |
60 | 65 | ||
61 | class tmpdir_t { | 66 | class tmpdir_t { |
62 | public: | 67 | public: |
63 | std::string dir; | 68 | std::string dir; |
64 | 69 | ||
65 | tmpdir_t(const std::string& dt); | 70 | tmpdir_t(const std::string& dt); |
66 | ~tmpdir_t(); | 71 | ~tmpdir_t(); |
67 | 72 | ||
68 | std::string get_file(const std::string& f); | 73 | std::string get_file(const std::string& f); |
69 | }; | 74 | }; |
70 | 75 | ||
71 | class tarchive_t { | 76 | class tarchive_t { |
72 | public: | 77 | public: |
73 | struct archive *a; | 78 | struct archive *a; |
74 | struct archive_entry *e; | 79 | struct archive_entry *e; |
75 | 80 | ||
76 | tarchive_t(void *p,size_t s); | 81 | tarchive_t(void *p,size_t s); |
77 | ~tarchive_t(); | 82 | ~tarchive_t(); |
78 | 83 | ||
79 | bool read_next_header(); | 84 | bool read_next_header(); |
80 | 85 | ||
81 | std::string entry_pathname(); | 86 | std::string entry_pathname(); |
82 | 87 | ||
83 | bool read_data_into_fd(int fd); | 88 | bool read_data_into_fd(int fd); |
84 | }; | 89 | }; |
85 | 90 | ||
86 | binary_t integrity_digest(const void *ptr,size_t size, | 91 | binary_t integrity_digest(const void *ptr,size_t size, |
87 | const std::string& ukey); | 92 | const std::string& ukey); |
88 | 93 | ||
89 | #endif /* __EYETIL_H */ | 94 | #endif /* __EYETIL_H */ |