144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf * src/nl-qdisc-delete.c     Delete Queuing Disciplines
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
98808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
128808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h>
138808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/qdisc.h>
148808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/link.h>
1510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
1610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic int quiet = 0, default_yes = 0, deleted = 0, interactive = 0;
1710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstruct nl_sock *sock;
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1944d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void print_usage(void)
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	printf(
2210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Usage: nl-qdisc-delete [OPTION]... [QDISC]\n"
2310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"\n"
2410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Options\n"
2510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -i, --interactive     Run interactively\n"
2610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"     --yes             Set default answer to yes\n"
2710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -q, --quiet           Do not print informal notifications\n"
2810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -h, --help            Show this help\n"
2910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -v, --version         Show versioning information\n"
3010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"\n"
3110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"QDisc Options\n"
3210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -d, --dev=DEV         Device the qdisc is attached to\n"
3310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -p, --parent=HANDLE   Identifier of parent qdisc\n"
3410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -H, --handle=HANDLE   Identifier\n"
3510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -k, --kind=NAME       Kind of qdisc (e.g. pfifo_fast)\n"
3610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	);
3710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
3810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	exit(0);
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf
4110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic void delete_cb(struct nl_object *obj, void *arg)
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
4310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct rtnl_qdisc *qdisc = nl_object_priv(obj);
4410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct nl_dump_params params = {
45d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		.dp_type = NL_DUMP_LINE,
4610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		.dp_fd = stdout,
4710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	};
4810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	int err;
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf
508808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	if (interactive && !nl_cli_confirm(obj, &params, default_yes))
5110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		return;
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf
5310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	if ((err = rtnl_qdisc_delete(sock, qdisc)) < 0)
548808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		nl_cli_fatal(err, "Unable to delete qdisc: %s\n", nl_geterror(err));
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf
5610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	if (!quiet) {
5710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		printf("Deleted ");
5810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		nl_object_dump(obj, &params);
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
6044d362409d5469aed47d19e7908d19bd194493aThomas Graf
6110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	deleted++;
6210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf}
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf
6410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafint main(int argc, char *argv[])
6510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf{
6610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct rtnl_qdisc *qdisc;
6710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct nl_cache *link_cache, *qdisc_cache;
6810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
698808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	sock = nl_cli_alloc_socket();
708808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	nl_cli_connect(sock, NETLINK_ROUTE);
718808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	link_cache = nl_cli_link_alloc_cache(sock);
728808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	qdisc_cache = nl_cli_qdisc_alloc_cache(sock);
738808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf 	qdisc = nl_cli_qdisc_alloc();
7410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
7510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	for (;;) {
7610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		int c, optidx = 0;
7710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		enum {
7810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			ARG_YES = 257,
7910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		};
8010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		static struct option long_opts[] = {
8110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "interactive", 0, 0, 'i' },
8210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "yes", 0, 0, ARG_YES },
8310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "quiet", 0, 0, 'q' },
8410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "help", 0, 0, 'h' },
8510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "version", 0, 0, 'v' },
8610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "dev", 1, 0, 'd' },
8710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "parent", 1, 0, 'p' },
8810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "handle", 1, 0, 'H' },
8910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "kind", 1, 0, 'k' },
9010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ 0, 0, 0, 0 }
9110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		};
9210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
9310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		c = getopt_long(argc, argv, "iqhvd:p:H:k:", long_opts, &optidx);
9410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		if (c == -1)
9510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			break;
9644d362409d5469aed47d19e7908d19bd194493aThomas Graf
9710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		switch (c) {
9810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case 'i': interactive = 1; break;
9910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case ARG_YES: default_yes = 1; break;
10010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case 'q': quiet = 1; break;
10110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case 'h': print_usage(); break;
1028808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'v': nl_cli_print_version(); break;
1038808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'd': nl_cli_qdisc_parse_dev(qdisc, link_cache, optarg); break;
1048808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'p': nl_cli_qdisc_parse_parent(qdisc, optarg); break;
1058808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'H': nl_cli_qdisc_parse_handle(qdisc, optarg); break;
1068808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'k': nl_cli_qdisc_parse_kind(qdisc, optarg); break;
10710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		}
10810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf 	}
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf
11010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	nl_cache_foreach_filter(qdisc_cache, OBJ_CAST(qdisc), delete_cb, NULL);
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf
11210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	if (!quiet)
11310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		printf("Deleted %d qdiscs\n", deleted);
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf
11510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	return 0;
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
117