summaryrefslogtreecommitdiffabout
path: root/src/eyetil.cc
Side-by-side diff
Diffstat (limited to 'src/eyetil.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--src/eyetil.cc103
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 @@
+#include <stdlib.h>
+#include <syslog.h>
+#include <iostream>
+#include <cassert>
+#include <stdexcept>
+#include <openssl/md5.h>
+#include "eyetil.h"
+
+binary_t& binary_t::from_hex(const std::string& h) {
+ /* TODO: algorithmize */
+ std::string::size_type hs = h.length();
+ if(hs&1)
+ throw std::runtime_error("odd number of characters in hexadecimal number");
+ int rvs = hs>>1;
+ resize(rvs);
+ const unsigned char *hp = (const unsigned char*)h.data();
+ iterator oi=begin();
+ char t[3] = { 0,0,0 };
+ for(int i=0;i<rvs;++i) {
+ t[0]=*(hp++); t[1]=*(hp++);
+ *(oi++) = strtol(t,0,16);
+ }
+ return *this;
+}
+
+binary_t& binary_t::from_data(const void *d,size_t s) {
+ resize(s);
+ std::copy((const unsigned char*)d,(const unsigned char *)d+s,
+ begin() );
+ return *this;
+}
+
+std::string binary_t::hex() const {
+ std::string rv;
+ rv.reserve((size()<<1)+1);
+ char t[3] = {0,0,0};
+ for(const_iterator i=begin(),ie=end();i!=ie;++i) {
+ int rc = snprintf(t,sizeof(t),"%02x",*i);
+ assert(rc<sizeof(t));
+ rv += t;
+ }
+ return rv;
+}
+
+binary_t binary_t::md5() const {
+ binary_t rv(MD5_DIGEST_LENGTH);
+ if(!MD5(
+ (const unsigned char*)&(front()),size(),
+ (unsigned char*)&(rv.front()) ))
+ throw std::runtime_error("failed to md5()");
+ return rv;
+}
+
+tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) {
+ if(!mkdtemp((char*)dir.data()))
+ throw std::runtime_error("failed to mkdtmp()");
+}
+tmpdir_t::~tmpdir_t() {
+ assert(!dir.empty());
+ if(rmdir(dir.c_str())) {
+ syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str());
+ }
+}
+
+std::string tmpdir_t::get_file(const std::string& f) {
+ std::string::size_type ls = f.rfind('/');
+ return dir+'/'+(
+ (ls==std::string::npos)
+ ? f
+ : f.substr(ls+1)
+ );
+}
+
+tarchive_t::tarchive_t(void *p,size_t s) : a(archive_read_new()), e(0) {
+ if(!a) throw std::runtime_error("failed to archive_read_new()");
+ if(archive_read_support_format_tar(a)) {
+ archive_read_finish(a);
+ throw std::runtime_error("failed to archive_read_support_format_tar()");
+ }
+ if(archive_read_open_memory(a,p,s)) {
+ archive_read_finish(a);
+ throw std::runtime_error("failed to archive_read_open_memory()");
+ }
+}
+tarchive_t::~tarchive_t() {
+ assert(a);
+ archive_read_finish(a);
+}
+
+bool tarchive_t::read_next_header() {
+ assert(a);
+ return archive_read_next_header(a,&e)==ARCHIVE_OK;
+}
+
+std::string tarchive_t::entry_pathname() {
+ assert(a); assert(e);
+ return archive_entry_pathname(e);
+}
+
+bool tarchive_t::read_data_into_fd(int fd) {
+ assert(a);
+ return archive_read_data_into_fd(a,fd)==ARCHIVE_OK;
+}