1/* vi: set sw=4 ts=4: */ 2/* 3 * Utility routines. 4 * 5 * Copyright (C) tons of folks. Tracking down who wrote what 6 * isn't something I'm going to worry about... If you wrote something 7 * here, please feel free to acknowledge your work. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 * 23 * Based in part on code from sash, Copyright (c) 1999 by David I. Bell 24 * Permission has been granted to redistribute this code under the GPL. 25 * 26 */ 27 28#include <stdio.h> 29#include <stdlib.h> 30#include <string.h> 31#include "busybox.h" 32 33#undef APPLET 34#undef APPLET_NOUSAGE 35#undef PROTOTYPES 36#include "applets.h" 37 38struct BB_applet *applet_using; 39 40/* The -1 arises because of the {0,NULL,0,-1} entry above. */ 41const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); 42 43extern void show_usage(void) 44{ 45 const char *format_string; 46 const char *usage_string = usage_messages; 47 int i; 48 /* From busybox.c */ 49 extern int been_there_done_that; 50 51 if (strcmp(applet_using->name, "busybox")==0) { 52 been_there_done_that=1; 53 busybox_main(0, NULL); 54 } 55 56 for (i = applet_using - applets; i > 0; ) { 57 if (!*usage_string++) { 58 --i; 59 } 60 } 61 format_string = "%s\n\nUsage: %s %s\n\n"; 62 if(*usage_string == 0) 63 format_string = "%s\n\nNo help available.\n\n"; 64 fprintf(stderr, format_string, 65 full_version, applet_using->name, usage_string); 66 exit(EXIT_FAILURE); 67} 68 69static int applet_name_compare(const void *x, const void *y) 70{ 71 const char *name = x; 72 const struct BB_applet *applet = y; 73 74 return strcmp(name, applet->name); 75} 76 77extern const size_t NUM_APPLETS; 78 79struct BB_applet *find_applet_by_name(const char *name) 80{ 81 return bsearch(name, applets, NUM_APPLETS, sizeof(struct BB_applet), 82 applet_name_compare); 83} 84 85void run_applet_by_name(const char *name, int argc, char **argv) 86{ 87 static int recurse_level = 0; 88 89 recurse_level++; 90 /* Do a binary search to find the applet entry given the name. */ 91 if ((applet_using = find_applet_by_name(name)) != NULL) { 92 applet_name = applet_using->name; 93 if (argv[1] && strcmp(argv[1], "--help") == 0) { 94 show_usage(); 95 } 96 exit((*(applet_using->main)) (argc, argv)); 97 } 98 /* Just in case they have renamed busybox - Check argv[1] */ 99 if (recurse_level == 1) { 100 run_applet_by_name("busybox", argc, argv); 101 } 102 recurse_level = 0; 103} 104 105 106/* END CODE */ 107/* 108Local Variables: 109c-file-style: "linux" 110c-basic-offset: 4 111tab-width: 4 112End: 113*/ 114