handleSessiondCmd();
} catch (UnknownHostException uhe) {
uhe.printStackTrace();
+ /*
+ * Terminate agent thread.
+ */
+ close();
} catch (IOException ioe) {
+ /*
+ * I/O exception may have been triggered by a session daemon
+ * closing the socket. Close our own socket and
+ * retry connecting after a delay.
+ */
try {
+ if (this.sessiondSock != null) {
+ this.sessiondSock.close();
+ }
Thread.sleep(3000);
} catch (InterruptedException e) {
- e.printStackTrace();
+ /*
+ * Retry immediately if sleep is interrupted.
+ */
+ } catch (IOException closeioe) {
+ closeioe.printStackTrace();
+ /*
+ * Terminate agent thread.
+ */
+ close();
}
}
}
*/
private SessiondCommandHeader recvHeader() throws IOException {
byte data[] = new byte[SessiondCommandHeader.HEADER_SIZE];
+ int bytesLeft = data.length;
+ int bytesOffset = 0;
- int readLen = this.inFromSessiond.read(data, 0, data.length);
- if (readLen != data.length) {
- throw new IOException();
+ while (bytesLeft > 0) {
+ int bytesRead = this.inFromSessiond.read(data, bytesOffset, bytesLeft);
+
+ if (bytesRead < 0) {
+ throw new IOException();
+ }
+ bytesLeft -= bytesRead;
+ bytesOffset += bytesRead;
}
return new SessiondCommandHeader(data);
}
*/
private byte[] recvPayload(SessiondCommandHeader headerCmd) throws IOException {
byte payload[] = new byte[(int) headerCmd.getDataSize()];
+ int bytesLeft = payload.length;
+ int bytesOffset = 0;
/* Failsafe check so we don't waste our time reading 0 bytes. */
- if (payload.length == 0) {
+ if (bytesLeft == 0) {
return null;
}
- int read = inFromSessiond.read(payload, 0, payload.length);
- if (read != payload.length) {
- throw new IOException("Unexpected number of bytes read in sessiond command payload");
+ while (bytesLeft > 0) {
+ int bytesRead = inFromSessiond.read(payload, bytesOffset, bytesLeft);
+
+ if (bytesRead < 0) {
+ throw new IOException();
+ }
+ bytesLeft -= bytesRead;
+ bytesOffset += bytesRead;
}
return payload;
}