1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
/*
* radiusplugin -- An OpenVPN plugin for do radius authentication
* and accounting.
*
* Copyright (C) 2005 EWE TEL GmbH/Ralf Luebben <ralfluebben@gmx.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "IpcSocket.h"
/** The constructor sets the socket to -1.*/
IpcSocket::IpcSocket()
{
this->socket=-1;
}
/** The constructor sets the socket number.
* @param int : The socket number.
*/
IpcSocket::IpcSocket(int s)
{
this->socket=s;
}
/** The destructor closes the socket
* if it is not equal -1.
*/
IpcSocket::~IpcSocket()
{
if (socket != -1)
{
close (this->socket);
}
this->socket=-1;
}
/** The method sets the socket to s.
* @param s The socket number.
*/
void IpcSocket::setSocket(int s)
{
this->socket=s;
}
/**The method returns the socket number
* @return The socket number.
*/
int IpcSocket::getSocket(void)
{
return this->socket;
}
/**The method sends a string via the
* socket. First the length of the string is sent
* and then the string itself.
* @param str The string to send.
* @throws Exception::SOCKETSEND if the length or the string could not send
* correctly.
*/
void IpcSocket::send(string str)
{
ssize_t len = str.size();
ssize_t size=0;
//send the length of the string
size = write(this->socket, &len, sizeof(ssize_t));
if (size != sizeof(ssize_t))
{
throw Exception(Exception::SOCKETSEND);
}
if(len > 0)
{
//send the string
size = write(this->socket, str.c_str(), len);
if (size != len)
{
throw Exception(Exception::SOCKETSEND);
}
}
}
/**The method sends a buffer via the
* socket. First the length of the buffer is sent
* and then the buffer itself.
* @param value The buffer to send.
* @throws Exception::SOCKETSEND if the length or the buffer could not send
* correctly.
*/
void IpcSocket::send(Octet * value, ssize_t len)
{
ssize_t size=0;
//send the length of the string
size = write (this->socket, &len, sizeof(ssize_t));
if (size != sizeof(ssize_t))
{
throw Exception(Exception::SOCKETSEND);
}
if (len > 0)
{
//send the buffer
size = write (this->socket, value, len);
if (size != len)
{
throw Exception(Exception::SOCKETSEND);
}
}
}
/**The method sends an integer via
* the socket.
* @param int : The integer to send.
* @throws Exception::SOCKETSEND if the size of the
* integer and the sent size are not equal.
*/
void IpcSocket::send(int num)
{
const ssize_t size = write (this->socket, &num, sizeof(int));
if (size != sizeof(int))
{
throw Exception(Exception::SOCKETSEND);
}
}
/**The method receives an integer from the socket.
* @return The received integer.
* @throws Exception::SOCKETRECV If the received size
* is not the size of an integer.
*/
int IpcSocket::recvInt(void)
{
int num;
ssize_t size;
size = read(this->socket, &num, sizeof(int));
if (size != sizeof(int))
{
throw Exception(Exception::SOCKETRECV);
}
return num;
}
/**The method receives a string from the socket.
* First it receives the length, then
* creates a buffer with the length and writes
* the bytes from the socket into the buffer.
* The buffer is copied in a string and the string is returned.
* @return string : A string with the received value.
* @throws Exception::SOCKETRECV If the received length
* of the integer for the length or the length of the received string is wrong.
*/
string IpcSocket::recvStr(void)
{
ssize_t len;
char * buffer;
ssize_t size;
string str;
size = read(this->socket,&len,sizeof(ssize_t));
if (size!=sizeof(ssize_t))
{
throw Exception(Exception::SOCKETRECV);
}
if(len > 0)
{
buffer=new char[len+1];
memset (buffer, 0, len+1);
size = read (this->socket, buffer, len);
if (size!=len)
{
throw Exception(Exception::SOCKETRECV);
}
str=buffer;
delete [] buffer;
}
return str;
}
/**The method receives a buffer from the socket.
* First it receives the length, then
* creates a buffer with the length and writes
* the bytes from the socket into the buffer.
* @return unsigned int : Length of the buffer.
* @throws Exception::SOCKETRECV If the received length
* of the integer for the length or the length of the received buffer is wrong.
*/
void IpcSocket::recvBuf(User * user)
{
ssize_t len;
ssize_t size;
size = read (this->socket,&len,sizeof(ssize_t));
if (size!=sizeof(ssize_t))
{
throw Exception(Exception::SOCKETRECV);
}
user->setVsaBufLen(len);
if (len > 0)
{
user->setVsaBuf(new Octet[len]);
size = read (this->socket, user->getVsaBuf(), len);
if (size != len)
{
throw Exception(Exception::SOCKETRECV);
}
}
}
|