-rw-r--r-- | src/eyetil.cc | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/eyetil.cc b/src/eyetil.cc new file mode 100644 index 0000000..d00c2ee --- a/dev/null +++ b/src/eyetil.cc | |||
@@ -0,0 +1,103 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <syslog.h> | ||
3 | #include <iostream> | ||
4 | #include <cassert> | ||
5 | #include <stdexcept> | ||
6 | #include <openssl/md5.h> | ||
7 | #include "eyetil.h" | ||
8 | |||
9 | binary_t& binary_t::from_hex(const std::string& h) { | ||
10 | /* TODO: algorithmize */ | ||
11 | std::string::size_type hs = h.length(); | ||
12 | if(hs&1) | ||
13 | throw std::runtime_error("odd number of characters in hexadecimal number"); | ||
14 | int rvs = hs>>1; | ||
15 | resize(rvs); | ||
16 | const unsigned char *hp = (const unsigned char*)h.data(); | ||
17 | iterator oi=begin(); | ||
18 | char t[3] = { 0,0,0 }; | ||
19 | for(int i=0;i<rvs;++i) { | ||
20 | t[0]=*(hp++); t[1]=*(hp++); | ||
21 | *(oi++) = strtol(t,0,16); | ||
22 | } | ||
23 | return *this; | ||
24 | } | ||
25 | |||
26 | binary_t& binary_t::from_data(const void *d,size_t s) { | ||
27 | resize(s); | ||
28 | std::copy((const unsigned char*)d,(const unsigned char *)d+s, | ||
29 | begin() ); | ||
30 | return *this; | ||
31 | } | ||
32 | |||
33 | std::string binary_t::hex() const { | ||
34 | std::string rv; | ||
35 | rv.reserve((size()<<1)+1); | ||
36 | char t[3] = {0,0,0}; | ||
37 | for(const_iterator i=begin(),ie=end();i!=ie;++i) { | ||
38 | int rc = snprintf(t,sizeof(t),"%02x",*i); | ||
39 | assert(rc<sizeof(t)); | ||
40 | rv += t; | ||
41 | } | ||
42 | return rv; | ||
43 | } | ||
44 | |||
45 | binary_t binary_t::md5() const { | ||
46 | binary_t rv(MD5_DIGEST_LENGTH); | ||
47 | if(!MD5( | ||
48 | (const unsigned char*)&(front()),size(), | ||
49 | (unsigned char*)&(rv.front()) )) | ||
50 | throw std::runtime_error("failed to md5()"); | ||
51 | return rv; | ||
52 | } | ||
53 | |||
54 | tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) { | ||
55 | if(!mkdtemp((char*)dir.data())) | ||
56 | throw std::runtime_error("failed to mkdtmp()"); | ||
57 | } | ||
58 | tmpdir_t::~tmpdir_t() { | ||
59 | assert(!dir.empty()); | ||
60 | if(rmdir(dir.c_str())) { | ||
61 | syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str()); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | std::string tmpdir_t::get_file(const std::string& f) { | ||
66 | std::string::size_type ls = f.rfind('/'); | ||
67 | return dir+'/'+( | ||
68 | (ls==std::string::npos) | ||
69 | ? f | ||
70 | : f.substr(ls+1) | ||
71 | ); | ||
72 | } | ||
73 | |||
74 | tarchive_t::tarchive_t(void *p,size_t s) : a(archive_read_new()), e(0) { | ||
75 | if(!a) throw std::runtime_error("failed to archive_read_new()"); | ||
76 | if(archive_read_support_format_tar(a)) { | ||
77 | archive_read_finish(a); | ||
78 | throw std::runtime_error("failed to archive_read_support_format_tar()"); | ||
79 | } | ||
80 | if(archive_read_open_memory(a,p,s)) { | ||
81 | archive_read_finish(a); | ||
82 | throw std::runtime_error("failed to archive_read_open_memory()"); | ||
83 | } | ||
84 | } | ||
85 | tarchive_t::~tarchive_t() { | ||
86 | assert(a); | ||
87 | archive_read_finish(a); | ||
88 | } | ||
89 | |||
90 | bool tarchive_t::read_next_header() { | ||
91 | assert(a); | ||
92 | return archive_read_next_header(a,&e)==ARCHIVE_OK; | ||
93 | } | ||
94 | |||
95 | std::string tarchive_t::entry_pathname() { | ||
96 | assert(a); assert(e); | ||
97 | return archive_entry_pathname(e); | ||
98 | } | ||
99 | |||
100 | bool tarchive_t::read_data_into_fd(int fd) { | ||
101 | assert(a); | ||
102 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; | ||
103 | } | ||