From 432b02e3152ba714a3b5a24e1ad137a51819fec2 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Fri, 25 May 2001 10:51:26 +0000 Subject: Added a timeout for connection attempts. --- ncpd/packet.cc | 192 ++++++++++++++++++++++++++--------------------------- ncpd/socketchan.cc | 5 +- ncpd/socketchan.h | 1 + 3 files changed, 101 insertions(+), 97 deletions(-) (limited to 'ncpd') diff --git a/ncpd/packet.cc b/ncpd/packet.cc index 6d97ccc..1b4daad 100644 --- a/ncpd/packet.cc +++ b/ncpd/packet.cc @@ -197,113 +197,113 @@ realWrite() bool packet:: get(unsigned char &type, bufferStore & ret) { - while (!terminated()) { - if (linkFailed()) - return false; - int res = read(fd, inPtr, BUFFERLEN - inLen); - if (res > 0) { - if (verbose & PKT_DEBUG_LOG) - cout << "packet: rcv " << dec << res << endl; - inPtr += res; - inLen += res; - } - if (res < 0) - return false; - // XXX Solaris returns 0 on non blocking TTY lines - // even when VMIN > 0 - if( res == 0 && inLen == 0 ) - return false; - if (inLen >= BUFFERLEN) { - cerr << "packet: input buffer overflow!!!!" << endl; - inLen = 0; - inPtr = inBuffer; - return false; - } + while (!terminated()) { + if (linkFailed()) + return false; + int res = read(fd, inPtr, BUFFERLEN - inLen); + if (res > 0) { + if (verbose & PKT_DEBUG_LOG) + cout << "packet: rcv " << dec << res << endl; + inPtr += res; + inLen += res; } - if (verbose & PKT_DEBUG_LOG) { - cout << "packet: get "; - if (verbose & PKT_DEBUG_DUMP) { - for (int i = foundSync - 3; i < termLen; i++) - cout << hex << setw(2) << setfill('0') << (int) inBuffer[i] << " "; - } else - cout << "len=" << dec << termLen; - cout << endl; - } - inLen -= termLen; - termLen = 0; - foundSync = 0; - bool crcOk = (endPtr[0] == ((crcIn >> 8) & 0xff) && endPtr[1] == (crcIn & 0xff)); - if (inLen > 0) - memmove(inBuffer, &endPtr[2], inLen); - inPtr = inBuffer + inLen; - if (crcOk) { - type = rcv.getByte(0); - ret = rcv; - ret.discardFirstBytes(1); - return true; - } else { - if (verbose & PKT_DEBUG_LOG) - cout << "packet: BAD CRC" << endl; + if (res < 0) + return false; + // XXX Solaris returns 0 on non blocking TTY lines + // even when VMIN > 0 + if( res == 0 && inLen == 0 ) + return false; + if (inLen >= BUFFERLEN) { + cerr << "packet: input buffer overflow!!!!" << endl; + inLen = 0; + inPtr = inBuffer; + return false; } - return false; + } + if (verbose & PKT_DEBUG_LOG) { + cout << "packet: get "; + if (verbose & PKT_DEBUG_DUMP) { + for (int i = foundSync - 3; i < termLen; i++) + cout << hex << setw(2) << setfill('0') << (int) inBuffer[i] << " "; + } else + cout << "len=" << dec << termLen; + cout << endl; + } + inLen -= termLen; + termLen = 0; + foundSync = 0; + bool crcOk = (endPtr[0] == ((crcIn >> 8) & 0xff) && endPtr[1] == (crcIn & 0xff)); + if (inLen > 0) + memmove(inBuffer, &endPtr[2], inLen); + inPtr = inBuffer + inLen; + if (crcOk) { + type = rcv.getByte(0); + ret = rcv; + ret.discardFirstBytes(1); + return true; + } else { + if (verbose & PKT_DEBUG_LOG) + cout << "packet: BAD CRC" << endl; + } + return false; } bool packet:: terminated() { - unsigned char *p; - int l; - - if (inLen < 6) - return false; - p = inBuffer + termLen; - if (!foundSync) { - while (!foundSync && (inLen - termLen >= 6)) - { - termLen++; - if (*p++ != 0x16) - continue; - termLen++; - if (*p++ != 0x10) - continue; - termLen++; - if (*p++ != 0x02) - continue; - foundSync = termLen; - } - if (!foundSync) - return false; + unsigned char *p; + int l; - if (verbose & PKT_DEBUG_LOG) { - if (foundSync != 3) - cout << "packet: terminated found sync at " << foundSync << endl; + if (inLen < 6) + return false; + p = inBuffer + termLen; + if (!foundSync) { + while (!foundSync && (inLen - termLen >= 6)) + { + termLen++; + if (*p++ != 0x16) + continue; + termLen++; + if (*p++ != 0x10) + continue; + termLen++; + if (*p++ != 0x02) + continue; + foundSync = termLen; } - esc = false; - // termLen = 3; - crcIn = 0; - rcv.init(); + if (!foundSync) + return false; + + if (verbose & PKT_DEBUG_LOG) { + if (foundSync != 3) + cout << "packet: terminated found sync at " << foundSync << endl; } - for (l = termLen; l < inLen - 2; p++, l++) { - if (esc) { - esc = false; - if (*p == 0x03) { - endPtr = p + 1; - termLen = l + 3; - return true; - } - addToCrc(*p, &crcIn); - rcv.addByte(*p); - } else { - if (*p == 0x10) - esc = true; - else { - addToCrc(*p, &crcIn); - rcv.addByte(*p); - } - } + esc = false; + // termLen = 3; + crcIn = 0; + rcv.init(); + } + for (l = termLen; l < inLen - 2; p++, l++) { + if (esc) { + esc = false; + if (*p == 0x03) { + endPtr = p + 1; + termLen = l + 3; + return true; + } + addToCrc(*p, &crcIn); + rcv.addByte(*p); + } else { + if (*p == 0x10) + esc = true; + else { + addToCrc(*p, &crcIn); + rcv.addByte(*p); + } } - termLen = l; - return false; + } + termLen = l; + return false; } bool packet:: diff --git a/ncpd/socketchan.cc b/ncpd/socketchan.cc index 1eba086..5d13090 100644 --- a/ncpd/socketchan.cc +++ b/ncpd/socketchan.cc @@ -148,6 +148,7 @@ ncpConnectNak() ncpConnectTerminate(); else { connectTry++; + tryStamp = time(0); ncpRegister(); } } @@ -202,6 +203,7 @@ socketPoll() // other cases, we first perform a registration. Connect // is then triggered by RegisterAck and uses the name // we received from the Psion. + tryStamp = time(0); if (strncmp(registerName, "SYS$RFSV", 8) == 0) ncpConnect(); else @@ -220,7 +222,8 @@ socketPoll() } else if (res == 1) { ncpSend(a); } - } + } else if (time(0) > (tryStamp + 15)) + terminateWhenAsked(); } bool socketChan:: diff --git a/ncpd/socketchan.h b/ncpd/socketchan.h index e90c27a..a3c53d3 100644 --- a/ncpd/socketchan.h +++ b/ncpd/socketchan.h @@ -53,6 +53,7 @@ private: char* registerName; bool connected; int connectTry; + int tryStamp; }; #endif -- cgit v1.2.3