1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| char *
Dp_RPC(DPServer server, char* mesgStr, struct timeval* tv, int* errorPtr)
{
int rc, len;
int amtRecv = -1, totalAmt = 0;
*errorPtr = 0;
/*
* Send the RPC to the remote server. Note the 12 is
* just a random ID since we don't use IDs.
*/
rc = SendRPCMessage(server, TOK_RPC, 12, mesgStr);
if (rc <= 0) {
*errorPtr = errno;
strcpy(retStr, "Error writing on socket");
return retStr;
}
/*
* Now we want to recv the reply.
* We spin in a loop waiting for the entire message
* to arrive. This gets a bit messy.
*/
bufPtr = retStr;
while (amtRecv < totalAmt) {
char lengthStr[7];
rc = Dp_WaitForServer(server, tv);
if (rc <= 0) {
if (rc == 0) {
*errorPtr = -1;
strcpy(retStr, "RPC timed out");
return retStr;
} else {
*errorPtr = errno;
strcpy(retStr, "Select error");
return retStr;
}
}
amtRecv = recv(server, bufPtr, (retStr + DP_BUFFER_SIZE) - bufPtr, 0);
if ((amtRecv >= 6) && (totalAmt == 0)) {
/*
* Extract the length field from the incoming message
* so we know when we have recv'd the entire message.
*/
strncpy(lengthStr, retStr, 6);
lengthStr[6] = '\0';
totalAmt = atoi(lengthStr);
} else if (amtRecv == 0) {
/*
* EOF
*/
break;
}
bufPtr += amtRecv;
}
if (retStr[7] == 'x') {
*errorPtr = -1;
}
len = totalAmt - 16;
memcpy(retStr, &retStr[16], len);
retStr[len] = '\0';
return retStr;
} |
Partager