diff options
Diffstat (limited to 'servers')
-rw-r--r-- | servers/auth_server_lin/src/auth_conn.cpp | 32 | ||||
-rw-r--r-- | servers/fpga_programming_server_lin/src/fpga_conn.cpp | 136 | ||||
-rw-r--r-- | servers/fpga_programming_server_lin/src/fpga_conn.h | 7 | ||||
-rw-r--r-- | servers/fpga_server_lin/src/fpga_conn.cpp | 2 |
4 files changed, 150 insertions, 27 deletions
diff --git a/servers/auth_server_lin/src/auth_conn.cpp b/servers/auth_server_lin/src/auth_conn.cpp index 1356df4..cac5ba9 100644 --- a/servers/auth_server_lin/src/auth_conn.cpp +++ b/servers/auth_server_lin/src/auth_conn.cpp @@ -130,8 +130,10 @@ void AuthSocket::finishKerberosHandshake() { TQ_UINT32 protover = PROTOCOL_VERSION; TQDataStream ds(this); + ds.setPrintableData(true); ds << magicnum; ds << protover; + writeEndOfFrame(); enterCommandLoop(); return; @@ -150,6 +152,7 @@ int AuthSocket::servLoop() { if (m_servActive) { TQString command; TQDataStream ds(this); + ds.setPrintableData(true); TDEKerberosClientSocket::KerberosStatus krbstat; switch (m_servState) { @@ -162,6 +165,7 @@ int AuthSocket::servLoop() { if (!m_servClientTimeout->isActive()) { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -187,6 +191,7 @@ int AuthSocket::servLoop() { else { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -205,6 +210,7 @@ int AuthSocket::servLoop() { else { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s due to Kerberos failure\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -218,19 +224,23 @@ int AuthSocket::servLoop() { m_servClientTimeout->start(5000, TRUE); } if (m_servClientSocket->state() == TQSocket::Connected) { - if (m_servClientSocket->canReadData()) { + if (m_servClientSocket->canReadFrame()) { TQDataStream clientDS(m_servClientSocket); + clientDS.setPrintableData(true); TQString server_reply; clientDS >> server_reply; + m_servClientSocket->clearFrameTail(); if (server_reply == "OK") { ds << TQString("OK"); + writeEndOfFrame(); transferred_data = true; m_servState = 4; } else { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s due to remote server returning %s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii(), server_reply.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -243,6 +253,7 @@ int AuthSocket::servLoop() { // Timeout! m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -254,6 +265,7 @@ int AuthSocket::servLoop() { else { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection failed to %s:%d for user %s@%s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; delete m_servClientTimeout; @@ -279,6 +291,7 @@ int AuthSocket::servLoop() { else { m_servClientSocket->close(); ds << TQString("ERRNOTAVL"); + writeEndOfFrame(); printf("[DEBUG] Connection terminated by remote host %s:%d for user %s@%s\n\r", m_srvServiceHostName.ascii(), m_srvServicePort, m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_servActive = false; close(); @@ -316,12 +329,14 @@ void AuthSocket::commandLoop() { try { transferred_data = false; if (state() == TQSocket::Connected) { - if (canReadData()) { + if (canReadFrame()) { TQString command; TQDataStream ds(this); + ds.setPrintableData(true); transferred_data = true; ds >> command; + clearFrameTail(); if (command != "") { printf("[DEBUG] Got command %s from user %s@%s\n\r", command.ascii(), m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); if (command == "LIST") { @@ -378,13 +393,15 @@ void AuthSocket::commandLoop() { m_slist.append(st); } } - + ds << m_slist; + writeEndOfFrame(); } else if (command == "BIND") { // Get desired Station Type from client StationType st; ds >> st; + clearFrameTail(); // Attempt to bind to station matching desired Service Type list... m_stationID = -1; @@ -405,6 +422,7 @@ void AuthSocket::commandLoop() { if (m_stationID < 0) { ds << TQString("ERRUNAVAL"); + writeEndOfFrame(); } else { m_bound = true; @@ -418,16 +436,19 @@ void AuthSocket::commandLoop() { m_databaseActivityCursor->insert(); ds << TQString("OK"); + writeEndOfFrame(); } } else { ds << TQString("ERRPREVCN"); + writeEndOfFrame(); } } else if (command == "SERV") { // Get client library name from the client TQString libname; ds >> libname; + clearFrameTail(); printf("[DEBUG] SERV command parameter was %s from user %s@%s\n\r", libname.ascii(), m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout); m_databaseActivityCursor->select(TQString("username='%1' AND realmname='%2'").arg(m_authenticatedUserName).arg(m_authenticatedRealmName)); @@ -437,10 +458,12 @@ void AuthSocket::commandLoop() { if (m_bound == true) { ds << TQString("ERRINVCMD"); + writeEndOfFrame(); } else { if (m_stationID < 0) { ds << TQString("ERRNOCONN"); + writeEndOfFrame(); } else { // Find the service ID for the specified client library name @@ -451,6 +474,7 @@ void AuthSocket::commandLoop() { } if (sid < 0) { ds << TQString("ERRNOSERV"); + writeEndOfFrame(); } else { // Attempt to connect to the backend server @@ -470,6 +494,7 @@ void AuthSocket::commandLoop() { } else { ds << TQString("ERRNOSERV"); + writeEndOfFrame(); } } } @@ -477,6 +502,7 @@ void AuthSocket::commandLoop() { } else { ds << TQString("ERRINVCMD"); + writeEndOfFrame(); } } } diff --git a/servers/fpga_programming_server_lin/src/fpga_conn.cpp b/servers/fpga_programming_server_lin/src/fpga_conn.cpp index 330e747..341d14a 100644 --- a/servers/fpga_programming_server_lin/src/fpga_conn.cpp +++ b/servers/fpga_programming_server_lin/src/fpga_conn.cpp @@ -25,6 +25,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> /* read() */ +#include <errno.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> @@ -46,8 +47,7 @@ delete s; \ s = NULL; -//#define NETWORK_COMM_TIMEOUT_MS 2000 -#define NETWORK_COMM_TIMEOUT_MS 4000 +#define NETWORK_COMM_TIMEOUT_MS 5000 /* exception handling */ struct exit_exception { @@ -61,7 +61,9 @@ struct exit_exception { instance of this class. */ FPGASocket::FPGASocket(int sock, TQObject *parent, const char *name) : - TDEKerberosServerSocket(parent, name), m_criticalSection(0), m_loopTimer(NULL), m_config(static_cast<FPGAServer*>(parent)->m_config), m_commandLoopState(0) { + TDEKerberosServerSocket(parent, name), m_criticalSection(0), m_loopTimer(NULL), m_config(static_cast<FPGAServer*>(parent)->m_config), m_commandLoopState(0), + m_progpipe(NULL), m_progpipefd(-1), m_progErrorFlag(false), m_progDoneFlag(false) +{ // Initialize timers m_kerberosInitTimer = new TQTimer(); @@ -136,7 +138,9 @@ void FPGASocket::finishKerberosHandshake() { setDataTimeout(NETWORK_COMM_TIMEOUT_MS); TQDataStream ds(this); + ds.setPrintableData(true); ds << TQString("OK"); + writeEndOfFrame(); enterCommandLoop(); return; @@ -155,54 +159,85 @@ void FPGASocket::commandLoop() { try { transferred_data = false; if (state() == TQSocket::Connected) { - if (m_commandLoopState == 0) { -printf("[RAJA DEBUG 499.0] Waiting for command...\n\r"); fflush(stdout); + if ((m_commandLoopState == 0) || (m_commandLoopState == 3) || (m_commandLoopState == 4) || (m_commandLoopState == 5)) { + // Certain commands can come in at any time during some operations if (canReadLine()) { -printf("[RAJA DEBUG 499.1] Processing pending data (buffer: %d)...\n\r", bytesAvailable()); fflush(stdout); processPendingData(); } - if (bytesAvailable() > 0) { + if (canReadFrame()) { TQDataStream ds(this); + ds.setPrintableData(true); TQString command; ds >> command; - printf("[DEBUG] Received command '%s'\n\r", command.ascii()); + clearFrameTail(); if (command == "STATUS") { - ds << TQString("IDLE"); + if (m_logMessages != "") { + ds << TQString("LOGMESSAGES"); + writeEndOfFrame(); + ds << m_logMessages; + writeEndOfFrame(); + m_logMessages = ""; + } + else if (m_progErrorFlag) { + ds << TQString("ERROR"); + m_progErrorFlag = false; + writeEndOfFrame(); + } + else if (m_progDoneFlag) { + ds << TQString("DONE"); + m_progDoneFlag = false; + writeEndOfFrame(); + ds << m_progRetCode; + writeEndOfFrame(); + } + else if (m_commandLoopState == 0) { + ds << TQString("IDLE"); + writeEndOfFrame(); + } + else if ((m_commandLoopState == 3) || (m_commandLoopState == 4) || (m_commandLoopState == 5)) { + ds << TQString("PROGRAMMING"); + writeEndOfFrame(); + } + else { + ds << TQString("UNKNOWN"); + writeEndOfFrame(); + } } - else if (command == "FILE") { - m_commandLoopState = 1; - } - else { - printf("[WARNING] Received unknown command '%s'\n\r", command.ascii()); + else if (m_commandLoopState == 0) { + if (command == "FILE") { + m_commandLoopState = 1; + } + else if (command == "PROGRAM") { + m_commandLoopState = 3; + } + else { + printf("[WARNING] Received unknown command '%s'\n\r", command.ascii()); + } } transferred_data = true; } } - else if (m_commandLoopState == 1) { + if (m_commandLoopState == 1) { if (canReadLine()) { processPendingData(); } -printf("[RAJA DEBUG 500.0] Waiting for file...\n\r"); fflush(stdout); - if (bytesAvailable() > 0) { -printf("[RAJA DEBUG 500.1] Waiting for file (buffer: %d)...\n\r", bytesAvailable()); fflush(stdout); + if (canReadFrame()) { TQDataStream ds(this); + ds.setPrintableData(true); ds >> m_programmingFileSize; + clearFrameTail(); m_servClientTimeout->start(NETWORK_COMM_TIMEOUT_MS, TRUE); m_commandLoopState = 2; } } else if (m_commandLoopState == 2) { if (canReadLine()) { -printf("[RAJA DEBUG 500.2] Processing pending data (buffer: %d)...\n\r", bytesAvailable()); fflush(stdout); m_servClientTimeout->start(NETWORK_COMM_TIMEOUT_MS, TRUE); processPendingData(); } -printf("[RAJA DEBUG 500.3] Waiting for file contents (buffer: %d)...\n\r", bytesAvailable()); fflush(stdout); if (bytesAvailable() >= m_programmingFileSize) { TQByteArray fileContents(m_programmingFileSize); readBlock(fileContents.data(), fileContents.size()); -printf("[RAJA DEBUG 500.4] Received file!\n\r"); fflush(stdout); -printf("[RAJA DEBUG 500.5] fileContents size: %d\n\r", fileContents.size()); fflush(stdout); m_programmingFileName = TQString("/tmp/%1#%2.dat").arg(m_remoteHost).arg(port()); TQFile outputFile(m_programmingFileName); if (outputFile.open(IO_ReadWrite)) { @@ -215,13 +250,66 @@ printf("[RAJA DEBUG 500.5] fileContents size: %d\n\r", fileContents.size()); ffl } else { if (!m_servClientTimeout->isActive()) { - TQDataStream ds(this); - ds << TQString("ERROR"); + m_progErrorFlag = true; transferred_data = true; m_commandLoopState = 0; } } } + else if (m_commandLoopState == 3) { + // Start programming! + + // Open programming process + m_config->setGroup("Programming"); + TQString programmingScript = m_config->readEntry("script"); + programmingScript.replace("%f", m_programmingFileName); + if (!programmingScript.contains("2>&1")) { + programmingScript.append(" 2>&1"); + } + if ((m_progpipe = popen(programmingScript.ascii(), "r")) == NULL) { + m_logMessages.append(TQString("The system was unable to execute '%1'\nPlease contact your system administrator with this information").arg(programmingScript)); + m_progErrorFlag = true; + transferred_data = true; + m_commandLoopState = 0; + } + else { + m_progpipefd = fileno(m_progpipe); + fcntl(m_progpipefd, F_SETFL, O_NONBLOCK); + } + m_commandLoopState = 4; + } + else if (m_commandLoopState == 4) { + // Check programming status + TQCString buf; + buf.resize(8192); + ssize_t r = read(m_progpipefd, buf.data(), buf.size()); + if ((r == -1) && (errno == EAGAIN)) { + // No data available yet + } + else if (r > 0) { + // Data was received + buf.data()[r] = 0; + m_logMessages.append(buf); + } + else { + // Process terminated + m_commandLoopState = 5; + } + } + else if (m_commandLoopState == 5) { + // Programming process terminated; get exit code and clean up + if (m_progpipe) { + m_progRetCode = pclose(m_progpipe); + } + else { + m_progRetCode = -1; + } + m_progpipe = NULL; + m_progpipefd = -1; + + m_progDoneFlag = true; + m_commandLoopState = 0; + } } m_criticalSection--; if (transferred_data) { diff --git a/servers/fpga_programming_server_lin/src/fpga_conn.h b/servers/fpga_programming_server_lin/src/fpga_conn.h index ec2dd65..597b4cc 100644 --- a/servers/fpga_programming_server_lin/src/fpga_conn.h +++ b/servers/fpga_programming_server_lin/src/fpga_conn.h @@ -70,6 +70,13 @@ class FPGASocket : public TDEKerberosServerSocket TQ_ULONG m_programmingFileSize; TQString m_programmingFileName; + FILE *m_progpipe; + int m_progpipefd; + + bool m_progErrorFlag; + bool m_progDoneFlag; + TQ_INT32 m_progRetCode; + TQString m_logMessages; friend class FPGAServer; }; diff --git a/servers/fpga_server_lin/src/fpga_conn.cpp b/servers/fpga_server_lin/src/fpga_conn.cpp index 1a4bbdb..fd1bdfa 100644 --- a/servers/fpga_server_lin/src/fpga_conn.cpp +++ b/servers/fpga_server_lin/src/fpga_conn.cpp @@ -129,7 +129,9 @@ void FPGASocket::finishKerberosHandshake() { } TQDataStream ds(this); + ds.setPrintableData(true); ds << TQString("OK"); + writeEndOfFrame(); enterCommandLoop(); return; |