This adds a new "stdio" mode to cxgbtool - it's an interactive mode
meant primarily for _non_ interactive use. Scripts that run cxgbtool repeatedly to perform register r/w or mdio will benefit from this. Instead of fork/exec'ing a new cxgbtool for every regio/mdio you can simply open a pair of pipes to/from cxgbtool and run cmds over them. Approved by: gnn (mentor)
This commit is contained in:
parent
98c230c87e
commit
bc62d44240
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=194928
@ -1408,26 +1408,11 @@ static int get_up_ioqs(int argc, char *argv[], int start_arg, const char *iff_na
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
static int
|
||||
run_cmd(int argc, char *argv[], const char *iff_name)
|
||||
{
|
||||
int r = -1;
|
||||
const char *iff_name;
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if (argc == 2) {
|
||||
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
|
||||
usage(stdout);
|
||||
if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) {
|
||||
printf("%s version %s\n", PROGNAME, VERSION);
|
||||
printf("%s\n", COPYRIGHT);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (argc < 3) usage(stderr);
|
||||
|
||||
iff_name = argv[1];
|
||||
if (!strcmp(argv[2], "reg"))
|
||||
r = register_io(argc, argv, 3, iff_name);
|
||||
else if (!strcmp(argv[2], "mdio"))
|
||||
@ -1474,5 +1459,85 @@ int main(int argc, char *argv[])
|
||||
if (r == -1)
|
||||
usage(stderr);
|
||||
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
run_cmd_loop(int argc, char *argv[], const char *iff_name)
|
||||
{
|
||||
int n, i;
|
||||
char buf[64];
|
||||
char *args[8], *s;
|
||||
|
||||
args[0] = argv[0];
|
||||
args[1] = argv[1];
|
||||
|
||||
/*
|
||||
* Fairly simplistic loop. Displays a "> " prompt and processes any
|
||||
* input as a cxgbtool command. You're supposed to enter only the part
|
||||
* after "cxgbtool cxgbX". Use "quit" or "exit" to exit. Any error in
|
||||
* the command will also terminate cxgbtool.
|
||||
*/
|
||||
for (;;) {
|
||||
fprintf(stdout, "> ");
|
||||
fflush(stdout);
|
||||
n = read(STDIN_FILENO, buf, sizeof(buf));
|
||||
if (n > sizeof(buf) - 1) {
|
||||
fprintf(stdout, "too much input.\n");
|
||||
return (0);
|
||||
} else if (n <= 0)
|
||||
return (0);
|
||||
|
||||
if (buf[--n] != '\n')
|
||||
continue;
|
||||
else
|
||||
buf[n] = 0;
|
||||
|
||||
s = &buf[0];
|
||||
for (i = 2; i < sizeof(args)/sizeof(args[0]) - 1; i++) {
|
||||
while (s && (*s == ' ' || *s == '\t'))
|
||||
s++;
|
||||
if ((args[i] = strsep(&s, " \t")) == NULL)
|
||||
break;
|
||||
}
|
||||
args[sizeof(args)/sizeof(args[0]) - 1] = 0;
|
||||
|
||||
if (!strcmp(args[2], "quit") || !strcmp(args[2], "exit"))
|
||||
return (0);
|
||||
|
||||
(void) run_cmd(i, args, iff_name);
|
||||
}
|
||||
|
||||
/* Can't really get here */
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int r = -1;
|
||||
const char *iff_name;
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
if (argc == 2) {
|
||||
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
|
||||
usage(stdout);
|
||||
if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) {
|
||||
printf("%s version %s\n", PROGNAME, VERSION);
|
||||
printf("%s\n", COPYRIGHT);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (argc < 3) usage(stderr);
|
||||
|
||||
iff_name = argv[1];
|
||||
|
||||
if (argc == 3 && !strcmp(argv[2], "stdio"))
|
||||
r = run_cmd_loop(argc, argv, iff_name);
|
||||
else
|
||||
r = run_cmd(argc, argv, iff_name);
|
||||
|
||||
return (r);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user