Blame plugin.c

Packit Service b7b338
#include <errno.h>
Packit Service b7b338
#include <stdio.h>
Packit Service b7b338
#include <stdlib.h>
Packit Service b7b338
#include <unistd.h>
Packit Service b7b338
Packit Service b7b338
#include "plugin.h"
Packit Service b7b338
#include "util/argconfig.h"
Packit Service b7b338
Packit Service b7b338
static int version(struct plugin *plugin)
Packit Service b7b338
{
Packit Service b7b338
	struct program *prog = plugin->parent;
Packit Service b7b338
Packit Service b7b338
	if (plugin->name)
Packit Service b7b338
		printf("%s %s version %s\n", prog->name, plugin->name, prog->version);
Packit Service b7b338
	else
Packit Service b7b338
		printf("%s version %s\n", prog->name, prog->version);
Packit Service b7b338
	return 0;
Packit Service b7b338
}
Packit Service b7b338
Packit Service b7b338
static int help(int argc, char **argv, struct plugin *plugin)
Packit Service b7b338
{
Packit Service b7b338
	char man[0x100];
Packit Service b7b338
	struct program *prog = plugin->parent;
Packit Service b7b338
	char *str = argv[1];
Packit Service b7b338
	int i;
Packit Service b7b338
Packit Service b7b338
	if (argc == 1) {
Packit Service b7b338
		general_help(plugin);
Packit Service b7b338
		return 0;
Packit Service b7b338
	}
Packit Service b7b338
Packit Service b7b338
	for (i = 0; plugin->commands[i]; i++) {
Packit Service b7b338
		struct command *cmd = plugin->commands[i];
Packit Service b7b338
Packit Service b7b338
		if (strcmp(str, cmd->name))
Packit Service b7b338
			if (!cmd->alias || (cmd->alias && strcmp(str, cmd->alias)))
Packit Service b7b338
				continue;
Packit Service b7b338
Packit Service b7b338
		if (plugin->name)
Packit Service b7b338
			sprintf(man, "%s-%s-%s", prog->name, plugin->name, cmd->name);
Packit Service b7b338
		else
Packit Service b7b338
			sprintf(man, "%s-%s", prog->name, cmd->name);
Packit Service b7b338
		if (execlp("man", "man", man, (char *)NULL))
Packit Service b7b338
			perror(argv[1]);
Packit Service b7b338
	}
Packit Service b7b338
	return 0;
Packit Service b7b338
}
Packit Service b7b338
Packit Service b7b338
void usage(struct plugin *plugin)
Packit Service b7b338
{
Packit Service b7b338
	struct program *prog = plugin->parent;
Packit Service b7b338
Packit Service b7b338
	if (plugin->name)
Packit Service b7b338
		printf("usage: %s %s %s\n", prog->name, plugin->name, prog->usage);
Packit Service b7b338
	else
Packit Service b7b338
		printf("usage: %s %s\n", prog->name, prog->usage);
Packit Service b7b338
}
Packit Service b7b338
Packit Service b7b338
void general_help(struct plugin *plugin)
Packit Service b7b338
{
Packit Service b7b338
	struct program *prog = plugin->parent;
Packit Service b7b338
	struct plugin *extension;
Packit Service b7b338
	unsigned i = 0;
Packit Service b7b338
	unsigned padding = 15;
Packit Service b7b338
	unsigned curr_length = 0;
Packit Service b7b338
	printf("%s-%s\n", prog->name, prog->version);
Packit Service b7b338
Packit Service b7b338
	usage(plugin);
Packit Service b7b338
Packit Service b7b338
	printf("\n");
Packit Service b7b338
	print_word_wrapped(prog->desc, 0, 0);
Packit Service b7b338
	printf("\n");
Packit Service b7b338
Packit Service b7b338
	if (plugin->desc) {
Packit Service b7b338
		printf("\n");
Packit Service b7b338
		print_word_wrapped(plugin->desc, 0, 0);
Packit Service b7b338
		printf("\n");
Packit Service b7b338
	}
Packit Service b7b338
Packit Service b7b338
	printf("\nThe following are all implemented sub-commands:\n");
Packit Service b7b338
Packit Service b7b338
	/* iterate through all commands to get maximum length */
Packit Service b7b338
	/* Still need to handle the case of ultra long strings, help messages, etc */
Packit Service b7b338
	for (; plugin->commands[i]; i++)
Packit Service b7b338
		if (padding < (curr_length = 2 + strlen(plugin->commands[i]->name)))
Packit Service b7b338
			padding = curr_length;
Packit Service b7b338
Packit Service b7b338
	i = 0;
Packit Service b7b338
	for (; plugin->commands[i]; i++)
Packit Service b7b338
		printf("  %-*s %s\n", padding, plugin->commands[i]->name,
Packit Service b7b338
					plugin->commands[i]->help);
Packit Service b7b338
Packit Service b7b338
	printf("  %-*s %s\n", padding, "version", "Shows the program version");
Packit Service b7b338
	printf("  %-*s %s\n", padding, "help", "Display this help");
Packit Service b7b338
	printf("\n");
Packit Service b7b338
Packit Service b7b338
	if (plugin->name)
Packit Service b7b338
		printf("See '%s %s help <command>' for more information on a specific command\n",
Packit Service b7b338
			prog->name, plugin->name);
Packit Service b7b338
	else
Packit Service b7b338
		printf("See '%s help <command>' for more information on a specific command\n",
Packit Service b7b338
			prog->name);
Packit Service b7b338
Packit Service b7b338
	/* The first plugin is the built-in. If we're not showing help for the
Packit Service b7b338
	 * built-in, don't show the program's other extensions */
Packit Service b7b338
	if (plugin->name)
Packit Service b7b338
		return;
Packit Service b7b338
Packit Service b7b338
	extension = prog->extensions->next;
Packit Service b7b338
	if (!extension)
Packit Service b7b338
		return;
Packit Service b7b338
Packit Service b7b338
	printf("\nThe following are all installed plugin extensions:\n");
Packit Service b7b338
	while (extension) {
Packit Service b7b338
		printf("  %-*s %s\n", 15, extension->name, extension->desc);
Packit Service b7b338
		extension = extension->next;
Packit Service b7b338
	}
Packit Service b7b338
	printf("\nSee '%s <plugin> help' for more information on a plugin\n",
Packit Service b7b338
			prog->name);
Packit Service b7b338
}
Packit Service b7b338
Packit Service b7b338
int handle_plugin(int argc, char **argv, struct plugin *plugin)
Packit Service b7b338
{
Packit Service b7b338
	unsigned i = 0;
Packit Service b7b338
	char *str = argv[0];
Packit Service b7b338
	char use[0x100];
Packit Service b7b338
Packit Service b7b338
	struct plugin *extension;
Packit Service b7b338
	struct program *prog = plugin->parent;
Packit Service b7b338
Packit Service b7b338
	if (!argc) {
Packit Service b7b338
		general_help(plugin);
Packit Service b7b338
		return 0;
Packit Service b7b338
	}
Packit Service b7b338
Packit Service b7b338
	if (!plugin->name)
Packit Service b7b338
		sprintf(use, "%s %s <device> [OPTIONS]", prog->name, str);
Packit Service b7b338
	else
Packit Service b7b338
		sprintf(use, "%s %s %s <device> [OPTIONS]", prog->name, plugin->name, str);
Packit Service b7b338
	argconfig_append_usage(use);
Packit Service b7b338
Packit Service b7b338
	/* translate --help and --version into commands */
Packit Service b7b338
	while (*str == '-')
Packit Service b7b338
		str++;
Packit Service b7b338
Packit Service b7b338
	if (!strcmp(str, "help"))
Packit Service b7b338
		return help(argc, argv, plugin);
Packit Service b7b338
	if (!strcmp(str, "version"))
Packit Service b7b338
		return version(plugin);
Packit Service b7b338
Packit Service b7b338
	for (; plugin->commands[i]; i++) {
Packit Service b7b338
		struct command *cmd = plugin->commands[i];
Packit Service b7b338
Packit Service b7b338
		if (strcmp(str, cmd->name))
Packit Service b7b338
			if (!cmd->alias || (cmd->alias && strcmp(str, cmd->alias)))
Packit Service b7b338
				continue;
Packit Service b7b338
Packit Service b7b338
		return (cmd->fn(argc, argv, cmd, plugin));
Packit Service b7b338
	}
Packit Service b7b338
Packit Service b7b338
	/* Check extensions only if this is running the built-in plugin */
Packit Service b7b338
	if (plugin->name) { 
Packit Service b7b338
		printf("ERROR: Invalid sub-command '%s' for plugin %s\n", str, plugin->name);
Packit Service b7b338
		return -ENOTTY;
Packit Service b7b338
        }
Packit Service b7b338
Packit Service b7b338
	extension = plugin->next;
Packit Service b7b338
	while (extension) {
Packit Service b7b338
		if (!strcmp(str, extension->name))
Packit Service b7b338
			return handle_plugin(argc - 1, &argv[1], extension);
Packit Service b7b338
		extension = extension->next;
Packit Service b7b338
	}
Packit Service b7b338
Packit Service b7b338
	/* If the command is executed with the extension name and
Packit Service b7b338
	 * command together ("plugin-command"), run the plug in */
Packit Service b7b338
	extension = plugin->next;
Packit Service b7b338
	while (extension) {
Packit Service b7b338
		if (!strncmp(str, extension->name, strlen(extension->name))) {
Packit Service b7b338
			argv[0] += strlen(extension->name);
Packit Service b7b338
			while (*argv[0] == '-')
Packit Service b7b338
				argv[0]++;
Packit Service b7b338
			return handle_plugin(argc, &argv[0], extension);
Packit Service b7b338
		}
Packit Service b7b338
		extension = extension->next;
Packit Service b7b338
	}
Packit Service b7b338
	printf("ERROR: Invalid sub-command '%s'\n", str);
Packit Service b7b338
	return -ENOTTY;
Packit Service b7b338
}