17f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt/*
27f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt * Common hostapd/wpa_supplicant command line interface functions
37f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
47f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt *
57f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt * This software may be distributed under the terms of the BSD license.
67f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt * See README for more details.
77f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt */
87f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
97f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt#include "includes.h"
107f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
117f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt#include "utils/common.h"
127f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt#include "common/cli.h"
137f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
147f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
157f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtconst char *const cli_license =
167f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
177f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"See README for more details.\n";
187f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
197f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtconst char *const cli_full_license =
207f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
217f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n"
227f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
237f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"modification, are permitted provided that the following conditions are\n"
247f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"met:\n"
257f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n"
267f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
277f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
287f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n"
297f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
307f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
317f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
327f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n"
337f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
347f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
357f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"   derived from this software without specific prior written permission.\n"
367f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n"
377f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
387f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
397f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
407f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
417f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
427f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
437f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
447f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
457f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
467f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
477f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
487f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt"\n";
497f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
507f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
517f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtvoid cli_txt_list_free(struct cli_txt_entry *e)
527f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
537f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	dl_list_del(&e->list);
547f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_free(e->txt);
557f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_free(e);
567f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
577f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
587f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
597f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtvoid cli_txt_list_flush(struct dl_list *list)
607f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
617f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	struct cli_txt_entry *e;
627f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
637f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	while ((e = dl_list_first(list, struct cli_txt_entry, list)))
647f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		cli_txt_list_free(e);
657f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
667f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
677f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
687f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtstruct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list,
697f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt					const char *txt)
707f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
717f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	struct cli_txt_entry *e;
727f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
737f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
747f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (os_strcmp(e->txt, txt) == 0)
757f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			return e;
767f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
777f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return NULL;
787f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
797f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
807f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
817f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtvoid cli_txt_list_del(struct dl_list *txt_list, const char *txt)
827f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
837f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	struct cli_txt_entry *e;
847f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
857f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
867f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (e)
877f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		cli_txt_list_free(e);
887f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
897f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
907f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
917f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtvoid cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
927f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
937f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	u8 addr[ETH_ALEN];
947f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char buf[18];
957f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
967f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
977f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return;
987f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
997f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1007f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1017f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1027f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1037f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtvoid cli_txt_list_del_word(struct dl_list *txt_list, const char *txt,
1047f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			   int separator)
1057f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1067f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	const char *end;
1077f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char *buf;
1087f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1097f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	end = os_strchr(txt, separator);
1107f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (end == NULL)
1117f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		end = txt + os_strlen(txt);
1127f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	buf = dup_binstr(txt, end - txt);
1137f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (buf == NULL)
1147f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return;
1157f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1167f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_free(buf);
1177f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1187f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1197f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1207f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint cli_txt_list_add(struct dl_list *txt_list, const char *txt)
1217f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1227f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	struct cli_txt_entry *e;
1237f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1247f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1257f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (e)
1267f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return 0;
1277f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	e = os_zalloc(sizeof(*e));
1287f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (e == NULL)
1297f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return -1;
1307f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	e->txt = os_strdup(txt);
1317f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (e->txt == NULL) {
1327f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		os_free(e);
1337f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return -1;
1347f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
1357f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	dl_list_add(txt_list, &e->list);
1367f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return 0;
1377f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1387f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1397f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1407f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
1417f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1427f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	u8 addr[ETH_ALEN];
1437f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char buf[18];
1447f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1457f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
1467f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return -1;
1477f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
1487f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return cli_txt_list_add(txt_list, buf);
1497f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1507f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1517f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1527f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint cli_txt_list_add_word(struct dl_list *txt_list, const char *txt,
1537f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			  int separator)
1547f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1557f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	const char *end;
1567f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char *buf;
1577f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	int ret;
1587f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1597f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	end = os_strchr(txt, separator);
1607f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (end == NULL)
1617f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		end = txt + os_strlen(txt);
1627f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	buf = dup_binstr(txt, end - txt);
1637f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (buf == NULL)
1647f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return -1;
1657f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	ret = cli_txt_list_add(txt_list, buf);
1667f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	os_free(buf);
1677f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return ret;
1687f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1697f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1707f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1717f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtchar ** cli_txt_list_array(struct dl_list *txt_list)
1727f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1737f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	unsigned int i, count = dl_list_len(txt_list);
1747f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char **res;
1757f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	struct cli_txt_entry *e;
1767f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1777f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
1787f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (res == NULL)
1797f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		return NULL;
1807f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1817f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	i = 0;
1827f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
1837f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		res[i] = os_strdup(e->txt);
1847f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (res[i] == NULL)
1857f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			break;
1867f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		i++;
1877f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
1887f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1897f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return res;
1907f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
1917f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1927f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1937f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint get_cmd_arg_num(const char *str, int pos)
1947f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
1957f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	int arg = 0, i;
1967f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
1977f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	for (i = 0; i <= pos; i++) {
1987f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (str[i] != ' ') {
1997f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			arg++;
2007f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			while (i <= pos && str[i] != ' ')
2017f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt				i++;
2027f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		}
2037f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
2047f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2057f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (arg > 0)
2067f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		arg--;
2077f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return arg;
2087f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
2097f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2107f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2117f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint write_cmd(char *buf, size_t buflen, const char *cmd, int argc, char *argv[])
2127f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
2137f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	int i, res;
2147f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char *pos, *end;
2157f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2167f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	pos = buf;
2177f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	end = buf + buflen;
2187f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2197f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	res = os_snprintf(pos, end - pos, "%s", cmd);
2207f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	if (os_snprintf_error(end - pos, res))
2217f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		goto fail;
2227f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	pos += res;
2237f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2247f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	for (i = 0; i < argc; i++) {
2257f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		res = os_snprintf(pos, end - pos, " %s", argv[i]);
2267f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (os_snprintf_error(end - pos, res))
2277f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			goto fail;
2287f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		pos += res;
2297f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
2307f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2317f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	buf[buflen - 1] = '\0';
2327f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return 0;
2337f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2347f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtfail:
2357f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	printf("Too long command\n");
2367f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return -1;
2377f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
2387f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2397f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2407f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidtint tokenize_cmd(char *cmd, char *argv[])
2417f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt{
2427f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	char *pos;
2437f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	int argc = 0;
2447f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2457f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	pos = cmd;
2467f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	for (;;) {
2477f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		while (*pos == ' ')
2487f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			pos++;
2497f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (*pos == '\0')
2507f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			break;
2517f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		argv[argc] = pos;
2527f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		argc++;
2537f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (argc == max_args)
2547f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			break;
2557f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (*pos == '"') {
2567f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
2577f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			if (pos2)
2587f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt				pos = pos2 + 1;
2597f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		}
2607f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		while (*pos != '\0' && *pos != ' ')
2617f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			pos++;
2627f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		if (*pos == ' ')
2637f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt			*pos++ = '\0';
2647f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	}
2657f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt
2667f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt	return argc;
2677f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt}
268