X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Flibbb.h;h=ac818a9eaaadd5f3fde47fea9b76c4bf57626ca5;hb=0ef64bdb40c54681e8dd5ab8df42ac88e4ab1d4a;hp=5e962fdb6f67557ce3c3b001ece0933fade25ffe;hpb=adbbee46ad0661bf695d2bfe7a07ebced4bbe780;p=oweals%2Fbusybox.git diff --git a/include/libbb.h b/include/libbb.h index 5e962fdb6..ac818a9ea 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -3,9 +3,9 @@ * Busybox main internal header file * * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. + * Permission has been granted to redistribute this code under GPL. * - * Licensed under the GPL version 2, see the file LICENSE in this tarball. + * Licensed under GPLv2, see file LICENSE in this source tree. */ #ifndef LIBBB_H #define LIBBB_H 1 @@ -41,16 +41,16 @@ #include #include #ifdef HAVE_MNTENT_H -#include +# include #endif #ifdef HAVE_SYS_STATFS_H -#include +# include #endif #if ENABLE_SELINUX -#include -#include -#include -#include +# include +# include +# include +# include #endif #if ENABLE_LOCALE_SUPPORT # include @@ -70,7 +70,7 @@ # include # endif #endif -#if defined __FreeBSD__ +#if defined __FreeBSD__ || defined __OpenBSD__ # include # include #elif defined __APPLE__ @@ -190,7 +190,7 @@ typedef unsigned long long uoff_t; /* While sizeof(off_t) == sizeof(int), off_t is typedef'ed to long anyway. * gcc will throw warnings on printf("%d", off_t). Crap... */ typedef unsigned long uoff_t; -# define XATOOFF(a) xatoi_u(a) +# define XATOOFF(a) xatoi_positive(a) # define BB_STRTOOFF bb_strtou # define STRTOOFF strtol # define OFF_FMT "l" @@ -408,6 +408,7 @@ void xchdir(const char *path) FAST_FUNC; void xchroot(const char *path) FAST_FUNC; void xsetenv(const char *key, const char *value) FAST_FUNC; void bb_unsetenv(const char *key) FAST_FUNC; +void bb_unsetenv_and_free(char *key) FAST_FUNC; void xunlink(const char *pathname) FAST_FUNC; void xstat(const char *pathname, struct stat *buf) FAST_FUNC; int xopen(const char *pathname, int flags) FAST_FUNC; @@ -764,11 +765,16 @@ struct suffix_mult { }; #include "xatonum.h" /* Specialized: */ + /* 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) FAST_FUNC; + * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc. + * It should really be named xatoi_nonnegative (since it allows 0), + * but that would be too long. + */ +int xatoi_positive(const char *numstr) FAST_FUNC; + /* Useful for reading port numbers */ uint16_t xatou16(const char *numstr) FAST_FUNC; @@ -838,6 +844,20 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC; #define BB_EXECVP(prog,cmd) execvp(prog,cmd) #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) #endif +int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC; + +/* xvfork() can't be a _function_, return after vfork mangles stack + * in the parent. It must be a macro. */ +#define xvfork() \ +({ \ + pid_t bb__xvfork_pid = vfork(); \ + if (bb__xvfork_pid < 0) \ + bb_perror_msg_and_die("vfork"); \ + bb__xvfork_pid; \ +}) +#if BB_MMU +pid_t xfork(void) FAST_FUNC; +#endif /* NOMMU friendy fork+exec: */ pid_t spawn(char **argv) FAST_FUNC; @@ -884,7 +904,7 @@ int run_nofork_applet_prime(struct nofork_save_area *old, int applet_no, char ** * Both of the above will redirect fd 0,1,2 to /dev/null and drop ctty * (will do setsid()). * - * fork_or_rexec(argv) = bare-bones "fork" on MMU, + * fork_or_rexec(argv) = bare-bones fork on MMU, * "vfork + re-exec ourself" on NOMMU. No fd redirection, no setsid(). * On MMU ignores argv. * @@ -900,19 +920,19 @@ enum { DAEMON_ONLY_SANITIZE = 8, /* internal use */ }; #if BB_MMU - pid_t fork_or_rexec(void) FAST_FUNC; enum { re_execed = 0 }; -# define fork_or_rexec(argv) fork_or_rexec() +# define fork_or_rexec(argv) xfork() # define bb_daemonize_or_rexec(flags, argv) bb_daemonize_or_rexec(flags) # define bb_daemonize(flags) bb_daemonize_or_rexec(flags, bogus) #else + extern bool re_execed; void re_exec(char **argv) NORETURN FAST_FUNC; pid_t fork_or_rexec(char **argv) FAST_FUNC; - extern bool re_execed; int BUG_fork_is_unavailable_on_nommu(void) FAST_FUNC; int BUG_daemon_is_unavailable_on_nommu(void) FAST_FUNC; void BUG_bb_daemonize_is_unavailable_on_nommu(void) FAST_FUNC; # define fork() BUG_fork_is_unavailable_on_nommu() +# define xfork() BUG_fork_is_unavailable_on_nommu() # define daemon(a,b) BUG_daemon_is_unavailable_on_nommu() # define bb_daemonize(a) BUG_bb_daemonize_is_unavailable_on_nommu() #endif @@ -1156,7 +1176,6 @@ char *bb_simplify_abs_path_inplace(char *path) FAST_FUNC; extern void bb_do_delay(int seconds) FAST_FUNC; extern void change_identity(const struct passwd *pw) FAST_FUNC; extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) NORETURN FAST_FUNC; -extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) FAST_FUNC; #if ENABLE_SELINUX extern void renew_current_security_context(void) FAST_FUNC; extern void set_current_security_context(security_context_t sid) FAST_FUNC; @@ -1460,6 +1479,8 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags) FAST_FUNC; void read_cmdline(char *buf, int size, unsigned pid, const char *comm) FAST_FUNC; pid_t *find_pid_by_name(const char* procName) FAST_FUNC; pid_t *pidlist_reverse(pid_t *pidList) FAST_FUNC; +int starts_with_cpu(const char *str) FAST_FUNC; +unsigned get_cpu_count(void) FAST_FUNC; extern const char bb_uuenc_tbl_base64[]; @@ -1592,32 +1613,52 @@ extern struct globals *const ptr_to_globals; * use bb_default_login_shell and following defines. * If you change LIBBB_DEFAULT_LOGIN_SHELL, * don't forget to change increment constant. */ -#define LIBBB_DEFAULT_LOGIN_SHELL "-/bin/sh" +#define LIBBB_DEFAULT_LOGIN_SHELL "-/bin/sh" extern const char bb_default_login_shell[]; /* "/bin/sh" */ -#define DEFAULT_SHELL (bb_default_login_shell+1) +#define DEFAULT_SHELL (bb_default_login_shell+1) /* "sh" */ -#define DEFAULT_SHELL_SHORT_NAME (bb_default_login_shell+6) +#define DEFAULT_SHELL_SHORT_NAME (bb_default_login_shell+6) -#if ENABLE_FEATURE_DEVFS +/* The following devices are the same on all systems. */ +#define CURRENT_TTY "/dev/tty" +#define DEV_CONSOLE "/dev/console" + +#if defined(__FreeBSD_kernel__) +# define CURRENT_VC CURRENT_TTY +# define VC_1 "/dev/ttyv0" +# define VC_2 "/dev/ttyv1" +# define VC_3 "/dev/ttyv2" +# define VC_4 "/dev/ttyv3" +# define VC_5 "/dev/ttyv4" +# define VC_FORMAT "/dev/ttyv%d" +#elif defined(__GNU__) +# define CURRENT_VC CURRENT_TTY +# 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" +# define VC_FORMAT "/dev/tty%d" +#elif ENABLE_FEATURE_DEVFS /* from now on, assume Linux naming */ # 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" -#if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__) +# 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 +# else # define SC_0 "/dev/tts/0" # define SC_1 "/dev/tts/1" # define SC_FORMAT "/dev/tts/%d" -#endif +# endif # define VC_FORMAT "/dev/vc/%d" # define LOOP_FORMAT "/dev/loop/%d" # define LOOP_NAMESIZE (sizeof("/dev/loop/") + sizeof(int)*3 + 1) @@ -1630,15 +1671,15 @@ extern const char bb_default_login_shell[]; # define VC_3 "/dev/tty3" # define VC_4 "/dev/tty4" # define VC_5 "/dev/tty5" -#if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__) +# if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__) # define SC_0 "/dev/ttySC0" # define SC_1 "/dev/ttySC1" # define SC_FORMAT "/dev/ttySC%d" -#else +# else # define SC_0 "/dev/ttyS0" # define SC_1 "/dev/ttyS1" # define SC_FORMAT "/dev/ttyS%d" -#endif +# endif # define VC_FORMAT "/dev/tty%d" # define LOOP_FORMAT "/dev/loop%d" # define LOOP_NAMESIZE (sizeof("/dev/loop") + sizeof(int)*3 + 1) @@ -1646,10 +1687,6 @@ extern const char bb_default_login_shell[]; # define FB_0 "/dev/fb0" #endif -/* The following devices are the same on devfs and non-devfs systems. */ -#define CURRENT_TTY "/dev/tty" -#define DEV_CONSOLE "/dev/console" - #define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0])))