#define NEED_REPLIES
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
XHostAddress *XListHosts (
register Display *dpy,
int *nhosts,
Bool *enabled)
{
register XHostAddress *outbuf = NULL, *op;
xListHostsReply reply;
long nbytes;
unsigned char *buf, *bp;
register unsigned i;
register xListHostsReq *req;
XServerInterpretedAddress *sip;
*nhosts = 0;
LockDisplay(dpy);
GetReq (ListHosts, req);
if (!_XReply (dpy, (xReply *) &reply, 0, xFalse)) {
UnlockDisplay(dpy);
SyncHandle();
return (XHostAddress *) NULL;
}
if (reply.nHosts) {
nbytes = reply.length << 2;
op = outbuf = (XHostAddress *)
Xmalloc((unsigned) (nbytes +
(reply.nHosts * sizeof(XHostAddress)) +
(reply.nHosts * sizeof(XServerInterpretedAddress))));
if (! outbuf) {
_XEatData(dpy, (unsigned long) nbytes);
UnlockDisplay(dpy);
SyncHandle();
return (XHostAddress *) NULL;
}
sip = (XServerInterpretedAddress *)
(((unsigned char *) outbuf) + (reply.nHosts * sizeof(XHostAddress)));
bp = buf = ((unsigned char *) sip)
+ (reply.nHosts * sizeof(XServerInterpretedAddress));
_XRead (dpy, (char *) buf, nbytes);
for (i = 0; i < reply.nHosts; i++) {
#ifdef WORD64
xHostEntry xhe;
memcpy((char *)&xhe, bp, SIZEOF(xHostEntry));
op->family = xhe.family;
op->length = xhe.length;
#else
op->family = ((xHostEntry *) bp)->family;
op->length =((xHostEntry *) bp)->length;
#endif
if (op->family == FamilyServerInterpreted) {
char *tp = (char *) (bp + SIZEOF(xHostEntry));
char *vp = memchr(tp, 0, op->length);
if (vp != NULL) {
sip->type = tp;
sip->typelength = vp - tp;
sip->value = vp + 1;
sip->valuelength = op->length - (sip->typelength + 1);
} else {
sip->type = sip->value = NULL;
sip->typelength = sip->valuelength = 0;
}
op->address = (char *) sip;
sip++;
} else {
op->address = (char *) (bp + SIZEOF(xHostEntry));
}
bp += SIZEOF(xHostEntry) + (((op->length + 3) >> 2) << 2);
op++;
}
}
*enabled = reply.enabled;
*nhosts = reply.nHosts;
UnlockDisplay(dpy);
SyncHandle();
return (outbuf);
}