mirror of
https://framagit.org/bortzmeyer/echoping
synced 2024-11-05 06:00:37 +00:00
99 lines
2.2 KiB
C
99 lines
2.2 KiB
C
|
#ifdef ICP
|
||
|
|
||
|
/* Code contributed by Christian Grimm <grimm@rvs.uni-hannover.de>
|
||
|
and patched by Stephane Bortzmeyer. */
|
||
|
|
||
|
#include "echoping.h"
|
||
|
|
||
|
void *
|
||
|
make_icp_sendline (url, shost, opcode, length)
|
||
|
|
||
|
const char *url;
|
||
|
u_num32 *shost;
|
||
|
icp_opcode opcode;
|
||
|
int *length;
|
||
|
|
||
|
{
|
||
|
icp_common_t *headerp = NULL;
|
||
|
char *buf = NULL;
|
||
|
char *urloffset = NULL;
|
||
|
u_num32 flags = ICP_FLAG_SRC_RTT;
|
||
|
u_num32 pad = 0;
|
||
|
u_num32 reqnum = 4711;
|
||
|
unsigned short buf_len;
|
||
|
|
||
|
buf_len = sizeof (icp_common_t) + strlen (url) + 1;
|
||
|
if (opcode == ICP_OP_QUERY)
|
||
|
buf_len += sizeof (u_num32);
|
||
|
buf = calloc (buf_len, 1);
|
||
|
headerp = (icp_common_t *) buf;
|
||
|
headerp->opcode = opcode;
|
||
|
headerp->version = ICP_VERSION_CURRENT;
|
||
|
headerp->length = htons (buf_len);
|
||
|
headerp->reqnum = htonl (reqnum);
|
||
|
headerp->flags = htonl (flags);
|
||
|
headerp->pad = pad;
|
||
|
headerp->shostid = htonl ((u_num32) shost);
|
||
|
/* urloffset = (char *) ((int) buf + sizeof(icp_common_t)); */
|
||
|
urloffset = (char *) (buf + sizeof (icp_common_t));
|
||
|
if (opcode == ICP_OP_QUERY)
|
||
|
urloffset += sizeof (u_num32);
|
||
|
memcpy (urloffset, url, strlen (url));
|
||
|
*length = buf_len;
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
recv_icp (sockfd, buf, retcode)
|
||
|
|
||
|
int sockfd;
|
||
|
char *buf;
|
||
|
char *retcode;
|
||
|
|
||
|
{ /*
|
||
|
* based on draft-wessels-icp-v2-02.txt
|
||
|
*/
|
||
|
icp_common_t *headerp = (icp_common_t *) buf;
|
||
|
int nr, length;
|
||
|
unsigned char opcode;
|
||
|
static char *icp_op_code[] =
|
||
|
{
|
||
|
/* 0 */ "ICP_OP_INVALID",
|
||
|
/* 1 */ "ICP_OP_QUERY",
|
||
|
/* 2 */ "ICP_OP_HIT",
|
||
|
/* 3 */ "ICP_OP_MISS",
|
||
|
/* 4 */ "ICP_OP_ERR",
|
||
|
/* 5 */ "",
|
||
|
/* 6 */ "",
|
||
|
/* 7 */ "",
|
||
|
/* 8 */ "",
|
||
|
/* 9 */ "",
|
||
|
/* 10 */ "ICP_OP_SECHO",
|
||
|
/* 11 */ "ICP_OP_DECHO",
|
||
|
/* 12 */ "",
|
||
|
/* 13 */ "",
|
||
|
/* 14 */ "",
|
||
|
/* 15 */ "",
|
||
|
/* 16 */ "",
|
||
|
/* 17 */ "",
|
||
|
/* 18 */ "",
|
||
|
/* 19 */ "",
|
||
|
/* 20 */ "",
|
||
|
/* 21 */ "ICP_OP_MISS_NOFETCH",
|
||
|
/* 22 */ "ICP_OP_DENIED",
|
||
|
/* 23 */ "ICP_OP_HIT_OBJ"
|
||
|
};
|
||
|
|
||
|
|
||
|
nr = recvfrom (sockfd, buf, DEFLINE, 0,
|
||
|
(struct sockaddr *) 0, (int *) 0);
|
||
|
/* BUG: we should test the return code, see if there was a timeout, etc */
|
||
|
opcode = headerp->opcode;
|
||
|
length = ntohs (headerp->length);
|
||
|
sprintf (retcode, "ICP reply: \42%s\42", icp_op_code[opcode]);
|
||
|
return length;
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif /* ICP */
|