Botan  2.7.0
Crypto and TLS for C++11
fd_unix.cpp
Go to the documentation of this file.
1 /*
2 * Pipe I/O for Unix
3 * (C) 1999-2007 Jack Lloyd
4 *
5 * Botan is released under the Simplified BSD License (see license.txt)
6 */
7 
8 #include <botan/pipe.h>
9 #include <botan/exceptn.h>
10 #include <unistd.h>
11 
12 namespace Botan {
13 
14 /*
15 * Write data from a pipe into a Unix fd
16 */
17 int operator<<(int fd, Pipe& pipe)
18  {
19  secure_vector<uint8_t> buffer(BOTAN_DEFAULT_BUFFER_SIZE);
20  while(pipe.remaining())
21  {
22  size_t got = pipe.read(buffer.data(), buffer.size());
23  size_t position = 0;
24  while(got)
25  {
26  ssize_t ret = ::write(fd, &buffer[position], got);
27  if(ret < 0)
28  throw Stream_IO_Error("Pipe output operator (unixfd) has failed");
29 
30  position += static_cast<size_t>(ret);
31  got -= static_cast<size_t>(ret);
32  }
33  }
34  return fd;
35  }
36 
37 /*
38 * Read data from a Unix fd into a pipe
39 */
40 int operator>>(int fd, Pipe& pipe)
41  {
42  secure_vector<uint8_t> buffer(BOTAN_DEFAULT_BUFFER_SIZE);
43  while(true)
44  {
45  ssize_t ret = ::read(fd, buffer.data(), buffer.size());
46  if(ret < 0)
47  throw Stream_IO_Error("Pipe input operator (unixfd) has failed");
48  else if(ret == 0)
49  break;
50  pipe.write(buffer.data(), static_cast<size_t>(ret));
51  }
52  return fd;
53  }
54 
55 }
int operator<<(int fd, Pipe &pipe)
Definition: fd_unix.cpp:17
size_t remaining(message_id msg=DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:131
size_t read(uint8_t output[], size_t length) override BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:82
Definition: alg_id.cpp:13
int operator>>(int fd, Pipe &pipe)
Definition: fd_unix.cpp:40
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:88
void write(const uint8_t in[], size_t length)
Definition: pipe_rw.cpp:35