Exemplo n.º 1
0
/*
 * Get a netgraph message
 */
static ssize_t
ng_MessageIn(struct physical *p, char *buf, size_t sz)
{
    char msgbuf[sizeof(struct ng_mesg) * 2 + NG_MSGBUFSZ];
    struct ngdevice *dev = device2ng(p->handler);
    struct ng_mesg *rep = (struct ng_mesg *)msgbuf;
    char path[NG_PATHSIZ];
    size_t len;

#ifdef BROKEN_SELECT
    struct timeval t;
    fd_set *r;
    int ret;

    if (dev->cs < 0)
        return 0;

    if ((r = mkfdset()) == NULL) {
        log_Printf(LogERROR, "DoLoop: Cannot create fd_set\n");
        return -1;
    }
    zerofdset(r);
    FD_SET(dev->cs, r);
    t.tv_sec = t.tv_usec = 0;
    ret = select(dev->cs + 1, r, NULL, NULL, &t);
    free(r);

    if (ret <= 0)
        return 0;
#endif

    if (NgRecvAsciiMsg(dev->cs, rep, sizeof msgbuf, path)) {
        log_Printf(LogWARN, "%s: NgRecvAsciiMsg: %s\n",
                   dev->dev.name, strerror(errno));
        return -1;
    }

    /* XXX: Should we check rep->header.version ? */

    if (sz == 0)
        log_Printf(LogWARN, "%s: Unexpected message: %s\n", dev->dev.name,
                   rep->header.cmdstr);
    else {
        log_Printf(LogDEBUG, "%s: Received message: %s\n", dev->dev.name,
                   rep->header.cmdstr);
        len = strlen(rep->header.cmdstr);
        if (sz > len)
            sz = len;
        memcpy(buf, rep->header.cmdstr, sz);
    }

    return sz;
}
Exemplo n.º 2
0
/*
 * Identical to NgRecvAsciiMsg() except buffer is dynamically allocated.
 */
int
NgAllocRecvAsciiMsg(int cs, struct ng_mesg **reply, char *path)
{
	int len;
	socklen_t optlen;

	optlen = sizeof(len);
	if (getsockopt(cs, SOL_SOCKET, SO_RCVBUF, &len, &optlen) == -1 ||
	    (*reply = malloc(len)) == NULL)
		return (-1);
	if ((len = NgRecvAsciiMsg(cs, *reply, len, path)) < 0)
		free(*reply);
	return (len);
}