aboutsummaryrefslogtreecommitdiffstats
path: root/ncpd
diff options
context:
space:
mode:
authorFritz Elfert <felfert@to.com>2001-05-25 10:51:26 +0000
committerFritz Elfert <felfert@to.com>2001-05-25 10:51:26 +0000
commit432b02e3152ba714a3b5a24e1ad137a51819fec2 (patch)
treeb8593bbae37807828157fd0c7e7ef7fbca715adf /ncpd
parent4a35a3fb7d0e30aa4c3d4b91efa890cbf4096c97 (diff)
downloadplptools-432b02e3152ba714a3b5a24e1ad137a51819fec2.tar.gz
plptools-432b02e3152ba714a3b5a24e1ad137a51819fec2.tar.bz2
plptools-432b02e3152ba714a3b5a24e1ad137a51819fec2.zip
Added a timeout for connection attempts.
Diffstat (limited to 'ncpd')
-rw-r--r--ncpd/packet.cc192
-rw-r--r--ncpd/socketchan.cc5
-rw-r--r--ncpd/socketchan.h1
3 files changed, 101 insertions, 97 deletions
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