Blame show.c

Packit Service 80a84b
/*
Packit Service 80a84b
	Copyright(C) 2017, Red Hat, Inc.
Packit Service 80a84b
Packit Service 80a84b
	This program is free software: you can redistribute it and/or modify
Packit Service 80a84b
	it under the terms of the GNU General Public License as published by
Packit Service 80a84b
	the Free Software Foundation, either version 3 of the License, or
Packit Service 80a84b
	(at your option) any later version.
Packit Service 80a84b
Packit Service 80a84b
	This program is distributed in the hope that it will be useful,
Packit Service 80a84b
	but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 80a84b
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 80a84b
	GNU General Public License for more details.
Packit Service 80a84b
Packit Service 80a84b
	You should have received a copy of the GNU General Public License
Packit Service 80a84b
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 80a84b
*/
Packit Service 80a84b
Packit Service 80a84b
#include <getopt.h>
Packit Service 80a84b
#include <stdlib.h>
Packit Service 80a84b
#include <unistd.h>
Packit Service 80a84b
#include "objects.h"
Packit Service 80a84b
#include "utils.h"
Packit Service 80a84b
Packit Service 80a84b
struct {
Packit Service 80a84b
	bool debug;
Packit Service 80a84b
	bool hide_kabi;
Packit Service 80a84b
	bool hide_kabi_new;
Packit Service 80a84b
	FILE *file;
Packit Service 80a84b
} show_config = {false, false, false, NULL};
Packit Service 80a84b
Packit Service 80a84b
static void show_usage()
Packit Service 80a84b
{
Packit Service 80a84b
	printf("Usage:\n"
Packit Service 80a84b
	       "\tshow [options] kabi_file...\n"
Packit Service 80a84b
	       "\nOptions:\n"
Packit Service 80a84b
	       "    -h, --help:\t\tshow this message\n"
Packit Service 80a84b
	       "    -k, --hide-kabi:\thide changes made by RH_KABI_REPLACE()\n"
Packit Service 80a84b
	       "    -n, --hide-kabi-new:\n\t\t\thide the kabi trickery made by"
Packit Service 80a84b
	       " RH_KABI_REPLACE, but show the new field\n"
Packit Service 80a84b
Packit Service 80a84b
	       "    -d, --debug:\tprint the raw tree\n"
Packit Service 80a84b
	       "    --no-offset:\tdon't display the offset of struct fields\n");
Packit Service 80a84b
	exit(1);
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
/*
Packit Service 80a84b
 * Performs the show command
Packit Service 80a84b
 */
Packit Service 80a84b
int show(int argc, char **argv)
Packit Service 80a84b
{
Packit Service 80a84b
	obj_t *root;
Packit Service 80a84b
	int opt, opt_index, ret = 0;
Packit Service 80a84b
	struct option loptions[] = {
Packit Service 80a84b
		{"debug", no_argument, 0, 'd'},
Packit Service 80a84b
		{"hide-kabi", no_argument, 0, 'k'},
Packit Service 80a84b
		{"hide-kabi-new", no_argument, 0, 'n'},
Packit Service 80a84b
		{"help", no_argument, 0, 'h'},
Packit Service 80a84b
		{"no-offset", no_argument, &display_options.no_offset, 1},
Packit Service 80a84b
		{0, 0, 0, 0}
Packit Service 80a84b
	};
Packit Service 80a84b
Packit Service 80a84b
	memset(&display_options, 0, sizeof(display_options));
Packit Service 80a84b
Packit Service 80a84b
	while ((opt = getopt_long(argc, argv, "dknh",
Packit Service 80a84b
				  loptions, &opt_index)) != -1) {
Packit Service 80a84b
		switch (opt) {
Packit Service 80a84b
		case 0:
Packit Service 80a84b
			break;
Packit Service 80a84b
		case 'd':
Packit Service 80a84b
			show_config.debug = true;
Packit Service 80a84b
			break;
Packit Service 80a84b
		case 'n':
Packit Service 80a84b
			show_config.hide_kabi_new = true;
Packit Service 80a84b
			/* fall through */
Packit Service 80a84b
		case 'k':
Packit Service 80a84b
			show_config.hide_kabi = true;
Packit Service 80a84b
			break;
Packit Service 80a84b
		case 'h':
Packit Service 80a84b
		default:
Packit Service 80a84b
			show_usage();
Packit Service 80a84b
		}
Packit Service 80a84b
	}
Packit Service 80a84b
Packit Service 80a84b
	if (optind >= argc)
Packit Service 80a84b
		show_usage();
Packit Service 80a84b
Packit Service 80a84b
	while (optind < argc) {
Packit Service 80a84b
		char *fn = argv[optind++];
Packit Service 80a84b
Packit Service 80a84b
		show_config.file = safe_fopen(fn);
Packit Service 80a84b
Packit Service 80a84b
		root = obj_parse(show_config.file, fn);
Packit Service 80a84b
Packit Service 80a84b
		if (show_config.hide_kabi)
Packit Service 80a84b
			obj_hide_kabi(root, show_config.hide_kabi_new);
Packit Service 80a84b
Packit Service 80a84b
		if (show_config.debug)
Packit Service 80a84b
			obj_debug_tree(root);
Packit Service 80a84b
Packit Service 80a84b
		obj_print_tree(root);
Packit Service 80a84b
		if (optind < argc)
Packit Service 80a84b
			putchar('\n');
Packit Service 80a84b
Packit Service 80a84b
		obj_free(root);
Packit Service 80a84b
		fclose(show_config.file);
Packit Service 80a84b
	}
Packit Service 80a84b
Packit Service 80a84b
	return ret;
Packit Service 80a84b
}