-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 @@ +#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; +} |