Пример #1
0
/*
 * Send the messages to the node
 */
static void
send_msgs(int cs, const char *path)
{
	u_int	i;

	for (i = 0; i < msgs->sl_cur; i++)
		if (NgSendAsciiMsg(cs, path, "%s", msgs->sl_str[i]) == -1)
			err(EX_OSERR, "sending message '%s'", msgs->sl_str[i]);
}
Пример #2
0
static int
MsgCmd(int ac, char **av)
{
	char *buf;
	char *path, *cmdstr;
	int i, len;

	/* Get arguments */
	if (ac < 3)
		return (CMDRTN_USAGE);
	path = av[1];
	cmdstr = av[2];

	/* Put command and arguments back together as one string */
	for (len = 1, i = 3; i < ac; i++)
		len += strlen(av[i]) + 1;
	if ((buf = malloc(len)) == NULL) {
		warn("malloc");
		return (CMDRTN_ERROR);
	}
	for (*buf = '\0', i = 3; i < ac; i++) {
		snprintf(buf + strlen(buf),
		    len - strlen(buf), " %s", av[i]);
	}

	/* Send it */
	if (NgSendAsciiMsg(csock, path, "%s%s", cmdstr, buf) < 0) {
		free(buf);
		warn("send msg");
		return (CMDRTN_ERROR);
	}
	free(buf);

	/* See if a synchronous reply awaits */
	{
		struct timeval tv;
		fd_set rfds;

		FD_ZERO(&rfds);
		FD_SET(csock, &rfds);
		memset(&tv, 0, sizeof(tv));
		switch (select(csock + 1, &rfds, NULL, NULL, &tv)) {
		case -1:
			err(EX_OSERR, "select");
		case 0:
			break;
		default:
			MsgRead();
			break;
		}
	}

	/* Done */
	return (CMDRTN_OK);
}
Пример #3
0
static int
ng_MessageOut(struct ngdevice *dev, const char *data)
{
    char path[NG_PATHSIZ];
    char *fmt;
    size_t len;
    int pos, dpos;

    /*
     * We expect a node path, one or more spaces, a command, one or more
     * spaces and an ascii netgraph structure.
     */
    data += strspn(data, " \t");
    len = strcspn(data, " \t");
    if (len >= sizeof path) {
        log_Printf(LogWARN, "%s: %.*s: Node path too long\n",
                   dev->dev.name, len, data);
        return 0;
    }
    memcpy(path, data, len);
    path[len] = '\0';
    data += len;

    data += strspn(data, " \t");
    len = strcspn(data, " \t");
    for (pos = len; pos >= 0; pos--)
        if (data[pos] == '%')
            len++;
    if ((fmt = alloca(len + 4)) == NULL) {
        log_Printf(LogWARN, "%s: alloca(%d) failure... %s\n",
                   dev->dev.name, len + 4, strerror(errno));
        return 0;
    }

    /*
     * This is probably a waste of time, but we really don't want to end
     * up stuffing unexpected % escapes into the kernel....
     */
    for (pos = dpos = 0; pos < (int)len;) {
        if (data[dpos] == '%')
            fmt[pos++] = '%';
        fmt[pos++] = data[dpos++];
    }
    strcpy(fmt + pos, " %s");
    data += dpos;

    data += strspn(data, " \t");
    if (NgSendAsciiMsg(dev->cs, path, fmt, data) < 0) {
        log_Printf(LogDEBUG, "%s: NgSendAsciiMsg (to %s): \"%s\", \"%s\": %s\n",
                   dev->dev.name, path, fmt, data, strerror(errno));
        return 0;
    }

    return 1;
}