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;
}
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));

@ -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;

@ -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));

@ -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;

@ -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;
}
}

@ -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);
}

Loading…
Cancel
Save