When the 'msg' command is used from the command line, check for a
synchronous reply, and display it (if any) before exiting. Requested by: phk
This commit is contained in:
parent
a42af91cba
commit
6ebb8ebbd1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=61880
@ -52,7 +52,6 @@ static int DoCommand(int ac, char **av);
|
||||
static int DoInteractive(void);
|
||||
static const struct ngcmd *FindCommand(const char *string);
|
||||
static int MatchCommand(const struct ngcmd *cmd, const char *s);
|
||||
static void DumpAscii(const u_char *buf, int len);
|
||||
static void Usage(const char *msg);
|
||||
static int ReadCmd(int ac, char **av);
|
||||
static int HelpCmd(int ac, char **av);
|
||||
@ -229,48 +228,11 @@ DoInteractive(void)
|
||||
}
|
||||
|
||||
/* Display any incoming control message */
|
||||
while (FD_ISSET(csock, &rfds)) {
|
||||
u_char buf[2 * sizeof(struct ng_mesg) + 8192];
|
||||
struct ng_mesg *const m = (struct ng_mesg *)buf;
|
||||
struct ng_mesg *const ascii = (struct ng_mesg *)m->data;
|
||||
char path[NG_PATHLEN+1];
|
||||
|
||||
/* Get incoming message (in binary form) */
|
||||
if (NgRecvMsg(csock, m, sizeof(buf), path) < 0) {
|
||||
warn("recv incoming message");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Ask originating node to convert to ASCII */
|
||||
if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
|
||||
NGM_BINARY2ASCII, m,
|
||||
sizeof(*m) + m->header.arglen) < 0
|
||||
|| NgRecvMsg(csock, m, sizeof(buf), NULL) < 0) {
|
||||
printf("Rec'd %s %d from \"%s\":\n",
|
||||
(m->header.flags & NGF_RESP) != 0 ?
|
||||
"response" : "command",
|
||||
m->header.cmd, path);
|
||||
if (m->header.arglen == 0)
|
||||
printf("No arguments\n");
|
||||
else
|
||||
DumpAscii(m->data, m->header.arglen);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Display message in ASCII form */
|
||||
printf("Rec'd %s \"%s\" (%d) from \"%s\":\n",
|
||||
(ascii->header.flags & NGF_RESP) != 0 ?
|
||||
"response" : "command",
|
||||
ascii->header.cmdstr, ascii->header.cmd, path);
|
||||
if (*ascii->data != '\0')
|
||||
printf("Args:\t%s\n", ascii->data);
|
||||
else
|
||||
printf("No arguments\n");
|
||||
break;
|
||||
}
|
||||
if (FD_ISSET(csock, &rfds))
|
||||
MsgRead();
|
||||
|
||||
/* Display any incoming data packet */
|
||||
while (FD_ISSET(dsock, &rfds)) {
|
||||
if (FD_ISSET(dsock, &rfds)) {
|
||||
u_char buf[8192];
|
||||
char hook[NG_HOOKLEN + 1];
|
||||
int rl;
|
||||
@ -278,14 +240,13 @@ DoInteractive(void)
|
||||
/* Read packet from socket */
|
||||
if ((rl = NgRecvData(dsock,
|
||||
buf, sizeof(buf), hook)) < 0)
|
||||
err(EX_OSERR, "read(hook)");
|
||||
err(EX_OSERR, "reading hook \"%s\"", hook);
|
||||
if (rl == 0)
|
||||
errx(EX_OSERR, "EOF from hook \"%s\"?", hook);
|
||||
|
||||
/* Write packet to stdout */
|
||||
printf("Rec'd data packet on hook \"%s\":\n", hook);
|
||||
DumpAscii(buf, rl);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Get any user input */
|
||||
@ -495,7 +456,7 @@ QuitCmd(int ac, char **av)
|
||||
/*
|
||||
* Dump data in hex and ASCII form
|
||||
*/
|
||||
static void
|
||||
void
|
||||
DumpAscii(const u_char *buf, int len)
|
||||
{
|
||||
char ch, sbuf[100];
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
#include "ngctl.h"
|
||||
|
||||
#define BUF_SIZE 1024
|
||||
#define BUF_SIZE 4096
|
||||
|
||||
static int MsgCmd(int ac, char **av);
|
||||
|
||||
@ -80,7 +80,67 @@ MsgCmd(int ac, char **av)
|
||||
return(CMDRTN_ERROR);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read and display the next incoming control message
|
||||
*/
|
||||
void
|
||||
MsgRead()
|
||||
{
|
||||
u_char buf[2 * sizeof(struct ng_mesg) + BUF_SIZE];
|
||||
struct ng_mesg *const m = (struct ng_mesg *)buf;
|
||||
struct ng_mesg *const ascii = (struct ng_mesg *)m->data;
|
||||
char path[NG_PATHLEN+1];
|
||||
|
||||
/* Get incoming message (in binary form) */
|
||||
if (NgRecvMsg(csock, m, sizeof(buf), path) < 0) {
|
||||
warn("recv incoming message");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ask originating node to convert message to ASCII */
|
||||
if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
|
||||
NGM_BINARY2ASCII, m, sizeof(*m) + m->header.arglen) < 0
|
||||
|| NgRecvMsg(csock, m, sizeof(buf), NULL) < 0) {
|
||||
printf("Rec'd %s %d from \"%s\":\n",
|
||||
(m->header.flags & NGF_RESP) != 0 ? "response" : "command",
|
||||
m->header.cmd, path);
|
||||
if (m->header.arglen == 0)
|
||||
printf("No arguments\n");
|
||||
else
|
||||
DumpAscii(m->data, m->header.arglen);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Display message in ASCII form */
|
||||
printf("Rec'd %s \"%s\" (%d) from \"%s\":\n",
|
||||
(ascii->header.flags & NGF_RESP) != 0 ? "response" : "command",
|
||||
ascii->header.cmdstr, ascii->header.cmd, path);
|
||||
if (*ascii->data != '\0')
|
||||
printf("Args:\t%s\n", ascii->data);
|
||||
else
|
||||
printf("No arguments\n");
|
||||
}
|
||||
|
||||
|
@ -93,3 +93,7 @@ extern const struct ngcmd quit_cmd;
|
||||
/* Data and control sockets */
|
||||
extern int csock, dsock;
|
||||
|
||||
/* Misc functions */
|
||||
extern void MsgRead(void);
|
||||
extern void DumpAscii(const u_char *buf, int len);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user