Contents of /trunk/mkinitrd-magellan/busybox/applets/busybox.c
Parent Directory | Revision Log
Revision 532 -
(show annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File MIME type: text/plain
File size: 3905 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years 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 | /* 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 | } |