/* vi: set ts=4 :*/
/* Toybox infrastructure.
 *
 * Copyright 2006 Rob Landley <rob@landley.net>
 */

#include "toys.h"

// Populate toy_list[].

#undef NEWTOY
#undef OLDTOY
#define NEWTOY(name, opts, flags) {#name, name##_main, opts, flags},
#define OLDTOY(name, oldname, opts, flags) {#name, oldname##_main, opts, flags},

struct toy_list toy_list[] = {
#include "generated/newtoys.h"
};

#define TOY_LIST_LEN (sizeof(toy_list)/sizeof(struct toy_list))

// global context for this applet.

struct toy_context toys;
union global_union this;
char toybuf[4096];

struct toy_list *toy_find(char *name)
{
	int top, bottom, middle;

	// If the name starts with "toybox" accept that as a match.  Otherwise
	// skip the first entry, which is out of order.

	if (!strncmp(name,"toybox",6)) return toy_list;
	bottom = 1;

	// Binary search to find this applet.

	top = TOY_LIST_LEN-1;
	for (;;) {
		int result;

		middle = (top+bottom)/2;
		if (middle<bottom || middle>top) return NULL;
		result = strcmp(name,toy_list[middle].name);
		if (!result) return toy_list+middle;
		if (result<0) top=--middle;
		else bottom = ++middle;
	}
}

// Figure out whether or not anything is using the option parsing logic,
// because the compiler can't figure out whether or not to optimize it away
// on its' own.  NEED_OPTIONS becomes a constant allowing if() to optimize
// stuff out via dead code elimination.

#undef NEWTOY
#undef OLDTOY
#define NEWTOY(name, opts, flags) opts ||
#define OLDTOY(name, oldname, opts, flags) opts ||
static const int NEED_OPTIONS =
#include "generated/newtoys.h"
0;  // Ends the opts || opts || opts...

// Setup toybox global state for this command.

void toy_init(struct toy_list *which, char *argv[])
{
	// Drop permissions for non-suid commands.

	if (CFG_TOYBOX_SUID) {
		uid_t uid = getuid(), euid = geteuid();

		if (!(which->flags & TOYFLAG_STAYROOT)) {
			if (uid != euid) xsetuid(euid=uid);
		} else if (CFG_TOYBOX_DEBUG && uid)
			error_exit("Not installed suid root");

		if ((which->flags & TOYFLAG_NEEDROOT) && euid)
			error_exit("Not root");
	}

	// Free old toys contents (to be reentrant)

	if (toys.optargs != toys.argv+1) free(toys.optargs);
	bzero(&toys, sizeof(struct toy_context));

	toys.which = which;
	toys.argv = argv;
	if (NEED_OPTIONS && which->options) get_optflags();
	else toys.optargs = argv+1;
	if (which->flags & TOYFLAG_UMASK) toys.old_umask = umask(0);
}

// Like exec() but runs an internal toybox command instead of another file.
// Only returns if it can't find the command, otherwise exit() when done.
void toy_exec(char *argv[])
{
	struct toy_list *which;

	which = toy_find(argv[0]);
	if (!which) return;
	toy_init(which, argv);
	toys.which->toy_main();
	exit(toys.exitval);
}

// Multiplexer command, first argument is command to run, rest are args to that.
// If first argument starts with - output list of command install paths.

void toybox_main(void)
{
	static char *toy_paths[]={"usr/","bin/","sbin/",0};
	int i, len = 0;

	if (toys.argv[1]) {
		if (toys.argv[1][0]!='-') {
			toy_exec(toys.argv+1);
			toys.which = toy_list;
			error_exit("Unknown command %s",toys.argv[1]);
		}
	}

	// Output list of applets.
	for (i=1; i<TOY_LIST_LEN; i++) {
		int fl = toy_list[i].flags;
		if (fl & TOYMASK_LOCATION) {
			if (toys.argv[1]) {
				int j;
				for (j=0; toy_paths[j]; j++)
					if (fl & (1<<j)) len += printf("%s", toy_paths[j]);
			}
			len += printf("%s ",toy_list[i].name);
			if (len>65) {
				putchar('\n');
				len=0;
			}
		}
	}
	putchar('\n');
}

int main(int argc, char *argv[])
{
	// Artificial scope to eat less stack for things we call
	{
		char *name;

		// Trim path off of command name
		name = strrchr(argv[0], '/');
		if (!name) name=argv[0];
		else name++;
		argv[0] = name;
	}

	// Call the multiplexer, adjusting this argv[] to be its' argv[1].
	// (It will adjust it back before calling toy_exec().)
	toys.argv = argv-1;
	toybox_main();
	return 0;
}
