Annotation of /trunk/mkinitrd-magellan/busybox/applets/busybox.c
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 3905 byte(s)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 3905 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | * BusyBox' main applet dispatcher. | ||
4 | * | ||
5 | * Licensed under GPLv2, see file LICENSE in this tarball for details. | ||
6 | */ | ||
7 | #include "busybox.h" | ||
8 | |||
9 | const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE; | ||
10 | |||
11 | #ifdef CONFIG_FEATURE_INSTALLER | ||
12 | /* | ||
13 | * directory table | ||
14 | * this should be consistent w/ the enum, busybox.h::Location, | ||
15 | * or else... | ||
16 | */ | ||
17 | static const char usr_bin [] = "/usr/bin"; | ||
18 | static const char usr_sbin[] = "/usr/sbin"; | ||
19 | |||
20 | static const char* const install_dir[] = { | ||
21 | &usr_bin [8], /* "", equivalent to "/" for concat_path_file() */ | ||
22 | &usr_bin [4], /* "/bin" */ | ||
23 | &usr_sbin[4], /* "/sbin" */ | ||
24 | usr_bin, | ||
25 | usr_sbin | ||
26 | }; | ||
27 | |||
28 | /* abstract link() */ | ||
29 | typedef int (*link_func)(const char *, const char *); | ||
30 | |||
31 | /* create (sym)links for each applet */ | ||
32 | static void install_links(const char *busybox, int use_symbolic_links) | ||
33 | { | ||
34 | link_func lf = link; | ||
35 | char *fpc; | ||
36 | int i; | ||
37 | int rc; | ||
38 | |||
39 | if (use_symbolic_links) | ||
40 | lf = symlink; | ||
41 | |||
42 | for (i = 0; applets[i].name != NULL; i++) { | ||
43 | fpc = concat_path_file( | ||
44 | install_dir[applets[i].location], | ||
45 | applets[i].name); | ||
46 | rc = lf(busybox, fpc); | ||
47 | if (rc != 0 && errno != EEXIST) { | ||
48 | bb_perror_msg("%s", fpc); | ||
49 | } | ||
50 | free(fpc); | ||
51 | } | ||
52 | } | ||
53 | |||
54 | #else | ||
55 | #define install_links(x,y) | ||
56 | #endif /* CONFIG_FEATURE_INSTALLER */ | ||
57 | |||
58 | int main(int argc, char **argv) | ||
59 | { | ||
60 | const char *s; | ||
61 | |||
62 | applet_name = argv[0]; | ||
63 | if (*applet_name == '-') | ||
64 | applet_name++; | ||
65 | while ((s = strchr(applet_name, '/'))) | ||
66 | applet_name = s + 1; | ||
67 | |||
68 | /* Set locale for everybody except 'init' */ | ||
69 | if (ENABLE_LOCALE_SUPPORT && getpid() != 1) | ||
70 | setlocale(LC_ALL, ""); | ||
71 | |||
72 | run_applet_by_name(applet_name, argc, argv); | ||
73 | bb_error_msg_and_die("applet not found"); | ||
74 | } | ||
75 | |||
76 | int busybox_main(int argc, char **argv) | ||
77 | { | ||
78 | /* | ||
79 | * This style of argument parsing doesn't scale well | ||
80 | * in the event that busybox starts wanting more --options. | ||
81 | * If someone has a cleaner approach, by all means implement it. | ||
82 | */ | ||
83 | if (ENABLE_FEATURE_INSTALLER && argc > 1 && !strcmp(argv[1], "--install")) { | ||
84 | int use_symbolic_links = 0; | ||
85 | char *busybox; | ||
86 | |||
87 | /* to use symlinks, or not to use symlinks... */ | ||
88 | if (argc > 2) | ||
89 | if (strcmp(argv[2], "-s") == 0) | ||
90 | use_symbolic_links = 1; | ||
91 | |||
92 | /* link */ | ||
93 | // XXX: FIXME: this is broken. Why not just use argv[0] ? | ||
94 | busybox = xreadlink("/proc/self/exe"); | ||
95 | if (!busybox) | ||
96 | return 1; | ||
97 | install_links(busybox, use_symbolic_links); | ||
98 | if (ENABLE_FEATURE_CLEAN_UP) | ||
99 | free(busybox); | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | /* Deal with --help. (Also print help when called with no arguments) */ | ||
104 | |||
105 | if (argc == 1 || !strcmp(argv[1], "--help") ) { | ||
106 | if (argc > 2) { | ||
107 | applet_name = argv[2]; | ||
108 | run_applet_by_name(applet_name, 2, argv); | ||
109 | } else { | ||
110 | const struct BB_applet *a; | ||
111 | int col, output_width; | ||
112 | |||
113 | output_width = 80 - sizeof("start-stop-daemon, ") - 8; | ||
114 | if (ENABLE_FEATURE_AUTOWIDTH) { | ||
115 | /* Obtain the terminal width. */ | ||
116 | get_terminal_width_height(0, &output_width, NULL); | ||
117 | /* leading tab and room to wrap */ | ||
118 | output_width -= sizeof("start-stop-daemon, ") + 8; | ||
119 | } | ||
120 | |||
121 | printf("%s\n" | ||
122 | "Copyright (C) 1998-2006 Erik Andersen, Rob Landley, and others.\n" | ||
123 | "Licensed under GPLv2. See source distribution for full notice.\n\n" | ||
124 | "Usage: busybox [function] [arguments]...\n" | ||
125 | " or: [function] [arguments]...\n\n" | ||
126 | "\tBusyBox is a multi-call binary that combines many common Unix\n" | ||
127 | "\tutilities into a single executable. Most people will create a\n" | ||
128 | "\tlink to busybox for each function they wish to use and BusyBox\n" | ||
129 | "\twill act like whatever it was invoked as!\n" | ||
130 | "\nCurrently defined functions:\n", bb_msg_full_version); | ||
131 | col = 0; | ||
132 | for (a = applets; a->name;) { | ||
133 | col += printf("%s%s", (col ? ", " : "\t"), a->name); | ||
134 | a++; | ||
135 | if (col > output_width && a->name) { | ||
136 | puts(","); | ||
137 | col = 0; | ||
138 | } | ||
139 | } | ||
140 | puts("\n"); | ||
141 | return 0; | ||
142 | } | ||
143 | } else run_applet_by_name(argv[1], argc - 1, argv + 1); | ||
144 | |||
145 | bb_error_msg_and_die("applet not found"); | ||
146 | } |