summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2012-07-15 19:16:29 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2012-07-15 19:16:29 -0500
commit124c87bfad3c10265307d3155d7441648224d031 (patch)
tree07cc66d62903b67e3853d69461bf0077b5cae5fe /lib
parent85a646ac4162926c13f0cec836e8d55d5c4ec4d3 (diff)
downloadulab-124c87bfad3c10265307d3155d7441648224d031.tar.gz
ulab-124c87bfad3c10265307d3155d7441648224d031.zip
Add write buffer to krb client and server sockets
Diffstat (limited to 'lib')
-rw-r--r--lib/libtdekrb/src/tdekrbclientsocket.cpp44
-rw-r--r--lib/libtdekrb/src/tdekrbclientsocket.h5
-rw-r--r--lib/libtdekrb/src/tdekrbserversocket.cpp48
-rw-r--r--lib/libtdekrb/src/tdekrbserversocket.h5
4 files changed, 86 insertions, 16 deletions
diff --git a/lib/libtdekrb/src/tdekrbclientsocket.cpp b/lib/libtdekrb/src/tdekrbclientsocket.cpp
index 33466cf..2ada832 100644
--- a/lib/libtdekrb/src/tdekrbclientsocket.cpp
+++ b/lib/libtdekrb/src/tdekrbclientsocket.cpp
@@ -99,11 +99,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority,
return SASL_OK;
}
-TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) {
+TDEKerberosClientSocket::TDEKerberosClientSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_writeBufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) {
saslData = new SASLDataPrivate;
saslData->m_krbConnection = NULL;
m_readBuffer = new TQBuffer();
m_readBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBuffer = new TQBuffer();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
}
TDEKerberosClientSocket::~TDEKerberosClientSocket() {
@@ -116,7 +118,9 @@ TDEKerberosClientSocket::~TDEKerberosClientSocket() {
kerberosInitLoopTimer = NULL;
}
setUsingKerberos(false);
+ m_writeBuffer->close();
m_readBuffer->close();
+ delete m_writeBuffer;
delete m_readBuffer;
delete saslData;
}
@@ -139,10 +143,11 @@ void TDEKerberosClientSocket::close() {
setStatusMessage(i18n("Disconnected"));
}
-void TDEKerberosClientSocket::flush() {
+void TDEKerberosClientSocket::flush(int hidebasehack) {
+ Q_UNUSED(hidebasehack);
+
if (kerberosStatus() == KerberosInUse) {
- // FIXME
- // If a write buffer is implemented, it will need to be flushed before the following call is made
+ writeBufferedData();
TQSocket::flush();
}
else {
@@ -389,7 +394,13 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) {
TQ_LONG ret;
if (kerberosStatus() == KerberosInUse) {
- ret = transmitEncryptedData(data, len);
+ int wrlen;
+ m_writeBuffer->at(m_writeBufferLength);
+ wrlen = m_writeBuffer->writeBlock(data, len);
+ if (wrlen > 0) {
+ m_writeBufferLength = m_writeBufferLength + wrlen;
+ }
+ ret = wrlen;
}
else {
ret = TQSocket::writeBlock(data, len);
@@ -398,6 +409,20 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) {
return ret;
}
+void TDEKerberosClientSocket::writeBufferedData() {
+ if (kerberosStatus() == KerberosInUse) {
+ if (m_writeBufferLength > 0) {
+ if (transmitEncryptedData(m_writeBuffer->buffer().data(), m_writeBufferLength) < 0) {
+ printf("[WARNING] Attempt to transmit buffered data resulted in a short write\n\r"); fflush(stdout);
+ }
+ // Clear the buffer from memory
+ m_writeBuffer->close();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBufferLength = 0;
+ }
+ }
+}
+
TQ_LONG TDEKerberosClientSocket::readLine(char *data, TQ_ULONG maxlen) {
TQ_LONG ret;
@@ -709,9 +734,12 @@ void TDEKerberosClientSocket::clearIncomingData() {
}
int TDEKerberosClientSocket::writeEndOfFrame() {
+ int ret;
char data[1];
data[0] = 255;
- return writeBlock(data, 1);
+ ret = writeBlock(data, 1);
+ writeBufferedData();
+ return ret;
}
bool TDEKerberosClientSocket::canReadFrame() {
@@ -955,7 +983,11 @@ int TDEKerberosClientSocket::initializeKerberosInterface() {
// Clear the buffer from memory
m_readBuffer->close();
m_readBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_readBufferLength = 0;
m_readBufferReadPointer = 0;
+ m_writeBuffer->close();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBufferLength = 0;
// Initialize default data structures
memset(&secprops, 0L, sizeof(secprops));
diff --git a/lib/libtdekrb/src/tdekrbclientsocket.h b/lib/libtdekrb/src/tdekrbclientsocket.h
index 0722d88..85b6688 100644
--- a/lib/libtdekrb/src/tdekrbclientsocket.h
+++ b/lib/libtdekrb/src/tdekrbclientsocket.h
@@ -46,7 +46,7 @@ class TDEKerberosClientSocket : public TQSocket
bool open(int mode);
void close();
- void flush();
+ void flush(int hidebasehack=0);
Offset size() const;
Offset at() const;
bool at(Offset off, int hidebasehack=0);
@@ -76,6 +76,7 @@ class TDEKerberosClientSocket : public TQSocket
int writeEndOfFrame();
bool canReadFrame();
void clearFrameTail();
+ void writeBufferedData();
public slots:
int processPendingData();
@@ -104,6 +105,8 @@ class TDEKerberosClientSocket : public TQSocket
TQBuffer* m_readBuffer;
long m_readBufferLength;
long m_readBufferReadPointer;
+ TQBuffer* m_writeBuffer;
+ long m_writeBufferLength;
bool m_krbInitRunning;
int m_krbInitState;
TQString m_prevStatusMessage;
diff --git a/lib/libtdekrb/src/tdekrbserversocket.cpp b/lib/libtdekrb/src/tdekrbserversocket.cpp
index 63a8597..c309da5 100644
--- a/lib/libtdekrb/src/tdekrbserversocket.cpp
+++ b/lib/libtdekrb/src/tdekrbserversocket.cpp
@@ -100,11 +100,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority,
return SASL_OK;
}
-TDEKerberosServerSocket::TDEKerberosServerSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) {
+TDEKerberosServerSocket::TDEKerberosServerSocket(TQObject *parent, const char *name) : TQSocket(parent, name), m_kerberosRequested(false), m_criticalSection(0), m_readBufferLength(0), m_readBufferReadPointer(0), m_writeBufferLength(0), m_krbInitRunning(false), m_krbInitState(-1), m_dataTimeout(-1), kerberosInitLoopTimer(NULL), m_canary(NULL), m_negotiatedMaxBufferSize(NET_SEC_BUF_SIZE) {
saslData = new SASLDataPrivate;
saslData->m_krbConnection = NULL;
m_readBuffer = new TQBuffer();
m_readBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBuffer = new TQBuffer();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
}
TDEKerberosServerSocket::~TDEKerberosServerSocket() {
@@ -117,7 +119,9 @@ TDEKerberosServerSocket::~TDEKerberosServerSocket() {
kerberosInitLoopTimer = NULL;
}
setUsingKerberos(false);
+ m_writeBuffer->close();
m_readBuffer->close();
+ delete m_writeBuffer;
delete m_readBuffer;
delete saslData;
}
@@ -140,10 +144,11 @@ void TDEKerberosServerSocket::close() {
setStatusMessage(i18n("Socket closed"));
}
-void TDEKerberosServerSocket::flush() {
- if (m_kerberosRequested) {
- // FIXME
- // If a write buffer is implemented, it will need to be flushed before the following call is made
+void TDEKerberosServerSocket::flush(int hidebasehack) {
+ Q_UNUSED(hidebasehack);
+
+ if (kerberosStatus() == KerberosInUse) {
+ writeBufferedData();
TQSocket::flush();
}
else {
@@ -397,8 +402,14 @@ TQ_LONG TDEKerberosServerSocket::readBlock(char *data, TQ_ULONG maxlen) {
TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) {
TQ_LONG ret;
- if (m_kerberosRequested) {
- ret = transmitEncryptedData(data, len);
+ if (kerberosStatus() == KerberosInUse) {
+ int wrlen;
+ m_writeBuffer->at(m_writeBufferLength);
+ wrlen = m_writeBuffer->writeBlock(data, len);
+ if (wrlen > 0) {
+ m_writeBufferLength = m_writeBufferLength + wrlen;
+ }
+ ret = wrlen;
}
else {
ret = TQSocket::writeBlock(data, len);
@@ -407,6 +418,20 @@ TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) {
return ret;
}
+void TDEKerberosServerSocket::writeBufferedData() {
+ if (kerberosStatus() == KerberosInUse) {
+ if (m_writeBufferLength > 0) {
+ if (transmitEncryptedData(m_writeBuffer->buffer().data(), m_writeBufferLength) < 0) {
+ printf("[WARNING] Attempt to transmit buffered data resulted in a short write\n\r"); fflush(stdout);
+ }
+ // Clear the buffer from memory
+ m_writeBuffer->close();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBufferLength = 0;
+ }
+ }
+}
+
TQ_LONG TDEKerberosServerSocket::readLine(char *data, TQ_ULONG maxlen) {
TQ_LONG ret;
@@ -718,9 +743,12 @@ void TDEKerberosServerSocket::clearIncomingData() {
}
int TDEKerberosServerSocket::writeEndOfFrame() {
+ int ret;
char data[1];
data[0] = 255;
- return writeBlock(data, 1);
+ ret = writeBlock(data, 1);
+ writeBufferedData();
+ return ret;
}
bool TDEKerberosServerSocket::canReadFrame() {
@@ -976,7 +1004,11 @@ int TDEKerberosServerSocket::initializeKerberosInterface() {
// Clear the buffer from memory
m_readBuffer->close();
m_readBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_readBufferLength = 0;
m_readBufferReadPointer = 0;
+ m_writeBuffer->close();
+ m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
+ m_writeBufferLength = 0;
// Initialize default data structures
memset(&secprops, 0L, sizeof(secprops));
diff --git a/lib/libtdekrb/src/tdekrbserversocket.h b/lib/libtdekrb/src/tdekrbserversocket.h
index 92fe473..f501f09 100644
--- a/lib/libtdekrb/src/tdekrbserversocket.h
+++ b/lib/libtdekrb/src/tdekrbserversocket.h
@@ -46,7 +46,7 @@ class TDEKerberosServerSocket : public TQSocket
bool open(int mode);
void close();
- void flush();
+ void flush(int hidebasehack=0);
Offset size() const;
Offset at() const;
bool at(Offset off, int hidebasehack=0);
@@ -76,6 +76,7 @@ class TDEKerberosServerSocket : public TQSocket
int writeEndOfFrame();
bool canReadFrame();
void clearFrameTail();
+ void writeBufferedData();
public slots:
int processPendingData();
@@ -108,6 +109,8 @@ class TDEKerberosServerSocket : public TQSocket
TQBuffer* m_readBuffer;
long m_readBufferLength;
long m_readBufferReadPointer;
+ TQBuffer* m_writeBuffer;
+ long m_writeBufferLength;
bool m_krbInitRunning;
int m_krbInitState;
TQString m_prevStatusMessage;