/* * 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]); }
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); }
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; }