author | Michael Krelin <hacker@klever.net> | 2013-02-13 22:43:26 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2013-02-13 22:43:26 (UTC) |
commit | 2a5950df692f8a2c9d51a2a3e0c4d41fe0d3e7c9 (patch) (unidiff) | |
tree | 9c8a49a1bd96177abdc9cd13435b66a3aea783e2 /src/eyetil.cc | |
parent | d6545bd95153a5e41cdae441643f4e4a0af94a49 (diff) | |
download | iii-2a5950df692f8a2c9d51a2a3e0c4d41fe0d3e7c9.zip iii-2a5950df692f8a2c9d51a2a3e0c4d41fe0d3e7c9.tar.gz iii-2a5950df692f8a2c9d51a2a3e0c4d41fe0d3e7c9.tar.bz2 |
stream mime attachments directly to disk
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | src/eyetil.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/eyetil.cc b/src/eyetil.cc index fba8724..5bceec7 100644 --- a/src/eyetil.cc +++ b/src/eyetil.cc | |||
@@ -107,97 +107,97 @@ void integrity_digester::update(const void *d_,size_t s) { | |||
107 | md5.updater<uint16_t>(),block512_t::tcpcksum); | 107 | md5.updater<uint16_t>(),block512_t::tcpcksum); |
108 | size_t ss=bb*sizeof(block512_t); | 108 | size_t ss=bb*sizeof(block512_t); |
109 | d+=ss; s-=ss; | 109 | d+=ss; s-=ss; |
110 | assert(s<sizeof(block512_t)); | 110 | assert(s<sizeof(block512_t)); |
111 | if(s) memmove(data.dptr(0),d,data_size=s); | 111 | if(s) memmove(data.dptr(0),d,data_size=s); |
112 | } | 112 | } |
113 | 113 | ||
114 | binary_t integrity_digester::final(const std::string& ukey) { | 114 | binary_t integrity_digester::final(const std::string& ukey) { |
115 | assert(!data_size); | 115 | assert(!data_size); |
116 | md5.update( binary_t(ukey) ); | 116 | md5.update( binary_t(ukey) ); |
117 | return md5.final(); | 117 | return md5.final(); |
118 | } | 118 | } |
119 | 119 | ||
120 | static void make_path_for_template(const std::string& p,mode_t m) { | 120 | static void make_path_for_template(const std::string& p,mode_t m) { |
121 | struct stat st; | 121 | struct stat st; |
122 | std::string pp; | 122 | std::string pp; |
123 | for(std::string::size_type sl=p.find('/',1); | 123 | for(std::string::size_type sl=p.find('/',1); |
124 | sl!=std::string::npos; | 124 | sl!=std::string::npos; |
125 | sl=p.find('/',sl+1)) { | 125 | sl=p.find('/',sl+1)) { |
126 | if(stat( (pp=p.substr(0,sl)).c_str() ,&st) | 126 | if(stat( (pp=p.substr(0,sl)).c_str() ,&st) |
127 | || !S_ISDIR(st.st_mode)) { | 127 | || !S_ISDIR(st.st_mode)) { |
128 | if(mkdir(pp.c_str(),m)) | 128 | if(mkdir(pp.c_str(),m)) |
129 | throw std::runtime_error("failed to mkdir()"); | 129 | throw std::runtime_error("failed to mkdir()"); |
130 | } | 130 | } |
131 | } | 131 | } |
132 | } | 132 | } |
133 | 133 | ||
134 | tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) { | 134 | tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) { |
135 | make_path_for_template(dt,0777); | 135 | make_path_for_template(dt,0777); |
136 | if(!mkdtemp((char*)dir.data())) | 136 | if(!mkdtemp((char*)dir.data())) |
137 | throw std::runtime_error("failed to mkdtmp()"); | 137 | throw std::runtime_error("failed to mkdtmp()"); |
138 | } | 138 | } |
139 | tmpdir_t::~tmpdir_t() { | 139 | tmpdir_t::~tmpdir_t() { |
140 | assert(!dir.empty()); | 140 | assert(!dir.empty()); |
141 | if(rmdir(dir.c_str())) { | 141 | if(rmdir(dir.c_str())) { |
142 | syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str()); | 142 | syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str()); |
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | std::string tmpdir_t::get_file(const std::string& f) { | 146 | std::string tmpdir_t::get_file(const std::string& f) { |
147 | std::string::size_type ls = f.rfind('/'); | 147 | std::string::size_type ls = f.rfind('/'); |
148 | return dir+'/'+( | 148 | return dir+'/'+( |
149 | (ls==std::string::npos) | 149 | (ls==std::string::npos) |
150 | ? f | 150 | ? f |
151 | : f.substr(ls+1) | 151 | : f.substr(ls+1) |
152 | ); | 152 | ); |
153 | } | 153 | } |
154 | 154 | ||
155 | tarchive_t::tarchive_t(void *p,size_t s) : a(archive_read_new()), e(0) { | 155 | tarchive_t::tarchive_t(const char *fn) : a(archive_read_new()), e(0) { |
156 | if(!a) throw std::runtime_error("failed to archive_read_new()"); | 156 | if(!a) throw std::runtime_error("failed to archive_read_new()"); |
157 | if(archive_read_support_format_tar(a)) { | 157 | if(archive_read_support_format_tar(a)) { |
158 | archive_read_finish(a); | 158 | archive_read_finish(a); |
159 | throw std::runtime_error("failed to archive_read_support_format_tar()"); | 159 | throw std::runtime_error("failed to archive_read_support_format_tar()"); |
160 | } | 160 | } |
161 | if(archive_read_open_memory(a,p,s)) { | 161 | if(archive_read_open_filename(a,fn,16384)) { |
162 | archive_read_finish(a); | 162 | archive_read_finish(a); |
163 | throw std::runtime_error("failed to archive_read_open_memory()"); | 163 | throw std::runtime_error("failed to archive_read_open_memory()"); |
164 | } | 164 | } |
165 | } | 165 | } |
166 | tarchive_t::~tarchive_t() { | 166 | tarchive_t::~tarchive_t() { |
167 | assert(a); | 167 | assert(a); |
168 | archive_read_finish(a); | 168 | archive_read_finish(a); |
169 | } | 169 | } |
170 | 170 | ||
171 | bool tarchive_t::read_next_header() { | 171 | bool tarchive_t::read_next_header() { |
172 | assert(a); | 172 | assert(a); |
173 | return archive_read_next_header(a,&e)==ARCHIVE_OK; | 173 | return archive_read_next_header(a,&e)==ARCHIVE_OK; |
174 | } | 174 | } |
175 | 175 | ||
176 | std::string tarchive_t::entry_pathname() { | 176 | std::string tarchive_t::entry_pathname() { |
177 | assert(a); assert(e); | 177 | assert(a); assert(e); |
178 | return archive_entry_pathname(e); | 178 | return archive_entry_pathname(e); |
179 | } | 179 | } |
180 | 180 | ||
181 | bool tarchive_t::read_data_into_fd(int fd) { | 181 | bool tarchive_t::read_data_into_fd(int fd) { |
182 | assert(a); | 182 | assert(a); |
183 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; | 183 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; |
184 | } | 184 | } |
185 | 185 | ||
186 | 186 | ||
187 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { | 187 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { |
188 | md5_digester rv; | 188 | md5_digester rv; |
189 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), | 189 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), |
190 | rv.updater<uint16_t>(), block512_t::tcpcksum ); | 190 | rv.updater<uint16_t>(), block512_t::tcpcksum ); |
191 | rv.update( binary_t(ukey) ); | 191 | rv.update( binary_t(ukey) ); |
192 | return rv.final(); | 192 | return rv.final(); |
193 | } | 193 | } |
194 | 194 | ||
195 | mimewrite_tarfile::mimewrite_tarfile(tmpdir_t& d) { | 195 | mimewrite_tarfile::mimewrite_tarfile(tmpdir_t& d) { |
196 | f.open((fn=d.get_file("the-tarfile.tar")).c_str(),std::ios_base::in|std::ios_base::out|std::ios_base::trunc|std::ios_base::binary); | 196 | f.open((fn=d.get_file("the-tarfile.tar")).c_str(),std::ios_base::in|std::ios_base::out|std::ios_base::trunc|std::ios_base::binary); |
197 | } | 197 | } |
198 | mimewrite_tarfile::~mimewrite_tarfile() { | 198 | mimewrite_tarfile::~mimewrite_tarfile() { |
199 | unlink(fn.c_str()); | 199 | unlink(fn.c_str()); |
200 | } | 200 | } |
201 | int mimewrite_tarfile::write(const char *buf,size_t len) { | 201 | int mimewrite_tarfile::write(const char *buf,size_t len) { |
202 | return f.write(buf,len) ? (idigest.update(buf,len),SOAP_OK) : SOAP_ERR; | 202 | return f.write(buf,len) ? (idigest.update(buf,len),SOAP_OK) : SOAP_ERR; |
203 | } | 203 | } |