2001-03-16 22:47:14 +00:00
|
|
|
/* vi: set sw=4 ts=4: */
|
|
|
|
/*
|
|
|
|
* Busybox main internal header file
|
|
|
|
*
|
2004-03-15 08:29:22 +00:00
|
|
|
* Based in part on code from sash, Copyright (c) 1999 by David I. Bell
|
2001-03-16 22:47:14 +00:00
|
|
|
* Permission has been granted to redistribute this code under the GPL.
|
2006-09-20 21:41:13 +00:00
|
|
|
*
|
|
|
|
* Licensed under the GPL version 2, see the file LICENSE in this tarball.
|
2001-03-16 22:47:14 +00:00
|
|
|
*/
|
2006-01-22 22:55:11 +00:00
|
|
|
#ifndef __LIBBUSYBOX_H__
|
|
|
|
#define __LIBBUSYBOX_H__ 1
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2006-05-31 22:09:03 +00:00
|
|
|
#include "bb_config.h"
|
2006-05-26 14:41:40 +00:00
|
|
|
#include "platform.h"
|
|
|
|
|
2006-06-24 17:55:02 +00:00
|
|
|
#include <ctype.h>
|
2006-05-31 22:09:03 +00:00
|
|
|
#include <dirent.h>
|
2006-07-12 19:17:55 +00:00
|
|
|
#include <errno.h>
|
2006-06-24 17:55:02 +00:00
|
|
|
#include <fcntl.h>
|
2006-05-31 22:09:03 +00:00
|
|
|
#include <inttypes.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <malloc.h>
|
2006-05-31 22:09:03 +00:00
|
|
|
#include <netdb.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <setjmp.h>
|
2006-07-10 19:45:20 +00:00
|
|
|
#include <signal.h>
|
2001-03-16 22:47:14 +00:00
|
|
|
#include <stdio.h>
|
2004-02-05 14:45:58 +00:00
|
|
|
#include <stdlib.h>
|
2001-03-16 22:47:14 +00:00
|
|
|
#include <stdarg.h>
|
2006-06-24 17:55:02 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <strings.h>
|
2006-07-12 19:17:55 +00:00
|
|
|
#include <sys/ioctl.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <sys/mman.h>
|
2006-06-24 17:55:02 +00:00
|
|
|
#include <sys/socket.h>
|
2005-09-20 10:02:36 +00:00
|
|
|
#include <sys/stat.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <sys/statfs.h>
|
2006-05-31 22:09:03 +00:00
|
|
|
#include <sys/time.h>
|
|
|
|
#include <sys/types.h>
|
2006-07-12 19:17:55 +00:00
|
|
|
#include <sys/wait.h>
|
2003-03-19 09:13:01 +00:00
|
|
|
#include <termios.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <time.h>
|
2006-06-20 22:38:00 +00:00
|
|
|
#include <unistd.h>
|
2006-08-03 15:41:12 +00:00
|
|
|
#include <utime.h>
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2003-07-03 10:07:04 +00:00
|
|
|
#ifdef CONFIG_SELINUX
|
2005-09-21 17:38:30 +00:00
|
|
|
#include <selinux/selinux.h>
|
2003-07-03 10:07:04 +00:00
|
|
|
#endif
|
2002-06-04 20:06:25 +00:00
|
|
|
|
2006-08-03 15:41:12 +00:00
|
|
|
#ifdef CONFIG_LOCALE_SUPPORT
|
|
|
|
#include <locale.h>
|
2006-09-20 21:41:13 +00:00
|
|
|
#else
|
|
|
|
#define setlocale(x,y)
|
2006-08-03 15:41:12 +00:00
|
|
|
#endif
|
|
|
|
|
2002-07-03 23:19:26 +00:00
|
|
|
#include "pwd_.h"
|
|
|
|
#include "grp_.h"
|
2002-06-23 04:24:25 +00:00
|
|
|
#include "shadow_.h"
|
|
|
|
|
2006-06-05 17:35:24 +00:00
|
|
|
/* Try to pull in PATH_MAX */
|
|
|
|
#include <limits.h>
|
|
|
|
#include <sys/param.h>
|
|
|
|
#ifndef PATH_MAX
|
|
|
|
#define PATH_MAX 256
|
|
|
|
#endif
|
|
|
|
|
2006-10-08 17:54:47 +00:00
|
|
|
/* Not (yet) used, but tested to work correctly
|
|
|
|
#define MAXINT(T) (T)( \
|
|
|
|
((T)-1) > 0 \
|
|
|
|
? (T)-1 \
|
|
|
|
: (T)~((T)1 << (sizeof(T)*8-1)) \
|
|
|
|
)
|
|
|
|
|
|
|
|
#define MININT(T) (T)( \
|
|
|
|
((T)-1) > 0 \
|
|
|
|
? (T)0 \
|
|
|
|
: ((T)1 << (sizeof(T)*8-1)) \
|
|
|
|
)
|
|
|
|
*/
|
|
|
|
|
2006-10-07 16:24:46 +00:00
|
|
|
/* Large file support */
|
2006-10-08 17:54:47 +00:00
|
|
|
/* Note that CONFIG_LFS forces bbox to be built with all common ops
|
|
|
|
* (stat, lseek etc) mapped to "largefile" variants by libc.
|
|
|
|
* Practically it means that open() automatically has O_LARGEFILE added
|
|
|
|
* and all filesize/file_offset parameters and struct members are "large"
|
|
|
|
* (in today's world - signed 64bit). For full support of large files,
|
|
|
|
* we need a few helper #defines (below) and careful use of off_t
|
|
|
|
* instead of int/ssize_t. No lseek64(), O_LARGEFILE etc necessary */
|
|
|
|
#if ENBALE_LFS
|
|
|
|
/* CONFIG_LFS is on */
|
|
|
|
# if ULONG_MAX > 0xffffffff
|
|
|
|
/* "long" is long enough on this system */
|
|
|
|
# define STRTOOFF strtol
|
|
|
|
# define SAFE_STRTOOFF safe_strtol
|
2006-10-10 21:00:47 +00:00
|
|
|
# define XSTRTOUOFF xstrtoul
|
2006-10-08 17:54:47 +00:00
|
|
|
# define OFF_FMT "%ld"
|
|
|
|
# else
|
2006-10-10 21:00:47 +00:00
|
|
|
/* "long" is too short, need "long long" */
|
2006-10-08 17:54:47 +00:00
|
|
|
# define STRTOOFF strtoll
|
|
|
|
# define SAFE_STRTOOFF safe_strtoll
|
2006-10-10 21:00:47 +00:00
|
|
|
# define XSTRTOUOFF xstrtoull
|
2006-10-08 17:54:47 +00:00
|
|
|
# define OFF_FMT "%lld"
|
|
|
|
# endif
|
2006-10-07 16:24:46 +00:00
|
|
|
#else
|
2006-10-10 21:00:47 +00:00
|
|
|
# if 0 /* #if UINT_MAX == 0xffffffff */
|
2006-10-08 17:54:47 +00:00
|
|
|
/* Doesn't work. off_t is a long. gcc will throw warnings on printf("%d", off_t)
|
|
|
|
* even if long==int on this arch. Crap... */
|
|
|
|
# define STRTOOFF strtol
|
|
|
|
# define SAFE_STRTOOFF safe_strtoi
|
2006-10-10 21:00:47 +00:00
|
|
|
# define XSTRTOUOFF xstrtou
|
2006-10-08 17:54:47 +00:00
|
|
|
# define OFF_FMT "%d"
|
|
|
|
# else
|
|
|
|
# define STRTOOFF strtol
|
|
|
|
# define SAFE_STRTOOFF safe_strtol
|
2006-10-10 21:00:47 +00:00
|
|
|
# define XSTRTOUOFF xstrtoul
|
2006-10-08 17:54:47 +00:00
|
|
|
# define OFF_FMT "%ld"
|
|
|
|
# endif
|
2006-10-07 16:24:46 +00:00
|
|
|
#endif
|
|
|
|
/* scary. better ideas? (but do *test* them first!) */
|
2006-10-08 17:54:47 +00:00
|
|
|
#define OFF_T_MAX ((off_t)~((off_t)1 << (sizeof(off_t)*8-1)))
|
2006-10-07 16:24:46 +00:00
|
|
|
|
2001-03-16 22:47:14 +00:00
|
|
|
/* Some useful definitions */
|
2006-05-26 14:41:40 +00:00
|
|
|
#undef FALSE
|
2001-03-16 22:47:14 +00:00
|
|
|
#define FALSE ((int) 0)
|
2006-05-26 14:41:40 +00:00
|
|
|
#undef TRUE
|
2001-03-16 22:47:14 +00:00
|
|
|
#define TRUE ((int) 1)
|
2006-05-26 14:41:40 +00:00
|
|
|
#undef SKIP
|
2001-03-16 22:47:14 +00:00
|
|
|
#define SKIP ((int) 2)
|
|
|
|
|
|
|
|
/* for mtab.c */
|
|
|
|
#define MTAB_GETMOUNTPT '1'
|
|
|
|
#define MTAB_GETDEVICE '2'
|
|
|
|
|
|
|
|
#define BUF_SIZE 8192
|
|
|
|
#define EXPAND_ALLOC 1024
|
|
|
|
|
|
|
|
/* Macros for min/max. */
|
|
|
|
#ifndef MIN
|
|
|
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MAX
|
|
|
|
#define MAX(a,b) (((a)>(b))?(a):(b))
|
|
|
|
#endif
|
|
|
|
|
2006-04-03 16:39:31 +00:00
|
|
|
/* buffer allocation schemes */
|
|
|
|
#ifdef CONFIG_FEATURE_BUFFERS_GO_ON_STACK
|
|
|
|
#define RESERVE_CONFIG_BUFFER(buffer,len) char buffer[len]
|
|
|
|
#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char buffer[len]
|
|
|
|
#define RELEASE_CONFIG_BUFFER(buffer) ((void)0)
|
|
|
|
#else
|
|
|
|
#ifdef CONFIG_FEATURE_BUFFERS_GO_IN_BSS
|
|
|
|
#define RESERVE_CONFIG_BUFFER(buffer,len) static char buffer[len]
|
|
|
|
#define RESERVE_CONFIG_UBUFFER(buffer,len) static unsigned char buffer[len]
|
|
|
|
#define RELEASE_CONFIG_BUFFER(buffer) ((void)0)
|
|
|
|
#else
|
|
|
|
#define RESERVE_CONFIG_BUFFER(buffer,len) char *buffer=xmalloc(len)
|
|
|
|
#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len)
|
|
|
|
#define RELEASE_CONFIG_BUFFER(buffer) free (buffer)
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2006-05-26 13:54:07 +00:00
|
|
|
typedef struct llist_s {
|
|
|
|
char *data;
|
|
|
|
struct llist_s *link;
|
|
|
|
} llist_t;
|
2006-05-26 23:44:51 +00:00
|
|
|
extern void llist_add_to(llist_t **old_head, void *data);
|
|
|
|
extern void llist_add_to_end(llist_t **list_head, void *data);
|
2006-05-26 13:54:07 +00:00
|
|
|
extern void *llist_pop(llist_t **elm);
|
|
|
|
extern void llist_free(llist_t *elm, void (*freeit)(void *data));
|
|
|
|
|
|
|
|
|
2006-09-06 18:36:50 +00:00
|
|
|
enum {
|
|
|
|
LOGMODE_NONE = 0,
|
|
|
|
LOGMODE_STDIO = 1<<0,
|
|
|
|
LOGMODE_SYSLOG = 1<<1,
|
|
|
|
LOGMODE_BOTH = LOGMODE_SYSLOG + LOGMODE_STDIO,
|
|
|
|
};
|
2006-09-07 16:20:03 +00:00
|
|
|
extern const char *msg_eol;
|
2006-09-06 18:36:50 +00:00
|
|
|
extern int logmode;
|
2006-09-07 16:20:03 +00:00
|
|
|
extern int die_sleep;
|
2006-09-06 18:36:50 +00:00
|
|
|
|
2006-01-22 22:55:11 +00:00
|
|
|
extern void bb_show_usage(void) ATTRIBUTE_NORETURN ATTRIBUTE_EXTERNALLY_VISIBLE;
|
2003-03-19 09:13:01 +00:00
|
|
|
extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
extern void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
|
|
|
|
extern void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
extern void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
|
|
|
|
extern void bb_vherror_msg(const char *s, va_list p);
|
|
|
|
extern void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
extern void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
|
|
|
|
|
2006-01-22 22:55:11 +00:00
|
|
|
extern void bb_perror_nomsg_and_die(void) ATTRIBUTE_NORETURN;
|
2003-03-19 09:13:01 +00:00
|
|
|
extern void bb_perror_nomsg(void);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2006-09-06 18:36:50 +00:00
|
|
|
extern void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
|
2001-03-19 19:24:06 +00:00
|
|
|
/* These two are used internally -- you shouldn't need to use them */
|
2006-09-06 18:36:50 +00:00
|
|
|
extern void bb_verror_msg(const char *s, va_list p, const char *strerr) __attribute__ ((format (printf, 1, 0)));
|
2003-03-19 09:13:01 +00:00
|
|
|
extern void bb_vperror_msg(const char *s, va_list p) __attribute__ ((format (printf, 1, 0)));
|
2006-09-06 18:36:50 +00:00
|
|
|
extern void bb_vinfo_msg(const char *s, va_list p) __attribute__ ((format (printf, 1, 0)));
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2005-08-09 19:38:05 +00:00
|
|
|
extern int bb_echo(int argc, char** argv);
|
2006-06-08 21:37:26 +00:00
|
|
|
extern int bb_test(int argc, char** argv);
|
2005-08-09 19:38:05 +00:00
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
extern const char *bb_mode_string(int mode);
|
|
|
|
extern int is_directory(const char *name, int followLinks, struct stat *statBuf);
|
2006-08-03 15:41:12 +00:00
|
|
|
extern DIR *warn_opendir(const char *path);
|
|
|
|
extern DIR *xopendir(const char *path);
|
2003-03-19 09:13:01 +00:00
|
|
|
|
|
|
|
extern ssize_t safe_read(int fd, void *buf, size_t count);
|
2006-10-14 02:23:43 +00:00
|
|
|
extern ssize_t full_read(int fd, void *buf, size_t count);
|
|
|
|
extern void xread(int fd, void *buf, size_t count);
|
|
|
|
extern unsigned char xread_char(int fd);
|
|
|
|
extern char *reads(int fd, char *buf, size_t count);
|
|
|
|
ssize_t read_close(int fd, void *buf, size_t count);
|
|
|
|
ssize_t open_read_close(const char *filename, void *buf, size_t count);
|
|
|
|
void *xmalloc_open_read_close(const char *filename, size_t *sizep);
|
|
|
|
|
2003-10-31 09:31:46 +00:00
|
|
|
extern ssize_t safe_write(int fd, const void *buf, size_t count);
|
2006-10-14 02:23:43 +00:00
|
|
|
extern ssize_t full_write(int fd, const void *buf, size_t count);
|
|
|
|
extern void xwrite(int fd, void *buf, size_t count);
|
|
|
|
|
|
|
|
extern int remove_file(const char *path, int flags);
|
|
|
|
extern int copy_file(const char *source, const char *dest, int flags);
|
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
extern int recursive_action(const char *fileName, int recurse,
|
|
|
|
int followLinks, int depthFirst,
|
2001-03-16 22:47:14 +00:00
|
|
|
int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
|
|
|
|
int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData),
|
|
|
|
void* userData);
|
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
extern int bb_parse_mode( const char* s, mode_t* theMode);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2006-06-18 23:59:03 +00:00
|
|
|
extern unsigned int tty_baud_to_value(speed_t speed);
|
|
|
|
extern speed_t tty_value_to_baud(unsigned int value);
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2006-05-19 11:54:02 +00:00
|
|
|
extern int get_linux_version_code(void);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2002-09-16 06:22:25 +00:00
|
|
|
extern int get_console_fd(void);
|
2001-03-16 22:47:14 +00:00
|
|
|
extern struct mntent *find_mount_point(const char *name, const char *table);
|
|
|
|
extern void erase_mtab(const char * name);
|
2003-03-19 09:13:01 +00:00
|
|
|
extern long *find_pid_by_name( const char* pidName);
|
2005-10-06 12:10:48 +00:00
|
|
|
extern long *pidlist_reverse(long *pidList);
|
Major rewrite of mount, umount, losetup. Untangled lots of code, shrunk
things down a bit, fixed a number of funky corner cases, added support for
several new features (things like mount --move, mount --bind, lazy unounts,
automatic detection of loop mounts, and so on). Probably broke several
other things, but it's fixable. (Bang on it, tell me what doesn't work for
you...)
Note: you no longer need to say "-o loop". It does that for you when
necessary.
Still need to add "user mount" support, which involves making mount suid. Not
too hard to do under the new infrastructure, just haven't done it yet...
The previous code had the following notes, that belong in the version
control comments:
- * 3/21/1999 Charles P. Wright <cpwright@cpwright.com>
- * searches through fstab when -a is passed
- * will try mounting stuff with all fses when passed -t auto
- *
- * 1999-04-17 Dave Cinege...Rewrote -t auto. Fixed ro mtab.
- *
- * 1999-10-07 Erik Andersen <andersen@codepoet.org>.
- * Rewrite of a lot of code. Removed mtab usage (I plan on
- * putting it back as a compile-time option some time),
- * major adjustments to option parsing, and some serious
- * dieting all around.
- *
- * 1999-11-06 mtab support is back - andersee
- *
- * 2000-01-12 Ben Collins <bcollins@debian.org>, Borrowed utils-linux's
- * mount to add loop support.
- *
- * 2000-04-30 Dave Cinege <dcinege@psychosis.com>
- * Rewrote fstab while loop and lower mount section. Can now do
- * single mounts from fstab. Can override fstab options for single
- * mount. Common mount_one call for single mounts and 'all'. Fixed
- * mtab updating and stale entries. Removed 'remount' default.
- *
2005-08-10 20:35:54 +00:00
|
|
|
extern char *find_block_device(char *path);
|
2006-10-12 22:43:20 +00:00
|
|
|
extern char *xmalloc_fgets(FILE *file);
|
|
|
|
/* Chops off '\n' from the end, unlike fgets: */
|
|
|
|
extern char *xmalloc_getline(FILE *file);
|
2006-02-24 03:12:03 +00:00
|
|
|
extern char *bb_get_chunk_from_file(FILE *file, int *end);
|
2006-10-08 17:54:47 +00:00
|
|
|
extern off_t bb_copyfd_size(int fd1, int fd2, off_t size);
|
|
|
|
extern off_t bb_copyfd_eof(int fd1, int fd2);
|
2003-03-19 09:13:01 +00:00
|
|
|
extern char bb_process_escape_sequence(const char **ptr);
|
|
|
|
extern char *bb_get_last_path_component(char *path);
|
|
|
|
extern FILE *bb_wfopen(const char *path, const char *mode);
|
2005-09-20 20:58:11 +00:00
|
|
|
extern FILE *bb_wfopen_input(const char *filename);
|
2006-08-03 15:41:12 +00:00
|
|
|
extern FILE *xfopen(const char *path, const char *mode);
|
2003-03-19 09:13:01 +00:00
|
|
|
|
|
|
|
extern int bb_fclose_nonstdin(FILE *f);
|
2006-01-22 22:55:11 +00:00
|
|
|
extern void bb_fflush_stdout_and_exit(int retval) ATTRIBUTE_NORETURN;
|
2003-06-20 09:01:58 +00:00
|
|
|
|
2006-09-12 21:42:17 +00:00
|
|
|
extern void xstat(char *filename, struct stat *buf);
|
2006-08-03 15:41:12 +00:00
|
|
|
extern int xsocket(int domain, int type, int protocol);
|
|
|
|
extern pid_t spawn(char **argv);
|
|
|
|
extern pid_t xspawn(char **argv);
|
2006-06-14 01:24:33 +00:00
|
|
|
extern int wait4pid(int pid);
|
2006-08-03 15:41:12 +00:00
|
|
|
extern void xdaemon(int nochdir, int noclose);
|
|
|
|
extern void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
|
|
|
|
extern void xlisten(int s, int backlog);
|
|
|
|
extern void xchdir(const char *path);
|
2006-07-12 19:17:55 +00:00
|
|
|
extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
|
|
|
|
extern char *utoa(unsigned n);
|
|
|
|
extern void itoa_to_buf(int n, char *buf, unsigned buflen);
|
|
|
|
extern char *itoa(int n);
|
2006-07-15 23:00:46 +00:00
|
|
|
extern void xsetgid(gid_t gid);
|
|
|
|
extern void xsetuid(uid_t uid);
|
2006-07-16 08:14:35 +00:00
|
|
|
extern off_t fdlength(int fd);
|
2006-03-13 15:45:16 +00:00
|
|
|
|
2006-10-06 09:49:47 +00:00
|
|
|
enum { BB_GETOPT_ERROR = 0x80000000 };
|
2006-10-03 21:00:06 +00:00
|
|
|
extern const char *opt_complementary;
|
|
|
|
extern const struct option *applet_long_options;
|
2006-10-06 09:49:47 +00:00
|
|
|
extern uint32_t option_mask32;
|
2006-10-03 21:00:06 +00:00
|
|
|
extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...);
|
2003-06-26 09:05:32 +00:00
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
extern int bb_vfprintf(FILE * __restrict stream, const char * __restrict format,
|
|
|
|
va_list arg) __attribute__ ((format (printf, 2, 0)));
|
|
|
|
extern int bb_vprintf(const char * __restrict format, va_list arg)
|
|
|
|
__attribute__ ((format (printf, 1, 0)));
|
|
|
|
extern int bb_fprintf(FILE * __restrict stream, const char * __restrict format, ...)
|
|
|
|
__attribute__ ((format (printf, 2, 3)));
|
|
|
|
extern int bb_printf(const char * __restrict format, ...)
|
|
|
|
__attribute__ ((format (printf, 1, 2)));
|
|
|
|
|
2006-08-03 15:41:12 +00:00
|
|
|
extern void xferror(FILE *fp, const char *fn);
|
|
|
|
extern void xferror_stdout(void);
|
|
|
|
extern void xfflush_stdout(void);
|
2003-03-19 09:13:01 +00:00
|
|
|
|
|
|
|
extern void bb_warn_ignoring_args(int n);
|
|
|
|
|
2001-03-16 22:47:14 +00:00
|
|
|
extern void chomp(char *s);
|
|
|
|
extern void trim(char *s);
|
2006-06-18 20:20:07 +00:00
|
|
|
extern char *skip_whitespace(const char *);
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2006-08-09 20:56:23 +00:00
|
|
|
#ifndef BUILD_INDIVIDUAL
|
2001-03-16 22:47:14 +00:00
|
|
|
extern struct BB_applet *find_applet_by_name(const char *name);
|
2006-10-03 21:00:06 +00:00
|
|
|
extern void run_applet_by_name(const char *name, int argc, char **argv);
|
2006-08-09 20:56:23 +00:00
|
|
|
#endif
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2005-09-21 17:38:30 +00:00
|
|
|
/* dmalloc will redefine these to it's own implementation. It is safe
|
|
|
|
* to have the prototypes here unconditionally. */
|
|
|
|
extern void *xmalloc(size_t size);
|
2001-03-16 22:47:14 +00:00
|
|
|
extern void *xrealloc(void *old, size_t size);
|
2006-05-19 20:36:49 +00:00
|
|
|
extern void *xzalloc(size_t size);
|
2005-09-21 17:38:30 +00:00
|
|
|
|
2006-10-08 12:49:22 +00:00
|
|
|
extern char *xstrdup(const char *s);
|
|
|
|
extern char *xstrndup(const char *s, int n);
|
2004-03-12 22:08:13 +00:00
|
|
|
extern char *safe_strncpy(char *dst, const char *src, size_t size);
|
2006-10-08 12:49:22 +00:00
|
|
|
// FIXME: the prototype doesn't match libc strtoXX -> confusion
|
|
|
|
// FIXME: alot of unchecked strtoXXX are still in tree
|
|
|
|
// FIXME: atoi_or_else(str, N)?
|
|
|
|
extern int safe_strtoi(const char *arg, int* value);
|
|
|
|
extern int safe_strtou(const char *arg, unsigned* value);
|
|
|
|
extern int safe_strtod(const char *arg, double* value);
|
|
|
|
extern int safe_strtol(const char *arg, long* value);
|
|
|
|
extern int safe_strtoll(const char *arg, long long* value);
|
|
|
|
extern int safe_strtoul(const char *arg, unsigned long* value);
|
|
|
|
extern int safe_strtoull(const char *arg, unsigned long long* value);
|
|
|
|
extern int safe_strtou32(const char *arg, uint32_t* value);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
|
|
|
struct suffix_mult {
|
2001-04-09 22:48:12 +00:00
|
|
|
const char *suffix;
|
2003-03-19 09:13:01 +00:00
|
|
|
unsigned int mult;
|
2001-03-16 22:47:14 +00:00
|
|
|
};
|
|
|
|
|
2006-10-10 21:00:47 +00:00
|
|
|
unsigned long long xstrtoull(const char *numstr, int base);
|
|
|
|
unsigned long long xatoull(const char *numstr);
|
2006-10-08 12:49:22 +00:00
|
|
|
unsigned long xstrtoul_range_sfx(const char *numstr, int base,
|
2006-10-03 19:02:20 +00:00
|
|
|
unsigned long lower,
|
|
|
|
unsigned long upper,
|
|
|
|
const struct suffix_mult *suffixes);
|
2006-10-08 12:49:22 +00:00
|
|
|
unsigned long xstrtoul_range(const char *numstr, int base,
|
2006-10-03 19:02:20 +00:00
|
|
|
unsigned long lower,
|
|
|
|
unsigned long upper);
|
2006-10-10 23:26:05 +00:00
|
|
|
unsigned long xstrtoul_sfx(const char *numstr, int base,
|
|
|
|
const struct suffix_mult *suffixes);
|
2006-10-08 12:49:22 +00:00
|
|
|
unsigned long xstrtoul(const char *numstr, int base);
|
|
|
|
unsigned long xatoul_range_sfx(const char *numstr,
|
|
|
|
unsigned long lower,
|
|
|
|
unsigned long upper,
|
|
|
|
const struct suffix_mult *suffixes);
|
|
|
|
unsigned long xatoul_sfx(const char *numstr,
|
|
|
|
const struct suffix_mult *suffixes);
|
|
|
|
unsigned long xatoul_range(const char *numstr,
|
2006-10-03 19:02:20 +00:00
|
|
|
unsigned long lower,
|
|
|
|
unsigned long upper);
|
2006-10-08 12:49:22 +00:00
|
|
|
unsigned long xatoul(const char *numstr);
|
|
|
|
long xstrtol_range_sfx(const char *numstr, int base,
|
2006-10-03 19:02:20 +00:00
|
|
|
long lower,
|
|
|
|
long upper,
|
|
|
|
const struct suffix_mult *suffixes);
|
2006-10-08 12:49:22 +00:00
|
|
|
long xstrtol_range(const char *numstr, int base, long lower, long upper);
|
|
|
|
long xatol_range_sfx(const char *numstr,
|
|
|
|
long lower,
|
|
|
|
long upper,
|
2001-03-16 22:47:14 +00:00
|
|
|
const struct suffix_mult *suffixes);
|
2006-10-08 12:49:22 +00:00
|
|
|
long xatol_range(const char *numstr, long lower, long upper);
|
|
|
|
long xatol_sfx(const char *numstr, const struct suffix_mult *suffixes);
|
|
|
|
long xatol(const char *numstr);
|
|
|
|
/* Specialized: */
|
|
|
|
unsigned xatou(const char *numstr);
|
2006-10-08 23:36:17 +00:00
|
|
|
int xatoi_range(const char *numstr, int lower, int upper);
|
2006-10-08 12:49:22 +00:00
|
|
|
int xatoi(const char *numstr);
|
|
|
|
/* Using xatoi() instead of naive atoi() is not always convenient -
|
|
|
|
* in many places people want *non-negative* values, but store them
|
|
|
|
* in signed int. Therefore we need this one:
|
|
|
|
* dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */
|
|
|
|
int xatoi_u(const char *numstr);
|
|
|
|
uint32_t xatou32(const char *numstr);
|
|
|
|
/* Useful for reading port numbers */
|
|
|
|
uint16_t xatou16(const char *numstr);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
|
|
|
/* These parse entries in /etc/passwd and /etc/group. This is desirable
|
|
|
|
* for BusyBox since we want to avoid using the glibc NSS stuff, which
|
2005-09-20 21:06:17 +00:00
|
|
|
* increases target size and is often not needed on embedded systems. */
|
|
|
|
extern long bb_xgetpwnam(const char *name);
|
|
|
|
extern long bb_xgetgrnam(const char *name);
|
2006-10-03 19:02:20 +00:00
|
|
|
extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);
|
|
|
|
extern char *bb_getpwuid(char *name, long uid, int bufsize);
|
|
|
|
extern char *bb_getgrgid(char *group, long gid, int bufsize);
|
2004-05-01 01:27:30 +00:00
|
|
|
extern char *bb_askpass(int timeout, const char * prompt);
|
2006-10-05 22:50:22 +00:00
|
|
|
/* from chpst */
|
|
|
|
struct bb_uidgid_t {
|
|
|
|
uid_t uid;
|
|
|
|
gid_t gid;
|
|
|
|
};
|
|
|
|
extern unsigned uidgid_get(struct bb_uidgid_t*, const char* /*, unsigned*/);
|
|
|
|
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2003-01-13 22:09:50 +00:00
|
|
|
extern int device_open(const char *device, int mode);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2005-11-29 23:47:10 +00:00
|
|
|
extern char *query_loop(const char *device);
|
2001-03-16 22:47:14 +00:00
|
|
|
extern int del_loop(const char *device);
|
2006-10-08 12:49:22 +00:00
|
|
|
extern int set_loop(char **device, const char *file, unsigned long long offset);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
|
|
|
#if (__GLIBC__ < 2)
|
|
|
|
extern int vdprintf(int d, const char *format, va_list ap);
|
|
|
|
#endif
|
|
|
|
|
2006-04-02 20:17:55 +00:00
|
|
|
/* Include our own copy of struct sysinfo to avoid binary compatibility
|
2001-03-16 22:47:14 +00:00
|
|
|
* problems with Linux 2.4, which changed things. Grumble, grumble. */
|
|
|
|
struct sysinfo {
|
|
|
|
long uptime; /* Seconds since boot */
|
|
|
|
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
|
|
|
unsigned long totalram; /* Total usable main memory size */
|
|
|
|
unsigned long freeram; /* Available memory size */
|
|
|
|
unsigned long sharedram; /* Amount of shared memory */
|
|
|
|
unsigned long bufferram; /* Memory used by buffers */
|
|
|
|
unsigned long totalswap; /* Total swap space size */
|
|
|
|
unsigned long freeswap; /* swap space still available */
|
|
|
|
unsigned short procs; /* Number of current processes */
|
2001-06-08 13:57:27 +00:00
|
|
|
unsigned short pad; /* Padding needed for m68k */
|
2001-03-16 22:47:14 +00:00
|
|
|
unsigned long totalhigh; /* Total high memory size */
|
|
|
|
unsigned long freehigh; /* Available high memory size */
|
|
|
|
unsigned int mem_unit; /* Memory unit size in bytes */
|
|
|
|
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
|
|
|
|
};
|
|
|
|
extern int sysinfo (struct sysinfo* info);
|
|
|
|
|
|
|
|
enum {
|
|
|
|
KILOBYTE = 1024,
|
|
|
|
MEGABYTE = (KILOBYTE*1024),
|
|
|
|
GIGABYTE = (MEGABYTE*1024)
|
|
|
|
};
|
2004-03-15 08:29:22 +00:00
|
|
|
const char *make_human_readable_str(unsigned long long size,
|
2003-08-22 23:08:37 +00:00
|
|
|
unsigned long block_size, unsigned long display_unit);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
int bb_ask_confirmation(void);
|
2001-04-05 03:14:39 +00:00
|
|
|
int klogctl(int type, char * b, int len);
|
2001-03-16 22:47:14 +00:00
|
|
|
|
2001-04-09 22:48:12 +00:00
|
|
|
char *xgetcwd(char *cwd);
|
2001-04-30 18:17:00 +00:00
|
|
|
char *xreadlink(const char *path);
|
2001-04-09 22:48:12 +00:00
|
|
|
char *concat_path_file(const char *path, const char *filename);
|
2003-05-26 14:07:50 +00:00
|
|
|
char *concat_subpath_file(const char *path, const char *filename);
|
2001-05-15 17:42:16 +00:00
|
|
|
char *last_char_is(const char *s, int c);
|
2001-04-09 22:48:12 +00:00
|
|
|
|
2001-06-13 07:26:39 +00:00
|
|
|
char *fgets_str(FILE *file, const char *terminating_string);
|
2001-04-12 10:19:08 +00:00
|
|
|
|
2006-10-11 22:16:56 +00:00
|
|
|
int execable_file(const char *name);
|
|
|
|
char *find_execable(const char *filename);
|
|
|
|
int exists_execable(const char *filename);
|
|
|
|
|
2006-10-01 15:55:11 +00:00
|
|
|
extern USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out);
|
2002-09-25 02:47:48 +00:00
|
|
|
extern int inflate(int in, int out);
|
2001-04-11 16:23:35 +00:00
|
|
|
|
2001-05-16 15:40:51 +00:00
|
|
|
extern struct hostent *xgethostbyname(const char *name);
|
2002-07-03 11:46:38 +00:00
|
|
|
extern struct hostent *xgethostbyname2(const char *name, int af);
|
2001-07-12 20:26:32 +00:00
|
|
|
extern int create_icmp_socket(void);
|
2002-07-03 11:46:38 +00:00
|
|
|
extern int create_icmp6_socket(void);
|
2003-10-31 09:31:46 +00:00
|
|
|
extern int xconnect(struct sockaddr_in *s_addr);
|
2004-01-17 05:03:31 +00:00
|
|
|
extern unsigned short bb_lookup_port(const char *port, const char *protocol, unsigned short default_port);
|
2003-12-20 01:47:18 +00:00
|
|
|
extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host);
|
2001-05-16 15:40:51 +00:00
|
|
|
|
2006-09-15 04:01:03 +00:00
|
|
|
// This is declared here rather than #including <libgen.h> in order to avoid
|
|
|
|
// confusing the two versions of basename. See the dirname/basename man page
|
|
|
|
// for details.
|
2006-10-01 15:55:11 +00:00
|
|
|
char *dirname(char *path);
|
2001-06-26 02:06:08 +00:00
|
|
|
|
2006-10-01 15:55:11 +00:00
|
|
|
int bb_make_directory(char *path, long mode, int flags);
|
2001-06-21 19:41:37 +00:00
|
|
|
|
2006-09-27 14:19:16 +00:00
|
|
|
int get_signum(const char *name);
|
|
|
|
const char *get_signame(int number);
|
2006-07-12 19:17:55 +00:00
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
char *bb_simplify_path(const char *path);
|
2001-04-12 00:49:26 +00:00
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
enum { /* DO NOT CHANGE THESE VALUES! cp.c depends on them. */
|
2001-04-24 01:30:02 +00:00
|
|
|
FILEUTILS_PRESERVE_STATUS = 1,
|
2001-10-05 01:35:10 +00:00
|
|
|
FILEUTILS_DEREFERENCE = 2,
|
2001-04-24 01:30:02 +00:00
|
|
|
FILEUTILS_RECUR = 4,
|
|
|
|
FILEUTILS_FORCE = 8,
|
|
|
|
FILEUTILS_INTERACTIVE = 16
|
2001-04-23 18:53:07 +00:00
|
|
|
};
|
|
|
|
|
2006-10-03 21:00:43 +00:00
|
|
|
extern const char *applet_name;
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2006-09-19 09:55:09 +00:00
|
|
|
extern const char bb_msg_full_version[];
|
|
|
|
extern const char bb_msg_memory_exhausted[];
|
|
|
|
extern const char bb_msg_invalid_date[];
|
|
|
|
extern const char bb_msg_read_error[];
|
|
|
|
extern const char bb_msg_write_error[];
|
|
|
|
extern const char bb_msg_name_longer_than_foo[];
|
|
|
|
extern const char bb_msg_unknown[];
|
|
|
|
extern const char bb_msg_can_not_create_raw_socket[];
|
|
|
|
extern const char bb_msg_perm_denied_are_you_root[];
|
|
|
|
extern const char bb_msg_requires_arg[];
|
|
|
|
extern const char bb_msg_invalid_arg[];
|
|
|
|
extern const char bb_msg_standard_input[];
|
|
|
|
extern const char bb_msg_standard_output[];
|
|
|
|
|
|
|
|
extern const char bb_path_nologin_file[];
|
|
|
|
extern const char bb_path_passwd_file[];
|
|
|
|
extern const char bb_path_shadow_file[];
|
|
|
|
extern const char bb_path_gshadow_file[];
|
|
|
|
extern const char bb_path_group_file[];
|
|
|
|
extern const char bb_path_securetty_file[];
|
|
|
|
extern const char bb_path_motd_file[];
|
|
|
|
extern const char bb_path_wtmp_file[];
|
|
|
|
extern const char bb_dev_null[];
|
2005-10-15 10:23:55 +00:00
|
|
|
|
|
|
|
#ifndef BUFSIZ
|
|
|
|
#define BUFSIZ 4096
|
|
|
|
#endif
|
|
|
|
extern char bb_common_bufsiz1[BUFSIZ+1];
|
|
|
|
|
2003-09-02 02:36:18 +00:00
|
|
|
/*
|
|
|
|
* You can change LIBBB_DEFAULT_LOGIN_SHELL, but don`t use,
|
|
|
|
* use bb_default_login_shell and next defines,
|
|
|
|
* if you LIBBB_DEFAULT_LOGIN_SHELL change,
|
|
|
|
* don`t lose change increment constant!
|
|
|
|
*/
|
|
|
|
#define LIBBB_DEFAULT_LOGIN_SHELL "-/bin/sh"
|
|
|
|
|
2006-09-19 09:55:09 +00:00
|
|
|
extern const char bb_default_login_shell[];
|
2003-09-02 02:36:18 +00:00
|
|
|
/* "/bin/sh" */
|
|
|
|
#define DEFAULT_SHELL (bb_default_login_shell+1)
|
|
|
|
/* "sh" */
|
|
|
|
#define DEFAULT_SHELL_SHORT_NAME (bb_default_login_shell+6)
|
|
|
|
|
|
|
|
|
2006-09-19 09:55:09 +00:00
|
|
|
extern const char bb_path_mtab_file[];
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2006-10-03 20:28:06 +00:00
|
|
|
extern int xfunc_error_retval;
|
2001-04-24 01:12:33 +00:00
|
|
|
|
2001-10-24 05:00:29 +00:00
|
|
|
#ifdef CONFIG_FEATURE_DEVFS
|
2001-07-23 14:52:08 +00:00
|
|
|
# define CURRENT_VC "/dev/vc/0"
|
|
|
|
# define VC_1 "/dev/vc/1"
|
|
|
|
# define VC_2 "/dev/vc/2"
|
|
|
|
# define VC_3 "/dev/vc/3"
|
|
|
|
# define VC_4 "/dev/vc/4"
|
|
|
|
# define VC_5 "/dev/vc/5"
|
2003-07-22 07:33:14 +00:00
|
|
|
#if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__)
|
|
|
|
/* Yes, this sucks, but both SH (including sh64) and H8 have a SCI(F) for their
|
|
|
|
respective serial ports .. as such, we can't use the common device paths for
|
|
|
|
these. -- PFM */
|
|
|
|
# define SC_0 "/dev/ttsc/0"
|
|
|
|
# define SC_1 "/dev/ttsc/1"
|
|
|
|
# define SC_FORMAT "/dev/ttsc/%d"
|
|
|
|
#else
|
|
|
|
# define SC_0 "/dev/tts/0"
|
|
|
|
# define SC_1 "/dev/tts/1"
|
|
|
|
# define SC_FORMAT "/dev/tts/%d"
|
|
|
|
#endif
|
2001-07-23 14:52:08 +00:00
|
|
|
# define VC_FORMAT "/dev/vc/%d"
|
2002-03-20 15:25:25 +00:00
|
|
|
# define LOOP_FORMAT "/dev/loop/%d"
|
2006-09-29 21:47:11 +00:00
|
|
|
# define LOOP_NAME "/dev/loop/"
|
2003-11-14 03:11:29 +00:00
|
|
|
# define FB_0 "/dev/fb/0"
|
2001-07-23 14:52:08 +00:00
|
|
|
#else
|
|
|
|
# define CURRENT_VC "/dev/tty0"
|
|
|
|
# define VC_1 "/dev/tty1"
|
|
|
|
# define VC_2 "/dev/tty2"
|
|
|
|
# define VC_3 "/dev/tty3"
|
|
|
|
# define VC_4 "/dev/tty4"
|
|
|
|
# define VC_5 "/dev/tty5"
|
2003-07-22 07:33:14 +00:00
|
|
|
#if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__)
|
|
|
|
# define SC_0 "/dev/ttySC0"
|
|
|
|
# define SC_1 "/dev/ttySC1"
|
|
|
|
# define SC_FORMAT "/dev/ttySC%d"
|
|
|
|
#else
|
|
|
|
# define SC_0 "/dev/ttyS0"
|
|
|
|
# define SC_1 "/dev/ttyS1"
|
|
|
|
# define SC_FORMAT "/dev/ttyS%d"
|
|
|
|
#endif
|
2001-07-23 14:52:08 +00:00
|
|
|
# define VC_FORMAT "/dev/tty%d"
|
2002-03-20 15:25:25 +00:00
|
|
|
# define LOOP_FORMAT "/dev/loop%d"
|
2006-09-29 21:47:11 +00:00
|
|
|
# define LOOP_NAME "/dev/loop"
|
2003-11-14 03:11:29 +00:00
|
|
|
# define FB_0 "/dev/fb0"
|
2001-07-23 14:52:08 +00:00
|
|
|
#endif
|
|
|
|
|
2003-03-19 09:13:01 +00:00
|
|
|
|
2001-07-23 14:52:08 +00:00
|
|
|
/* The following devices are the same on devfs and non-devfs systems. */
|
|
|
|
#define CURRENT_TTY "/dev/tty"
|
|
|
|
#define CONSOLE_DEV "/dev/console"
|
|
|
|
|
2001-12-17 15:26:36 +00:00
|
|
|
int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name);
|
|
|
|
void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name);
|
|
|
|
void reset_ino_dev_hashtable(void);
|
|
|
|
|
2006-08-03 15:41:12 +00:00
|
|
|
char *xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
|
|
|
void xprint_and_close_file(FILE *file);
|
2002-06-23 04:24:25 +00:00
|
|
|
|
|
|
|
#define FAIL_DELAY 3
|
2006-01-06 20:59:09 +00:00
|
|
|
extern void bb_do_delay(int seconds);
|
2006-09-08 17:22:45 +00:00
|
|
|
extern void change_identity(const struct passwd *pw);
|
|
|
|
extern const char *change_identity_e2str(const struct passwd *pw);
|
|
|
|
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args);
|
2003-07-03 10:07:04 +00:00
|
|
|
#ifdef CONFIG_SELINUX
|
2005-05-03 06:25:50 +00:00
|
|
|
extern void renew_current_security_context(void);
|
|
|
|
extern void set_current_security_context(security_context_t sid);
|
2005-09-21 17:38:30 +00:00
|
|
|
#endif
|
2003-07-29 07:05:40 +00:00
|
|
|
extern int run_parts(char **args, const unsigned char test_mode, char **env);
|
2006-10-03 15:57:40 +00:00
|
|
|
extern int restricted_shell(const char *shell);
|
|
|
|
extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw);
|
|
|
|
extern int correct_password(const struct passwd *pw);
|
2002-06-23 04:24:25 +00:00
|
|
|
extern char *pw_encrypt(const char *clear, const char *salt);
|
|
|
|
extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
|
|
|
|
|
2006-10-03 15:57:40 +00:00
|
|
|
extern void xsetenv(const char *key, const char *value);
|
2006-08-03 15:41:12 +00:00
|
|
|
extern int xopen(const char *pathname, int flags);
|
|
|
|
extern int xopen3(const char *pathname, int flags, int mode);
|
2006-10-14 02:23:43 +00:00
|
|
|
extern off_t xlseek(int fd, off_t offset, int whence);
|
2002-09-25 02:47:48 +00:00
|
|
|
|
2006-09-03 15:49:40 +00:00
|
|
|
extern const char bb_uuenc_tbl_base64[];
|
|
|
|
extern const char bb_uuenc_tbl_std[];
|
|
|
|
extern void bb_uuencode(const unsigned char *s, char *store, const int length, const char *tbl);
|
|
|
|
|
2005-10-06 12:10:48 +00:00
|
|
|
#ifndef COMM_LEN
|
|
|
|
#ifdef TASK_COMM_LEN
|
|
|
|
#define COMM_LEN TASK_COMM_LEN
|
|
|
|
#else
|
2006-06-05 17:35:24 +00:00
|
|
|
/* synchronize with sizeof(task_struct.comm) in /usr/include/linux/sched.h */
|
|
|
|
#define COMM_LEN 16
|
2005-10-06 12:10:48 +00:00
|
|
|
#endif
|
|
|
|
#endif
|
2002-10-22 12:21:15 +00:00
|
|
|
typedef struct {
|
|
|
|
int pid;
|
|
|
|
char user[9];
|
|
|
|
char state[4];
|
|
|
|
unsigned long rss;
|
|
|
|
int ppid;
|
2005-09-16 12:55:29 +00:00
|
|
|
#ifdef CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
|
2002-10-22 12:21:15 +00:00
|
|
|
unsigned pcpu;
|
Major rewrite of mount, umount, losetup. Untangled lots of code, shrunk
things down a bit, fixed a number of funky corner cases, added support for
several new features (things like mount --move, mount --bind, lazy unounts,
automatic detection of loop mounts, and so on). Probably broke several
other things, but it's fixable. (Bang on it, tell me what doesn't work for
you...)
Note: you no longer need to say "-o loop". It does that for you when
necessary.
Still need to add "user mount" support, which involves making mount suid. Not
too hard to do under the new infrastructure, just haven't done it yet...
The previous code had the following notes, that belong in the version
control comments:
- * 3/21/1999 Charles P. Wright <cpwright@cpwright.com>
- * searches through fstab when -a is passed
- * will try mounting stuff with all fses when passed -t auto
- *
- * 1999-04-17 Dave Cinege...Rewrote -t auto. Fixed ro mtab.
- *
- * 1999-10-07 Erik Andersen <andersen@codepoet.org>.
- * Rewrite of a lot of code. Removed mtab usage (I plan on
- * putting it back as a compile-time option some time),
- * major adjustments to option parsing, and some serious
- * dieting all around.
- *
- * 1999-11-06 mtab support is back - andersee
- *
- * 2000-01-12 Ben Collins <bcollins@debian.org>, Borrowed utils-linux's
- * mount to add loop support.
- *
- * 2000-04-30 Dave Cinege <dcinege@psychosis.com>
- * Rewrote fstab while loop and lower mount section. Can now do
- * single mounts from fstab. Can override fstab options for single
- * mount. Common mount_one call for single mounts and 'all'. Fixed
- * mtab updating and stale entries. Removed 'remount' default.
- *
2005-08-10 20:35:54 +00:00
|
|
|
unsigned pscpu;
|
2002-10-22 12:21:15 +00:00
|
|
|
unsigned long stime, utime;
|
|
|
|
#endif
|
|
|
|
char *cmd;
|
|
|
|
|
|
|
|
/* basename of executable file in call to exec(2),
|
|
|
|
size from kernel headers */
|
2005-10-06 12:10:48 +00:00
|
|
|
char short_cmd[COMM_LEN];
|
2002-10-22 12:21:15 +00:00
|
|
|
} procps_status_t;
|
|
|
|
|
2005-05-03 06:25:50 +00:00
|
|
|
extern procps_status_t * procps_scan(int save_user_arg0);
|
2005-12-06 12:00:39 +00:00
|
|
|
extern int compare_string_array(const char * const string_array[], const char *key);
|
2002-10-22 12:21:15 +00:00
|
|
|
|
2003-09-15 08:33:45 +00:00
|
|
|
extern void print_login_issue(const char *issue_file, const char *tty);
|
|
|
|
extern void print_login_prompt(void);
|
2003-01-21 20:55:56 +00:00
|
|
|
|
2006-05-31 10:19:51 +00:00
|
|
|
#ifdef BB_NOMMU
|
2006-06-07 21:58:57 +00:00
|
|
|
extern void vfork_daemon(int nochdir, int noclose);
|
2003-12-15 21:57:44 +00:00
|
|
|
extern void vfork_daemon_rexec(int nochdir, int noclose,
|
|
|
|
int argc, char **argv, char *foreground_opt);
|
2006-04-11 04:04:40 +00:00
|
|
|
#endif
|
|
|
|
|
2005-09-01 02:57:45 +00:00
|
|
|
extern int get_terminal_width_height(int fd, int *width, int *height);
|
2005-09-20 21:06:17 +00:00
|
|
|
extern unsigned long get_ug_id(const char *s, long (*__bb_getxxnam)(const char *));
|
2003-11-10 04:33:55 +00:00
|
|
|
|
2006-02-21 06:44:43 +00:00
|
|
|
typedef struct _sha1_ctx_t_ {
|
|
|
|
uint32_t count[2];
|
|
|
|
uint32_t hash[5];
|
|
|
|
uint32_t wbuf[16];
|
|
|
|
} sha1_ctx_t;
|
|
|
|
|
|
|
|
void sha1_begin(sha1_ctx_t *ctx);
|
|
|
|
void sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx);
|
|
|
|
void *sha1_end(void *resbuf, sha1_ctx_t *ctx);
|
|
|
|
|
|
|
|
typedef struct _md5_ctx_t_ {
|
|
|
|
uint32_t A;
|
|
|
|
uint32_t B;
|
|
|
|
uint32_t C;
|
|
|
|
uint32_t D;
|
2006-05-16 02:38:26 +00:00
|
|
|
uint64_t total;
|
2006-02-21 06:44:43 +00:00
|
|
|
uint32_t buflen;
|
|
|
|
char buffer[128];
|
|
|
|
} md5_ctx_t;
|
|
|
|
|
|
|
|
void md5_begin(md5_ctx_t *ctx);
|
|
|
|
void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
|
|
|
|
void *md5_end(void *resbuf, md5_ctx_t *ctx);
|
2003-11-10 04:33:55 +00:00
|
|
|
|
2006-08-03 15:41:12 +00:00
|
|
|
extern uint32_t *crc32_filltable (int endian);
|
2006-04-10 17:07:15 +00:00
|
|
|
|
2006-05-31 22:09:03 +00:00
|
|
|
#ifndef RB_POWER_OFF
|
|
|
|
/* Stop system and switch power off if possible. */
|
|
|
|
#define RB_POWER_OFF 0x4321fedc
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern const char BB_BANNER[];
|
|
|
|
|
2006-07-06 17:22:54 +00:00
|
|
|
// Make sure we call functions instead of macros.
|
|
|
|
#undef isalnum
|
|
|
|
#undef isalpha
|
|
|
|
#undef isascii
|
|
|
|
#undef isblank
|
|
|
|
#undef iscntrl
|
|
|
|
#undef isdigit
|
|
|
|
#undef isgraph
|
|
|
|
#undef islower
|
|
|
|
#undef isprint
|
|
|
|
#undef ispunct
|
|
|
|
#undef isspace
|
|
|
|
#undef isupper
|
|
|
|
#undef isxdigit
|
|
|
|
|
2006-08-28 23:31:54 +00:00
|
|
|
#ifdef DMALLOC
|
|
|
|
#include <dmalloc.h>
|
|
|
|
#endif
|
|
|
|
|
2006-01-22 22:55:11 +00:00
|
|
|
#endif /* __LIBBUSYBOX_H__ */
|