Botan 2.19.2
Crypto and TLS for C&
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
12namespace Botan {
13
14/*
15* Write data from a pipe into a Unix fd
16*/
17int 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*/
40int 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}
size_t read(uint8_t output[], size_t length) override BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:82
void write(const uint8_t in[], size_t length)
Definition: pipe_rw.cpp:35
size_t remaining(message_id msg=DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:131
Definition: alg_id.cpp:13
int operator>>(int fd, Pipe &pipe)
Definition: fd_unix.cpp:40
int operator<<(int fd, Pipe &pipe)
Definition: fd_unix.cpp:17
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65