(void)par;
if (arg == NULL) {
- /* Quote the string if we have more than one socket */
- if (heritage.nsocks > 1)
- cli_out(cli, "\"%s\"", master.listen_address);
- else
- cli_out(cli, "%s", master.listen_address);
+ cli_quote(cli, master.listen_address);
return;
}
int j, n;
if (VSS_parse(av[i], &host, &port) != 0) {
- cli_out(cli, "Invalid listen address \"%s\"", av[i]);
+ cli_out(cli, "Invalid listen address ");
+ cli_quote(cli, av[i]);
cli_result(cli, CLIS_PARAM);
break;
}
free(host);
free(port);
if (n == 0) {
- cli_out(cli, "Invalid listen address \"%s\"", av[i]);
+ cli_out(cli, "Invalid listen address ");
+ cli_quote(cli, av[i]);
cli_result(cli, CLIS_PARAM);
break;
}
/* XXX should have tweak_generic_string */
(void)par;
if (arg == NULL) {
- cli_out(cli, "%s", mgt_cc_cmd);
+ cli_quote(cli, mgt_cc_cmd);
} else {
free(mgt_cc_cmd);
mgt_cc_cmd = strdup(arg);
/* The implementation must provide these functions */
void cli_out(struct cli *cli, const char *fmt, ...);
+void cli_quote(struct cli *cli, const char *str);
void cli_param(struct cli *cli);
void cli_result(struct cli *cli, unsigned r);
va_end(ap);
}
+void
+cli_quote(struct cli *cli, const char *s)
+{
+ const char *q;
+ int quote = 0;
+
+ for (q = s; *q != '\0'; q++) {
+ if (!isgraph(*q) || *q == '"') {
+ quote++;
+ break;
+ }
+ }
+ if (!quote) {
+ (void)vsb_cat(cli->sb, s);
+ return;
+ }
+ (void)vsb_putc(cli->sb, '"');
+ for (q = s; *q != '\0'; q++) {
+ switch (*q) {
+ case ' ':
+ (void)vsb_putc(cli->sb, *q);
+ break;
+ case '\\':
+ case '"':
+ (void)vsb_putc(cli->sb, '\\');
+ (void)vsb_putc(cli->sb, *q);
+ break;
+ case '\n':
+ (void)vsb_cat(cli->sb, "\\n");
+ break;
+ case '\r':
+ (void)vsb_cat(cli->sb, "\\r");
+ break;
+ case '\t':
+ (void)vsb_cat(cli->sb, "\\t");
+ break;
+ default:
+ if (isgraph(*q))
+ (void)vsb_putc(cli->sb, *q);
+ else
+ (void)vsb_printf(cli->sb, "\\%o", *q);
+ break;
+ }
+ }
+ (void)vsb_putc(cli->sb, '"');
+}
+
void
cli_result(struct cli *cli, unsigned res)
{
printf("CLI result = %d\n", res);
}
-
void
cli_param(struct cli *cli)
{