1 /***************************************************************************
2 insocketstream.hxx - C++ streambuffer wrapper
4 begin : Sun Nov 10 2002
5 copyright : (C) 2002 by Intra2net AG
6 email : intranator@intra2net.com
7 ***************************************************************************/
9 #ifndef _INSOCKETSTREAM
10 #define _INSOCKETSTREAM
18 #include <sys/socket.h>
22 #include "exception.hxx"
24 // ATTENTION: A lot of mysterious STL bugs occured
25 // with a "real" buffer (buffer larger than 1 byte and up to 100 bytes)
26 // -> Keep it slow and working!
28 class insocketstream : public std::streambuf
35 insocketstream(std::string unixsocket)
37 sock=socket(AF_UNIX,SOCK_STREAM,0);
40 std::ostringstream os;
41 os << "can't open socket: " << strerror(errno);
42 throw EXCEPTION (insocketstream_error, os.str());
45 struct sockaddr_un server_adr;
46 server_adr.sun_family=AF_UNIX;
47 strncpy(server_adr.sun_path,unixsocket.c_str(),sizeof(server_adr.sun_path));
48 server_adr.sun_path[sizeof(server_adr.sun_path)]=0;
50 if(connect(sock,(struct sockaddr *) &server_adr, sizeof(server_adr)))
52 std::ostringstream os;
53 os << "can't connect to socket: " << strerror(errno);
54 throw EXCEPTION (insocketstream_error, os.str());
57 setg (&buffer, &buffer, &buffer); // force underflow
64 shutdown(sock,SHUT_RDWR);
72 virtual int_type underflow()
75 return std::streambuf::traits_type::to_int_type(*gptr());
77 int nbytes=::read(sock,&buffer,1);
82 return std::streambuf::traits_type::to_int_type(*gptr());
85 std::ostringstream os;
86 os << "error reading form socket: " << strerror(errno);
87 throw EXCEPTION (insocketstream_error, os.str());
93 setg (&buffer, &buffer, &buffer+sizeof(char));
94 return std::streambuf::traits_type::to_int_type(*gptr());