Contents of /trunk/mkinitrd-magellan/busybox/include/libbb.h
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: 28018 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File MIME type: text/plain
File size: 28018 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 internal header file |
4 | * |
5 | * Based in part on code from sash, Copyright (c) 1999 by David I. Bell |
6 | * Permission has been granted to redistribute this code under the GPL. |
7 | * |
8 | * Licensed under the GPL version 2, see the file LICENSE in this tarball. |
9 | */ |
10 | #ifndef __LIBBUSYBOX_H__ |
11 | #define __LIBBUSYBOX_H__ 1 |
12 | |
13 | #include "platform.h" |
14 | |
15 | #include <ctype.h> |
16 | #include <dirent.h> |
17 | #include <errno.h> |
18 | #include <fcntl.h> |
19 | #include <inttypes.h> |
20 | #include <malloc.h> |
21 | #include <netdb.h> |
22 | #include <setjmp.h> |
23 | #include <signal.h> |
24 | #include <stdio.h> |
25 | #include <stdlib.h> |
26 | #include <stdarg.h> |
27 | #include <string.h> |
28 | #include <strings.h> |
29 | #include <sys/ioctl.h> |
30 | #include <sys/mman.h> |
31 | #include <sys/socket.h> |
32 | #include <sys/stat.h> |
33 | #include <sys/statfs.h> |
34 | #include <sys/time.h> |
35 | #include <sys/types.h> |
36 | #include <sys/wait.h> |
37 | #include <termios.h> |
38 | #include <time.h> |
39 | #include <unistd.h> |
40 | #include <utime.h> |
41 | |
42 | #if ENABLE_SELINUX |
43 | #include <selinux/selinux.h> |
44 | #endif |
45 | |
46 | #if ENABLE_LOCALE_SUPPORT |
47 | #include <locale.h> |
48 | #else |
49 | #define setlocale(x,y) ((void)0) |
50 | #endif |
51 | |
52 | #include "pwd_.h" |
53 | #include "grp_.h" |
54 | /* ifdef it out, because it may include <shadow.h> */ |
55 | /* and we may not even _have_ <shadow.h>! */ |
56 | #if ENABLE_FEATURE_SHADOWPASSWDS |
57 | #include "shadow_.h" |
58 | #endif |
59 | |
60 | /* Try to pull in PATH_MAX */ |
61 | #include <limits.h> |
62 | #include <sys/param.h> |
63 | #ifndef PATH_MAX |
64 | #define PATH_MAX 256 |
65 | #endif |
66 | |
67 | /* Tested to work correctly (IIRC :]) */ |
68 | #define MAXINT(T) (T)( \ |
69 | ((T)-1) > 0 \ |
70 | ? (T)-1 \ |
71 | : (T)~((T)1 << (sizeof(T)*8-1)) \ |
72 | ) |
73 | |
74 | #define MININT(T) (T)( \ |
75 | ((T)-1) > 0 \ |
76 | ? (T)0 \ |
77 | : ((T)1 << (sizeof(T)*8-1)) \ |
78 | ) |
79 | |
80 | /* Large file support */ |
81 | /* Note that CONFIG_LFS forces bbox to be built with all common ops |
82 | * (stat, lseek etc) mapped to "largefile" variants by libc. |
83 | * Practically it means that open() automatically has O_LARGEFILE added |
84 | * and all filesize/file_offset parameters and struct members are "large" |
85 | * (in today's world - signed 64bit). For full support of large files, |
86 | * we need a few helper #defines (below) and careful use of off_t |
87 | * instead of int/ssize_t. No lseek64(), O_LARGEFILE etc necessary */ |
88 | #if ENABLE_LFS |
89 | /* CONFIG_LFS is on */ |
90 | # if ULONG_MAX > 0xffffffff |
91 | /* "long" is long enough on this system */ |
92 | # define XATOOFF(a) xatoul_range(a, 0, LONG_MAX) |
93 | /* usage: sz = BB_STRTOOFF(s, NULL, 10); if (errno || sz < 0) die(); */ |
94 | # define BB_STRTOOFF bb_strtoul |
95 | # define STRTOOFF strtoul |
96 | /* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */ |
97 | # define OFF_FMT "l" |
98 | # else |
99 | /* "long" is too short, need "long long" */ |
100 | # define XATOOFF(a) xatoull_range(a, 0, LLONG_MAX) |
101 | # define BB_STRTOOFF bb_strtoull |
102 | # define STRTOOFF strtoull |
103 | # define OFF_FMT "ll" |
104 | # endif |
105 | #else |
106 | /* CONFIG_LFS is off */ |
107 | # if UINT_MAX == 0xffffffff |
108 | /* While sizeof(off_t) == sizeof(int), off_t is typedef'ed to long anyway. |
109 | * gcc will throw warnings on printf("%d", off_t). Crap... */ |
110 | # define XATOOFF(a) xatoi_u(a) |
111 | # define BB_STRTOOFF bb_strtou |
112 | # define STRTOOFF strtol |
113 | # define OFF_FMT "l" |
114 | # else |
115 | # define XATOOFF(a) xatoul_range(a, 0, LONG_MAX) |
116 | # define BB_STRTOOFF bb_strtoul |
117 | # define STRTOOFF strtol |
118 | # define OFF_FMT "l" |
119 | # endif |
120 | #endif |
121 | /* scary. better ideas? (but do *test* them first!) */ |
122 | #define OFF_T_MAX ((off_t)~((off_t)1 << (sizeof(off_t)*8-1))) |
123 | |
124 | /* This structure defines protocol families and their handlers. */ |
125 | struct aftype { |
126 | char *name; |
127 | char *title; |
128 | int af; |
129 | int alen; |
130 | char *(*print) (unsigned char *); |
131 | char *(*sprint) (struct sockaddr *, int numeric); |
132 | int (*input) (int type, char *bufp, struct sockaddr *); |
133 | void (*herror) (char *text); |
134 | int (*rprint) (int options); |
135 | int (*rinput) (int typ, int ext, char **argv); |
136 | |
137 | /* may modify src */ |
138 | int (*getmask) (char *src, struct sockaddr * mask, char *name); |
139 | |
140 | int fd; |
141 | char *flag_file; |
142 | }; |
143 | |
144 | /* This structure defines hardware protocols and their handlers. */ |
145 | struct hwtype { |
146 | char *name; |
147 | char *title; |
148 | int type; |
149 | int alen; |
150 | char *(*print) (unsigned char *); |
151 | int (*input) (char *, struct sockaddr *); |
152 | int (*activate) (int fd); |
153 | int suppress_null_addr; |
154 | }; |
155 | |
156 | /* Some useful definitions */ |
157 | #undef FALSE |
158 | #define FALSE ((int) 0) |
159 | #undef TRUE |
160 | #define TRUE ((int) 1) |
161 | #undef SKIP |
162 | #define SKIP ((int) 2) |
163 | |
164 | /* for mtab.c */ |
165 | #define MTAB_GETMOUNTPT '1' |
166 | #define MTAB_GETDEVICE '2' |
167 | |
168 | #define BUF_SIZE 8192 |
169 | #define EXPAND_ALLOC 1024 |
170 | |
171 | /* Macros for min/max. */ |
172 | #ifndef MIN |
173 | #define MIN(a,b) (((a)<(b))?(a):(b)) |
174 | #endif |
175 | |
176 | #ifndef MAX |
177 | #define MAX(a,b) (((a)>(b))?(a):(b)) |
178 | #endif |
179 | |
180 | /* buffer allocation schemes */ |
181 | #if ENABLE_FEATURE_BUFFERS_GO_ON_STACK |
182 | #define RESERVE_CONFIG_BUFFER(buffer,len) char buffer[len] |
183 | #define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char buffer[len] |
184 | #define RELEASE_CONFIG_BUFFER(buffer) ((void)0) |
185 | #else |
186 | #if ENABLE_FEATURE_BUFFERS_GO_IN_BSS |
187 | #define RESERVE_CONFIG_BUFFER(buffer,len) static char buffer[len] |
188 | #define RESERVE_CONFIG_UBUFFER(buffer,len) static unsigned char buffer[len] |
189 | #define RELEASE_CONFIG_BUFFER(buffer) ((void)0) |
190 | #else |
191 | #define RESERVE_CONFIG_BUFFER(buffer,len) char *buffer=xmalloc(len) |
192 | #define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len) |
193 | #define RELEASE_CONFIG_BUFFER(buffer) free (buffer) |
194 | #endif |
195 | #endif |
196 | |
197 | |
198 | #if defined(__GLIBC__) && __GLIBC__ < 2 |
199 | int vdprintf(int d, const char *format, va_list ap); |
200 | #endif |
201 | // This is declared here rather than #including <libgen.h> in order to avoid |
202 | // confusing the two versions of basename. See the dirname/basename man page |
203 | // for details. |
204 | char *dirname(char *path); |
205 | /* Include our own copy of struct sysinfo to avoid binary compatibility |
206 | * problems with Linux 2.4, which changed things. Grumble, grumble. */ |
207 | struct sysinfo { |
208 | long uptime; /* Seconds since boot */ |
209 | unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ |
210 | unsigned long totalram; /* Total usable main memory size */ |
211 | unsigned long freeram; /* Available memory size */ |
212 | unsigned long sharedram; /* Amount of shared memory */ |
213 | unsigned long bufferram; /* Memory used by buffers */ |
214 | unsigned long totalswap; /* Total swap space size */ |
215 | unsigned long freeswap; /* swap space still available */ |
216 | unsigned short procs; /* Number of current processes */ |
217 | unsigned short pad; /* Padding needed for m68k */ |
218 | unsigned long totalhigh; /* Total high memory size */ |
219 | unsigned long freehigh; /* Available high memory size */ |
220 | unsigned int mem_unit; /* Memory unit size in bytes */ |
221 | char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ |
222 | }; |
223 | extern int sysinfo(struct sysinfo* info); |
224 | |
225 | |
226 | extern void chomp(char *s); |
227 | extern void trim(char *s); |
228 | extern char *skip_whitespace(const char *); |
229 | extern char *skip_non_whitespace(const char *); |
230 | |
231 | extern const char *bb_mode_string(int mode); |
232 | extern int is_directory(const char *name, int followLinks, struct stat *statBuf); |
233 | extern int remove_file(const char *path, int flags); |
234 | extern int copy_file(const char *source, const char *dest, int flags); |
235 | extern int recursive_action(const char *fileName, int recurse, |
236 | int followLinks, int depthFirst, |
237 | int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData, int depth), |
238 | int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData, int depth), |
239 | void* userData, int depth); |
240 | extern int device_open(const char *device, int mode); |
241 | extern int get_console_fd(void); |
242 | extern char *find_block_device(char *path); |
243 | /* bb_copyfd_XX print read/write errors and return -1 if they occur */ |
244 | extern off_t bb_copyfd_eof(int fd1, int fd2); |
245 | extern off_t bb_copyfd_size(int fd1, int fd2, off_t size); |
246 | extern void bb_copyfd_exact_size(int fd1, int fd2, off_t size); |
247 | /* "short" copy can be detected by return value < size */ |
248 | /* this helper yells "short read!" if param is not -1 */ |
249 | extern void complain_copyfd_and_die(off_t sz) ATTRIBUTE_NORETURN; |
250 | extern char bb_process_escape_sequence(const char **ptr); |
251 | extern char *bb_get_last_path_component(char *path); |
252 | extern int ndelay_on(int fd); |
253 | extern int ndelay_off(int fd); |
254 | |
255 | |
256 | extern DIR *xopendir(const char *path); |
257 | extern DIR *warn_opendir(const char *path); |
258 | |
259 | char *xgetcwd(char *cwd); |
260 | char *xreadlink(const char *path); |
261 | char *xmalloc_realpath(const char *path); |
262 | extern void xstat(char *filename, struct stat *buf); |
263 | extern pid_t spawn(char **argv); |
264 | extern pid_t xspawn(char **argv); |
265 | extern int wait4pid(int pid); |
266 | extern void xsetgid(gid_t gid); |
267 | extern void xsetuid(uid_t uid); |
268 | extern void xdaemon(int nochdir, int noclose); |
269 | /* More clever/thorough xdaemon */ |
270 | extern void bb_sanitize_stdio_maybe_daemonize(int daemonize); |
271 | extern void bb_sanitize_stdio(void); |
272 | extern void bb_daemonize(void); |
273 | extern void xchdir(const char *path); |
274 | extern void xsetenv(const char *key, const char *value); |
275 | extern int xopen(const char *pathname, int flags); |
276 | extern int xopen3(const char *pathname, int flags, int mode); |
277 | extern off_t xlseek(int fd, off_t offset, int whence); |
278 | extern off_t fdlength(int fd); |
279 | |
280 | |
281 | extern int xsocket(int domain, int type, int protocol); |
282 | extern void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); |
283 | extern void xlisten(int s, int backlog); |
284 | extern void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen); |
285 | extern int xconnect_tcp_v4(struct sockaddr_in *s_addr); |
286 | extern struct hostent *xgethostbyname(const char *name); |
287 | extern struct hostent *xgethostbyname2(const char *name, int af); |
288 | extern int setsockopt_reuseaddr(int fd); |
289 | extern int setsockopt_broadcast(int fd); |
290 | |
291 | /* "new" (ipv4+ipv6) API */ |
292 | typedef struct len_and_sockaddr { |
293 | socklen_t len; |
294 | union { |
295 | struct sockaddr sa; |
296 | struct sockaddr_in sin; |
297 | #if ENABLE_FEATURE_IPV6 |
298 | struct sockaddr_in6 sin6; |
299 | #endif |
300 | }; |
301 | } len_and_sockaddr; |
302 | /* Create stream socket, and allocated suitable lsa |
303 | * (lsa of correct size and lsa->sa.sa_family (AF_INET/AF_INET6)) */ |
304 | int xsocket_stream(len_and_sockaddr **lsap); |
305 | /* Create server TCP socket bound to bindaddr:port. bindaddr can be NULL, |
306 | * numeric IP ("N.N.N.N") or numeric IPv6 address, |
307 | * and can have ":PORT" suffix (for IPv6 use "[X:X:...:X]:PORT"). |
308 | * If there is no suffix, port argument is used */ |
309 | extern int create_and_bind_stream_or_die(const char *bindaddr, int port); |
310 | /* Create client TCP socket connected to peer:port. Peer cannot be NULL. |
311 | * Peer can be numeric IP ("N.N.N.N"), numeric IPv6 address or hostname, |
312 | * and can have ":PORT" suffix (for IPv6 use "[X:X:...:X]:PORT"). |
313 | * If there is no suffix, port argument is used */ |
314 | extern int create_and_connect_stream_or_die(const char *peer, int port); |
315 | /* Connect to peer identified by lsa */ |
316 | extern int xconnect_stream(const len_and_sockaddr *lsa); |
317 | /* Return malloc'ed len_and_sockaddr with socket address of host:port |
318 | * Currently will return IPv4 or IPv6 sockaddrs only |
319 | * (depending on host), but in theory nothing prevents e.g. |
320 | * UNIX socket address being returned, IPX sockaddr etc... */ |
321 | extern len_and_sockaddr* host2sockaddr(const char *host, int port); |
322 | /* Assign sin[6]_port member if the socket is of corresponding type, |
323 | * otherwise noop. Useful for ftp. |
324 | * NB: does NOT do htons() internally, just direct assignment. */ |
325 | extern void set_nport(len_and_sockaddr *lsa, unsigned port); |
326 | /* Retrieve sin[6]_port or return -1 for non-inet lsa's */ |
327 | extern int get_nport(len_and_sockaddr *lsa); |
328 | extern char* xmalloc_sockaddr2host(const struct sockaddr *sa, socklen_t salen); |
329 | extern char* xmalloc_sockaddr2dotted(const struct sockaddr *sa, socklen_t salen); |
330 | |
331 | |
332 | extern char *xstrdup(const char *s); |
333 | extern char *xstrndup(const char *s, int n); |
334 | extern char *safe_strncpy(char *dst, const char *src, size_t size); |
335 | extern char *xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); |
336 | // gcc-4.1.1 still isn't good enough at optimizing it |
337 | // (+200 bytes compared to macro) |
338 | //static ATTRIBUTE_ALWAYS_INLINE |
339 | //int LONE_DASH(const char *s) { return s[0] == '-' && !s[1]; } |
340 | //static ATTRIBUTE_ALWAYS_INLINE |
341 | //int NOT_LONE_DASH(const char *s) { return s[0] != '-' || s[1]; } |
342 | #define LONE_DASH(s) ((s)[0] == '-' && !(s)[1]) |
343 | #define NOT_LONE_DASH(s) ((s)[0] != '-' || (s)[1]) |
344 | #define LONE_CHAR(s,c) ((s)[0] == (c) && !(s)[1]) |
345 | #define NOT_LONE_CHAR(s,c) ((s)[0] != (c) || (s)[1]) |
346 | |
347 | /* dmalloc will redefine these to it's own implementation. It is safe |
348 | * to have the prototypes here unconditionally. */ |
349 | extern void *xmalloc(size_t size); |
350 | extern void *xrealloc(void *old, size_t size); |
351 | extern void *xzalloc(size_t size); |
352 | |
353 | extern ssize_t safe_read(int fd, void *buf, size_t count); |
354 | extern ssize_t full_read(int fd, void *buf, size_t count); |
355 | extern void xread(int fd, void *buf, size_t count); |
356 | extern unsigned char xread_char(int fd); |
357 | extern char *reads(int fd, char *buf, size_t count); |
358 | extern ssize_t read_close(int fd, void *buf, size_t count); |
359 | extern ssize_t open_read_close(const char *filename, void *buf, size_t count); |
360 | extern void *xmalloc_open_read_close(const char *filename, size_t *sizep); |
361 | |
362 | extern ssize_t safe_write(int fd, const void *buf, size_t count); |
363 | extern ssize_t full_write(int fd, const void *buf, size_t count); |
364 | extern void xwrite(int fd, const void *buf, size_t count); |
365 | |
366 | /* Reads and prints to stdout till eof, then closes FILE. Exits on error: */ |
367 | extern void xprint_and_close_file(FILE *file); |
368 | extern char *xmalloc_fgets(FILE *file); |
369 | /* Read up to (and including) TERMINATING_STRING: */ |
370 | extern char *xmalloc_fgets_str(FILE *file, const char *terminating_string); |
371 | /* Chops off '\n' from the end, unlike fgets: */ |
372 | extern char *xmalloc_getline(FILE *file); |
373 | extern char *bb_get_chunk_from_file(FILE *file, int *end); |
374 | extern void die_if_ferror(FILE *file, const char *msg); |
375 | extern void die_if_ferror_stdout(void); |
376 | extern void xfflush_stdout(void); |
377 | extern void fflush_stdout_and_exit(int retval) ATTRIBUTE_NORETURN; |
378 | extern int fclose_if_not_stdin(FILE *file); |
379 | extern FILE *xfopen(const char *filename, const char *mode); |
380 | /* Prints warning to stderr and returns NULL on failure: */ |
381 | extern FILE *fopen_or_warn(const char *filename, const char *mode); |
382 | /* "Opens" stdin if filename is special, else just opens file: */ |
383 | extern FILE *fopen_or_warn_stdin(const char *filename); |
384 | |
385 | |
386 | extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen); |
387 | extern char *utoa(unsigned n); |
388 | extern void itoa_to_buf(int n, char *buf, unsigned buflen); |
389 | extern char *itoa(int n); |
390 | extern void smart_ulltoa5(unsigned long long ul, char buf[5]); |
391 | /* Put a string of hex bytes (ala "1b"), return advanced pointer */ |
392 | extern char *bin2hex(char *buf, const char *cp, int count); |
393 | |
394 | struct suffix_mult { |
395 | const char *suffix; |
396 | unsigned mult; |
397 | }; |
398 | #include "xatonum.h" |
399 | /* Specialized: */ |
400 | /* Using xatoi() instead of naive atoi() is not always convenient - |
401 | * in many places people want *non-negative* values, but store them |
402 | * in signed int. Therefore we need this one: |
403 | * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */ |
404 | int xatoi_u(const char *numstr); |
405 | /* Useful for reading port numbers */ |
406 | uint16_t xatou16(const char *numstr); |
407 | |
408 | |
409 | /* These parse entries in /etc/passwd and /etc/group. This is desirable |
410 | * for BusyBox since we want to avoid using the glibc NSS stuff, which |
411 | * increases target size and is often not needed on embedded systems. */ |
412 | long xuname2uid(const char *name); |
413 | long xgroup2gid(const char *name); |
414 | /* wrapper: allows string to contain numeric uid or gid */ |
415 | unsigned long get_ug_id(const char *s, long (*xname2id)(const char *)); |
416 | /* from chpst. Does not die, returns 0 on failure */ |
417 | struct bb_uidgid_t { |
418 | uid_t uid; |
419 | gid_t gid; |
420 | }; |
421 | int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok); |
422 | /* what is this? */ |
423 | /*extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);*/ |
424 | char *bb_getpwuid(char *name, long uid, int bufsize); |
425 | char *bb_getgrgid(char *group, long gid, int bufsize); |
426 | /* versions which cache results (useful for ps, ls etc) */ |
427 | const char* get_cached_username(uid_t uid); |
428 | const char* get_cached_groupname(gid_t gid); |
429 | void clear_username_cache(void); |
430 | /* internally usernames are saved in fixed-sized char[] buffers */ |
431 | enum { USERNAME_MAX_SIZE = 16 - sizeof(int) }; |
432 | |
433 | |
434 | enum { BB_GETOPT_ERROR = 0x80000000 }; |
435 | extern const char *opt_complementary; |
436 | #if ENABLE_GETOPT_LONG |
437 | extern const struct option *applet_long_options; |
438 | #endif |
439 | extern uint32_t option_mask32; |
440 | extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...); |
441 | |
442 | |
443 | typedef struct llist_s { |
444 | char *data; |
445 | struct llist_s *link; |
446 | } llist_t; |
447 | extern void llist_add_to(llist_t **old_head, void *data); |
448 | extern void llist_add_to_end(llist_t **list_head, void *data); |
449 | extern void *llist_pop(llist_t **elm); |
450 | extern void llist_free(llist_t *elm, void (*freeit)(void *data)); |
451 | extern llist_t* rev_llist(llist_t *list); |
452 | |
453 | enum { |
454 | LOGMODE_NONE = 0, |
455 | LOGMODE_STDIO = 1<<0, |
456 | LOGMODE_SYSLOG = 1<<1, |
457 | LOGMODE_BOTH = LOGMODE_SYSLOG + LOGMODE_STDIO, |
458 | }; |
459 | extern const char *msg_eol; |
460 | extern int logmode; |
461 | extern int die_sleep; |
462 | extern int xfunc_error_retval; |
463 | extern void sleep_and_die(void) ATTRIBUTE_NORETURN; |
464 | extern void bb_show_usage(void) ATTRIBUTE_NORETURN ATTRIBUTE_EXTERNALLY_VISIBLE; |
465 | extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); |
466 | extern void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); |
467 | extern void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); |
468 | extern void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); |
469 | extern void bb_vherror_msg(const char *s, va_list p); |
470 | extern void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); |
471 | extern void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); |
472 | extern void bb_perror_nomsg_and_die(void) ATTRIBUTE_NORETURN; |
473 | extern void bb_perror_nomsg(void); |
474 | extern void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); |
475 | /* These are used internally -- you shouldn't need to use them */ |
476 | extern void bb_verror_msg(const char *s, va_list p, const char *strerr); |
477 | extern void bb_vperror_msg(const char *s, va_list p); |
478 | extern void bb_vinfo_msg(const char *s, va_list p); |
479 | |
480 | |
481 | /* applets which are useful from another applets */ |
482 | extern int bb_cat(char** argv); |
483 | extern int bb_echo(char** argv); |
484 | extern int bb_test(int argc, char** argv); |
485 | |
486 | |
487 | /* Networking */ |
488 | int create_icmp_socket(void); |
489 | int create_icmp6_socket(void); |
490 | /* interface.c */ |
491 | struct aftype; |
492 | struct hwtype; |
493 | extern int interface_opt_a; |
494 | int display_interfaces(char *ifname); |
495 | struct aftype *get_aftype(const char *name); |
496 | const struct hwtype *get_hwtype(const char *name); |
497 | const struct hwtype *get_hwntype(int type); |
498 | |
499 | |
500 | #ifndef BUILD_INDIVIDUAL |
501 | extern struct BB_applet *find_applet_by_name(const char *name); |
502 | extern void run_applet_by_name(const char *name, int argc, char **argv); |
503 | #endif |
504 | |
505 | extern struct mntent *find_mount_point(const char *name, const char *table); |
506 | extern void erase_mtab(const char * name); |
507 | extern unsigned int tty_baud_to_value(speed_t speed); |
508 | extern speed_t tty_value_to_baud(unsigned int value); |
509 | extern void bb_warn_ignoring_args(int n); |
510 | |
511 | extern int get_linux_version_code(void); |
512 | |
513 | extern char *query_loop(const char *device); |
514 | extern int del_loop(const char *device); |
515 | extern int set_loop(char **device, const char *file, unsigned long long offset); |
516 | |
517 | |
518 | const char *make_human_readable_str(unsigned long long size, |
519 | unsigned long block_size, unsigned long display_unit); |
520 | |
521 | char *bb_askpass(int timeout, const char * prompt); |
522 | int bb_ask_confirmation(void); |
523 | int klogctl(int type, char * b, int len); |
524 | |
525 | extern int bb_parse_mode(const char* s, mode_t* theMode); |
526 | |
527 | char *concat_path_file(const char *path, const char *filename); |
528 | char *concat_subpath_file(const char *path, const char *filename); |
529 | char *last_char_is(const char *s, int c); |
530 | |
531 | int execable_file(const char *name); |
532 | char *find_execable(const char *filename); |
533 | int exists_execable(const char *filename); |
534 | |
535 | USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out); |
536 | int inflate(int in, int out); |
537 | |
538 | |
539 | /* NB: returns port in host byte order */ |
540 | unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port); |
541 | void bb_lookup_host(struct sockaddr_in *s_in, const char *host); |
542 | |
543 | int bb_make_directory(char *path, long mode, int flags); |
544 | |
545 | int get_signum(const char *name); |
546 | const char *get_signame(int number); |
547 | |
548 | char *bb_simplify_path(const char *path); |
549 | |
550 | #define FAIL_DELAY 3 |
551 | extern void bb_do_delay(int seconds); |
552 | extern void change_identity(const struct passwd *pw); |
553 | extern const char *change_identity_e2str(const struct passwd *pw); |
554 | extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args); |
555 | #if ENABLE_SELINUX |
556 | extern void renew_current_security_context(void); |
557 | extern void set_current_security_context(security_context_t sid); |
558 | #endif |
559 | extern int restricted_shell(const char *shell); |
560 | extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw); |
561 | extern int correct_password(const struct passwd *pw); |
562 | extern char *pw_encrypt(const char *clear, const char *salt); |
563 | extern int obscure(const char *old, const char *newval, const struct passwd *pwdp); |
564 | extern int index_in_str_array(const char * const string_array[], const char *key); |
565 | extern int index_in_substr_array(const char * const string_array[], const char *key); |
566 | extern void print_login_issue(const char *issue_file, const char *tty); |
567 | extern void print_login_prompt(void); |
568 | #ifdef BB_NOMMU |
569 | extern void vfork_daemon(int nochdir, int noclose); |
570 | extern void vfork_daemon_rexec(int nochdir, int noclose, |
571 | int argc, char **argv, char *foreground_opt); |
572 | #endif |
573 | extern int get_terminal_width_height(int fd, int *width, int *height); |
574 | |
575 | int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name); |
576 | void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name); |
577 | void reset_ino_dev_hashtable(void); |
578 | #ifdef __GLIBC__ |
579 | /* At least glibc has horrendously large inline for this, so wrap it */ |
580 | extern unsigned long long bb_makedev(unsigned int major, unsigned int minor); |
581 | #undef makedev |
582 | #define makedev(a,b) bb_makedev(a,b) |
583 | #endif |
584 | |
585 | |
586 | #ifndef COMM_LEN |
587 | #ifdef TASK_COMM_LEN |
588 | enum { COMM_LEN = TASK_COMM_LEN }; |
589 | #else |
590 | /* synchronize with sizeof(task_struct.comm) in /usr/include/linux/sched.h */ |
591 | enum { COMM_LEN = 16 }; |
592 | #endif |
593 | #endif |
594 | typedef struct { |
595 | DIR *dir; |
596 | /* Fields are set to 0/NULL if failed to determine (or not requested) */ |
597 | char *cmd; |
598 | unsigned long rss; |
599 | unsigned long stime, utime; |
600 | unsigned pid; |
601 | unsigned ppid; |
602 | unsigned pgid; |
603 | unsigned sid; |
604 | unsigned uid; |
605 | unsigned gid; |
606 | /* basename of executable file in call to exec(2), size from */ |
607 | /* sizeof(task_struct.comm) in /usr/include/linux/sched.h */ |
608 | char state[4]; |
609 | char comm[COMM_LEN]; |
610 | // user/group? - use passwd/group parsing functions |
611 | } procps_status_t; |
612 | enum { |
613 | PSSCAN_PID = 1 << 0, |
614 | PSSCAN_PPID = 1 << 1, |
615 | PSSCAN_PGID = 1 << 2, |
616 | PSSCAN_SID = 1 << 3, |
617 | PSSCAN_UIDGID = 1 << 4, |
618 | PSSCAN_COMM = 1 << 5, |
619 | PSSCAN_CMD = 1 << 6, |
620 | PSSCAN_STATE = 1 << 7, |
621 | PSSCAN_RSS = 1 << 8, |
622 | PSSCAN_STIME = 1 << 9, |
623 | PSSCAN_UTIME = 1 << 10, |
624 | /* These are all retrieved from proc/NN/stat in one go: */ |
625 | PSSCAN_STAT = PSSCAN_PPID | PSSCAN_PGID | PSSCAN_SID |
626 | | PSSCAN_COMM | PSSCAN_STATE |
627 | | PSSCAN_RSS | PSSCAN_STIME | PSSCAN_UTIME, |
628 | }; |
629 | procps_status_t* alloc_procps_scan(int flags); |
630 | void free_procps_scan(procps_status_t* sp); |
631 | procps_status_t* procps_scan(procps_status_t* sp, int flags); |
632 | pid_t *find_pid_by_name(const char* procName); |
633 | pid_t *pidlist_reverse(pid_t *pidList); |
634 | |
635 | |
636 | extern const char bb_uuenc_tbl_base64[]; |
637 | extern const char bb_uuenc_tbl_std[]; |
638 | void bb_uuencode(const unsigned char *s, char *store, const int length, const char *tbl); |
639 | |
640 | typedef struct sha1_ctx_t { |
641 | uint32_t count[2]; |
642 | uint32_t hash[5]; |
643 | uint32_t wbuf[16]; |
644 | } sha1_ctx_t; |
645 | void sha1_begin(sha1_ctx_t *ctx); |
646 | void sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx); |
647 | void *sha1_end(void *resbuf, sha1_ctx_t *ctx); |
648 | |
649 | typedef struct md5_ctx_t { |
650 | uint32_t A; |
651 | uint32_t B; |
652 | uint32_t C; |
653 | uint32_t D; |
654 | uint64_t total; |
655 | uint32_t buflen; |
656 | char buffer[128]; |
657 | } md5_ctx_t; |
658 | void md5_begin(md5_ctx_t *ctx); |
659 | void md5_hash(const void *data, size_t length, md5_ctx_t *ctx); |
660 | void *md5_end(void *resbuf, md5_ctx_t *ctx); |
661 | |
662 | uint32_t *crc32_filltable(int endian); |
663 | |
664 | |
665 | enum { /* DO NOT CHANGE THESE VALUES! cp.c depends on them. */ |
666 | FILEUTILS_PRESERVE_STATUS = 1, |
667 | FILEUTILS_DEREFERENCE = 2, |
668 | FILEUTILS_RECUR = 4, |
669 | FILEUTILS_FORCE = 8, |
670 | FILEUTILS_INTERACTIVE = 0x10, |
671 | FILEUTILS_MAKE_HARDLINK = 0x20, |
672 | FILEUTILS_MAKE_SOFTLINK = 0x40, |
673 | }; |
674 | #define FILEUTILS_CP_OPTSTR "pdRfils" |
675 | |
676 | extern const char *applet_name; |
677 | extern const char BB_BANNER[]; |
678 | |
679 | extern const char bb_msg_full_version[]; |
680 | extern const char bb_msg_memory_exhausted[]; |
681 | extern const char bb_msg_invalid_date[]; |
682 | extern const char bb_msg_read_error[]; |
683 | extern const char bb_msg_write_error[]; |
684 | extern const char bb_msg_unknown[]; |
685 | extern const char bb_msg_can_not_create_raw_socket[]; |
686 | extern const char bb_msg_perm_denied_are_you_root[]; |
687 | extern const char bb_msg_requires_arg[]; |
688 | extern const char bb_msg_invalid_arg[]; |
689 | extern const char bb_msg_standard_input[]; |
690 | extern const char bb_msg_standard_output[]; |
691 | |
692 | extern const char bb_str_default[]; |
693 | /* NB: (bb_hexdigits_upcase[i] | 0x20) -> lowercase hex digit */ |
694 | extern const char bb_hexdigits_upcase[]; |
695 | |
696 | extern const char bb_path_mtab_file[]; |
697 | extern const char bb_path_nologin_file[]; |
698 | extern const char bb_path_passwd_file[]; |
699 | extern const char bb_path_shadow_file[]; |
700 | extern const char bb_path_gshadow_file[]; |
701 | extern const char bb_path_group_file[]; |
702 | extern const char bb_path_securetty_file[]; |
703 | extern const char bb_path_motd_file[]; |
704 | extern const char bb_path_wtmp_file[]; |
705 | extern const char bb_dev_null[]; |
706 | |
707 | #ifndef BUFSIZ |
708 | #define BUFSIZ 4096 |
709 | #endif |
710 | extern char bb_common_bufsiz1[BUFSIZ+1]; |
711 | |
712 | /* You can change LIBBB_DEFAULT_LOGIN_SHELL, but don't use it, |
713 | * use bb_default_login_shell and following defines. |
714 | * If you change LIBBB_DEFAULT_LOGIN_SHELL, |
715 | * don't forget to change increment constant. */ |
716 | #define LIBBB_DEFAULT_LOGIN_SHELL "-/bin/sh" |
717 | extern const char bb_default_login_shell[]; |
718 | /* "/bin/sh" */ |
719 | #define DEFAULT_SHELL (bb_default_login_shell+1) |
720 | /* "sh" */ |
721 | #define DEFAULT_SHELL_SHORT_NAME (bb_default_login_shell+6) |
722 | |
723 | |
724 | #if ENABLE_FEATURE_DEVFS |
725 | # define CURRENT_VC "/dev/vc/0" |
726 | # define VC_1 "/dev/vc/1" |
727 | # define VC_2 "/dev/vc/2" |
728 | # define VC_3 "/dev/vc/3" |
729 | # define VC_4 "/dev/vc/4" |
730 | # define VC_5 "/dev/vc/5" |
731 | #if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__) |
732 | /* Yes, this sucks, but both SH (including sh64) and H8 have a SCI(F) for their |
733 | respective serial ports .. as such, we can't use the common device paths for |
734 | these. -- PFM */ |
735 | # define SC_0 "/dev/ttsc/0" |
736 | # define SC_1 "/dev/ttsc/1" |
737 | # define SC_FORMAT "/dev/ttsc/%d" |
738 | #else |
739 | # define SC_0 "/dev/tts/0" |
740 | # define SC_1 "/dev/tts/1" |
741 | # define SC_FORMAT "/dev/tts/%d" |
742 | #endif |
743 | # define VC_FORMAT "/dev/vc/%d" |
744 | # define LOOP_FORMAT "/dev/loop/%d" |
745 | # define LOOP_NAME "/dev/loop/" |
746 | # define FB_0 "/dev/fb/0" |
747 | #else |
748 | # define CURRENT_VC "/dev/tty0" |
749 | # define VC_1 "/dev/tty1" |
750 | # define VC_2 "/dev/tty2" |
751 | # define VC_3 "/dev/tty3" |
752 | # define VC_4 "/dev/tty4" |
753 | # define VC_5 "/dev/tty5" |
754 | #if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__) |
755 | # define SC_0 "/dev/ttySC0" |
756 | # define SC_1 "/dev/ttySC1" |
757 | # define SC_FORMAT "/dev/ttySC%d" |
758 | #else |
759 | # define SC_0 "/dev/ttyS0" |
760 | # define SC_1 "/dev/ttyS1" |
761 | # define SC_FORMAT "/dev/ttyS%d" |
762 | #endif |
763 | # define VC_FORMAT "/dev/tty%d" |
764 | # define LOOP_FORMAT "/dev/loop%d" |
765 | # define LOOP_NAME "/dev/loop" |
766 | # define FB_0 "/dev/fb0" |
767 | #endif |
768 | |
769 | /* The following devices are the same on devfs and non-devfs systems. */ |
770 | #define CURRENT_TTY "/dev/tty" |
771 | #define CONSOLE_DEV "/dev/console" |
772 | |
773 | |
774 | #ifndef RB_POWER_OFF |
775 | /* Stop system and switch power off if possible. */ |
776 | #define RB_POWER_OFF 0x4321fedc |
777 | #endif |
778 | |
779 | /* Make sure we call functions instead of macros. */ |
780 | #undef isalnum |
781 | #undef isalpha |
782 | #undef isascii |
783 | #undef isblank |
784 | #undef iscntrl |
785 | #undef isgraph |
786 | #undef islower |
787 | #undef isprint |
788 | #undef ispunct |
789 | #undef isspace |
790 | #undef isupper |
791 | #undef isxdigit |
792 | |
793 | /* This one is more efficient - we save ~400 bytes */ |
794 | #undef isdigit |
795 | #define isdigit(a) ((unsigned)((a) - '0') <= 9) |
796 | |
797 | |
798 | #ifdef DMALLOC |
799 | #include <dmalloc.h> |
800 | #endif |
801 | |
802 | #endif /* __LIBBUSYBOX_H__ */ |