summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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
-rw-r--r--servers/auth_server_lin/src/auth_conn.cpp2
-rw-r--r--servers/fpga_server_lin/src/fpga_conn.cpp1
6 files changed, 89 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;
diff --git a/servers/auth_server_lin/src/auth_conn.cpp b/servers/auth_server_lin/src/auth_conn.cpp
index f2549d3..c9a377f 100644
--- a/servers/auth_server_lin/src/auth_conn.cpp
+++ b/servers/auth_server_lin/src/auth_conn.cpp
@@ -280,11 +280,13 @@ int AuthSocket::servLoop() {
if (canReadData()) {
reclen = readBlock(m_loopBuffer.data(), m_loopBuffer.size());
m_servClientSocket->writeBlock(m_loopBuffer.data(), reclen);
+ m_servClientSocket->flush();
transferred_data = true;
}
if (m_servClientSocket->canReadData()) {
reclen = m_servClientSocket->readBlock(m_loopBuffer.data(), m_loopBuffer.size());
writeBlock(m_loopBuffer.data(), reclen);
+ flush();
transferred_data = true;
}
}
diff --git a/servers/fpga_server_lin/src/fpga_conn.cpp b/servers/fpga_server_lin/src/fpga_conn.cpp
index fd1bdfa..2fc2537 100644
--- a/servers/fpga_server_lin/src/fpga_conn.cpp
+++ b/servers/fpga_server_lin/src/fpga_conn.cpp
@@ -205,6 +205,7 @@ void FPGASocket::commandLoop() {
cc = read(m_fd_tty, buffer, 10000);
if (cc > 0) {
writeBlock(buffer, cc);
+ flush();
transferred_data = true;
printf("[DEBUG] Got %d bytes from the serial port\n\r", cc); fflush(stdout);
}