Add write buffer to krb client and server sockets

master
Timothy Pearson 12 years ago
parent 85a646ac41
commit 124c87bfad

@ -99,11 +99,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority,
return SASL_OK; 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 = new SASLDataPrivate;
saslData->m_krbConnection = NULL; saslData->m_krbConnection = NULL;
m_readBuffer = new TQBuffer(); m_readBuffer = new TQBuffer();
m_readBuffer->open(IO_ReadWrite|IO_Truncate); m_readBuffer->open(IO_ReadWrite|IO_Truncate);
m_writeBuffer = new TQBuffer();
m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
} }
TDEKerberosClientSocket::~TDEKerberosClientSocket() { TDEKerberosClientSocket::~TDEKerberosClientSocket() {
@ -116,7 +118,9 @@ TDEKerberosClientSocket::~TDEKerberosClientSocket() {
kerberosInitLoopTimer = NULL; kerberosInitLoopTimer = NULL;
} }
setUsingKerberos(false); setUsingKerberos(false);
m_writeBuffer->close();
m_readBuffer->close(); m_readBuffer->close();
delete m_writeBuffer;
delete m_readBuffer; delete m_readBuffer;
delete saslData; delete saslData;
} }
@ -139,10 +143,11 @@ void TDEKerberosClientSocket::close() {
setStatusMessage(i18n("Disconnected")); setStatusMessage(i18n("Disconnected"));
} }
void TDEKerberosClientSocket::flush() { void TDEKerberosClientSocket::flush(int hidebasehack) {
Q_UNUSED(hidebasehack);
if (kerberosStatus() == KerberosInUse) { if (kerberosStatus() == KerberosInUse) {
// FIXME writeBufferedData();
// If a write buffer is implemented, it will need to be flushed before the following call is made
TQSocket::flush(); TQSocket::flush();
} }
else { else {
@ -389,7 +394,13 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) {
TQ_LONG ret; TQ_LONG ret;
if (kerberosStatus() == KerberosInUse) { 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 { else {
ret = TQSocket::writeBlock(data, len); ret = TQSocket::writeBlock(data, len);
@ -398,6 +409,20 @@ TQ_LONG TDEKerberosClientSocket::writeBlock(const char *data, TQ_ULONG len) {
return ret; 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 TDEKerberosClientSocket::readLine(char *data, TQ_ULONG maxlen) {
TQ_LONG ret; TQ_LONG ret;
@ -709,9 +734,12 @@ void TDEKerberosClientSocket::clearIncomingData() {
} }
int TDEKerberosClientSocket::writeEndOfFrame() { int TDEKerberosClientSocket::writeEndOfFrame() {
int ret;
char data[1]; char data[1];
data[0] = 255; data[0] = 255;
return writeBlock(data, 1); ret = writeBlock(data, 1);
writeBufferedData();
return ret;
} }
bool TDEKerberosClientSocket::canReadFrame() { bool TDEKerberosClientSocket::canReadFrame() {
@ -955,7 +983,11 @@ int TDEKerberosClientSocket::initializeKerberosInterface() {
// Clear the buffer from memory // Clear the buffer from memory
m_readBuffer->close(); m_readBuffer->close();
m_readBuffer->open(IO_ReadWrite|IO_Truncate); m_readBuffer->open(IO_ReadWrite|IO_Truncate);
m_readBufferLength = 0;
m_readBufferReadPointer = 0; m_readBufferReadPointer = 0;
m_writeBuffer->close();
m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
m_writeBufferLength = 0;
// Initialize default data structures // Initialize default data structures
memset(&secprops, 0L, sizeof(secprops)); memset(&secprops, 0L, sizeof(secprops));

@ -46,7 +46,7 @@ class TDEKerberosClientSocket : public TQSocket
bool open(int mode); bool open(int mode);
void close(); void close();
void flush(); void flush(int hidebasehack=0);
Offset size() const; Offset size() const;
Offset at() const; Offset at() const;
bool at(Offset off, int hidebasehack=0); bool at(Offset off, int hidebasehack=0);
@ -76,6 +76,7 @@ class TDEKerberosClientSocket : public TQSocket
int writeEndOfFrame(); int writeEndOfFrame();
bool canReadFrame(); bool canReadFrame();
void clearFrameTail(); void clearFrameTail();
void writeBufferedData();
public slots: public slots:
int processPendingData(); int processPendingData();
@ -104,6 +105,8 @@ class TDEKerberosClientSocket : public TQSocket
TQBuffer* m_readBuffer; TQBuffer* m_readBuffer;
long m_readBufferLength; long m_readBufferLength;
long m_readBufferReadPointer; long m_readBufferReadPointer;
TQBuffer* m_writeBuffer;
long m_writeBufferLength;
bool m_krbInitRunning; bool m_krbInitRunning;
int m_krbInitState; int m_krbInitState;
TQString m_prevStatusMessage; TQString m_prevStatusMessage;

@ -100,11 +100,13 @@ static int logSASLMessages(void *context __attribute__((unused)), int priority,
return SASL_OK; 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 = new SASLDataPrivate;
saslData->m_krbConnection = NULL; saslData->m_krbConnection = NULL;
m_readBuffer = new TQBuffer(); m_readBuffer = new TQBuffer();
m_readBuffer->open(IO_ReadWrite|IO_Truncate); m_readBuffer->open(IO_ReadWrite|IO_Truncate);
m_writeBuffer = new TQBuffer();
m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
} }
TDEKerberosServerSocket::~TDEKerberosServerSocket() { TDEKerberosServerSocket::~TDEKerberosServerSocket() {
@ -117,7 +119,9 @@ TDEKerberosServerSocket::~TDEKerberosServerSocket() {
kerberosInitLoopTimer = NULL; kerberosInitLoopTimer = NULL;
} }
setUsingKerberos(false); setUsingKerberos(false);
m_writeBuffer->close();
m_readBuffer->close(); m_readBuffer->close();
delete m_writeBuffer;
delete m_readBuffer; delete m_readBuffer;
delete saslData; delete saslData;
} }
@ -140,10 +144,11 @@ void TDEKerberosServerSocket::close() {
setStatusMessage(i18n("Socket closed")); setStatusMessage(i18n("Socket closed"));
} }
void TDEKerberosServerSocket::flush() { void TDEKerberosServerSocket::flush(int hidebasehack) {
if (m_kerberosRequested) { Q_UNUSED(hidebasehack);
// FIXME
// If a write buffer is implemented, it will need to be flushed before the following call is made if (kerberosStatus() == KerberosInUse) {
writeBufferedData();
TQSocket::flush(); TQSocket::flush();
} }
else { 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 TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) {
TQ_LONG ret; TQ_LONG ret;
if (m_kerberosRequested) { 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 { else {
ret = TQSocket::writeBlock(data, len); ret = TQSocket::writeBlock(data, len);
@ -407,6 +418,20 @@ TQ_LONG TDEKerberosServerSocket::writeBlock(const char *data, TQ_ULONG len) {
return ret; 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 TDEKerberosServerSocket::readLine(char *data, TQ_ULONG maxlen) {
TQ_LONG ret; TQ_LONG ret;
@ -718,9 +743,12 @@ void TDEKerberosServerSocket::clearIncomingData() {
} }
int TDEKerberosServerSocket::writeEndOfFrame() { int TDEKerberosServerSocket::writeEndOfFrame() {
int ret;
char data[1]; char data[1];
data[0] = 255; data[0] = 255;
return writeBlock(data, 1); ret = writeBlock(data, 1);
writeBufferedData();
return ret;
} }
bool TDEKerberosServerSocket::canReadFrame() { bool TDEKerberosServerSocket::canReadFrame() {
@ -976,7 +1004,11 @@ int TDEKerberosServerSocket::initializeKerberosInterface() {
// Clear the buffer from memory // Clear the buffer from memory
m_readBuffer->close(); m_readBuffer->close();
m_readBuffer->open(IO_ReadWrite|IO_Truncate); m_readBuffer->open(IO_ReadWrite|IO_Truncate);
m_readBufferLength = 0;
m_readBufferReadPointer = 0; m_readBufferReadPointer = 0;
m_writeBuffer->close();
m_writeBuffer->open(IO_ReadWrite|IO_Truncate);
m_writeBufferLength = 0;
// Initialize default data structures // Initialize default data structures
memset(&secprops, 0L, sizeof(secprops)); memset(&secprops, 0L, sizeof(secprops));

@ -46,7 +46,7 @@ class TDEKerberosServerSocket : public TQSocket
bool open(int mode); bool open(int mode);
void close(); void close();
void flush(); void flush(int hidebasehack=0);
Offset size() const; Offset size() const;
Offset at() const; Offset at() const;
bool at(Offset off, int hidebasehack=0); bool at(Offset off, int hidebasehack=0);
@ -76,6 +76,7 @@ class TDEKerberosServerSocket : public TQSocket
int writeEndOfFrame(); int writeEndOfFrame();
bool canReadFrame(); bool canReadFrame();
void clearFrameTail(); void clearFrameTail();
void writeBufferedData();
public slots: public slots:
int processPendingData(); int processPendingData();
@ -108,6 +109,8 @@ class TDEKerberosServerSocket : public TQSocket
TQBuffer* m_readBuffer; TQBuffer* m_readBuffer;
long m_readBufferLength; long m_readBufferLength;
long m_readBufferReadPointer; long m_readBufferReadPointer;
TQBuffer* m_writeBuffer;
long m_writeBufferLength;
bool m_krbInitRunning; bool m_krbInitRunning;
int m_krbInitState; int m_krbInitState;
TQString m_prevStatusMessage; TQString m_prevStatusMessage;

@ -280,11 +280,13 @@ int AuthSocket::servLoop() {
if (canReadData()) { if (canReadData()) {
reclen = readBlock(m_loopBuffer.data(), m_loopBuffer.size()); reclen = readBlock(m_loopBuffer.data(), m_loopBuffer.size());
m_servClientSocket->writeBlock(m_loopBuffer.data(), reclen); m_servClientSocket->writeBlock(m_loopBuffer.data(), reclen);
m_servClientSocket->flush();
transferred_data = true; transferred_data = true;
} }
if (m_servClientSocket->canReadData()) { if (m_servClientSocket->canReadData()) {
reclen = m_servClientSocket->readBlock(m_loopBuffer.data(), m_loopBuffer.size()); reclen = m_servClientSocket->readBlock(m_loopBuffer.data(), m_loopBuffer.size());
writeBlock(m_loopBuffer.data(), reclen); writeBlock(m_loopBuffer.data(), reclen);
flush();
transferred_data = true; transferred_data = true;
} }
} }

@ -205,6 +205,7 @@ void FPGASocket::commandLoop() {
cc = read(m_fd_tty, buffer, 10000); cc = read(m_fd_tty, buffer, 10000);
if (cc > 0) { if (cc > 0) {
writeBlock(buffer, cc); writeBlock(buffer, cc);
flush();
transferred_data = true; transferred_data = true;
printf("[DEBUG] Got %d bytes from the serial port\n\r", cc); fflush(stdout); printf("[DEBUG] Got %d bytes from the serial port\n\r", cc); fflush(stdout);
} }

Loading…
Cancel
Save