X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Flibbb.h;h=d94dd598eaa45719c65b23ee5a99f776a11f8fca;hb=a5b3e76c38371c2c5781c11cfe5980aeb041e034;hp=60743311876d033097ccd4d5be2015cd203c1947;hpb=459e4d6cf77940977a064edab60c7162731554fb;p=oweals%2Fbusybox.git diff --git a/include/libbb.h b/include/libbb.h index 607433118..d94dd598e 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -60,7 +60,7 @@ #define PATH_MAX 256 #endif -/* Not (yet) used, but tested to work correctly +/* Tested to work correctly (IIRC :]) */ #define MAXINT(T) (T)( \ ((T)-1) > 0 \ ? (T)-1 \ @@ -72,7 +72,6 @@ ? (T)0 \ : ((T)1 << (sizeof(T)*8-1)) \ ) -*/ /* Large file support */ /* Note that CONFIG_LFS forces bbox to be built with all common ops @@ -86,30 +85,33 @@ /* CONFIG_LFS is on */ # if ULONG_MAX > 0xffffffff /* "long" is long enough on this system */ -# define STRTOOFF strtol -# define SAFE_STRTOOFF safe_strtol -# define XSTRTOUOFF xstrtoul -# define OFF_FMT "ld" +# define XATOOFF(a) xatoul_range(a, 0, LONG_MAX) +/* usage: sz = BB_STRTOOFF(s, NULL, 10); if (errno || sz < 0) die(); */ +# define BB_STRTOOFF bb_strtoul +# define STRTOOFF strtoul +/* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */ +# define OFF_FMT "l" # else /* "long" is too short, need "long long" */ -# define STRTOOFF strtoll -# define SAFE_STRTOOFF safe_strtoll -# define XSTRTOUOFF xstrtoull -# define OFF_FMT "lld" +# define XATOOFF(a) xatoull_range(a, 0, LLONG_MAX) +# define BB_STRTOOFF bb_strtoull +# define STRTOOFF strtoull +# define OFF_FMT "ll" # endif #else -# if 0 /* #if UINT_MAX == 0xffffffff */ -/* 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... */ +/* CONFIG_LFS is off */ +# if UINT_MAX == 0xffffffff +/* While sizeof(off_t) == sizeof(int), off_t is typedef'ed to long anyway. + * gcc will throw warnings on printf("%d", off_t). Crap... */ +# define XATOOFF(a) xatoi_u(a) +# define BB_STRTOOFF bb_strtou # define STRTOOFF strtol -# define SAFE_STRTOOFF safe_strtoi -# define XSTRTOUOFF xstrtou -# define OFF_FMT "d" +# define OFF_FMT "l" # else +# define XATOOFF(a) xatoul_range(a, 0, LONG_MAX) +# define BB_STRTOOFF bb_strtoul # define STRTOOFF strtol -# define SAFE_STRTOOFF safe_strtol -# define XSTRTOUOFF xstrtoul -# define OFF_FMT "ld" +# define OFF_FMT "l" # endif #endif /* scary. better ideas? (but do *test* them first!) */ @@ -157,7 +159,7 @@ #endif -#if (__GLIBC__ < 2) +#if defined(__GLIBC__) && __GLIBC__ < 2 int vdprintf(int d, const char *format, va_list ap); #endif // This is declared here rather than #including in order to avoid @@ -201,10 +203,17 @@ extern int recursive_action(const char *fileName, int recurse, extern int device_open(const char *device, int mode); extern int get_console_fd(void); extern char *find_block_device(char *path); -extern off_t bb_copyfd_size(int fd1, int fd2, off_t size); +/* bb_copyfd_XX print read/write errors and return -1 if they occur */ extern off_t bb_copyfd_eof(int fd1, int fd2); +extern off_t bb_copyfd_size(int fd1, int fd2, off_t size); +extern void bb_copyfd_exact_size(int fd1, int fd2, off_t size); +/* "short" copy can be detected by return value < size */ +/* this helper yells "short read!" if param is not -1 */ +extern void complain_copyfd_and_die(off_t sz) ATTRIBUTE_NORETURN; extern char bb_process_escape_sequence(const char **ptr); extern char *bb_get_last_path_component(char *path); +extern int ndelay_on(int fd); +extern int ndelay_off(int fd); extern DIR *xopendir(const char *path); @@ -226,6 +235,7 @@ extern int xopen3(const char *pathname, int flags, int mode); extern off_t xlseek(int fd, off_t offset, int whence); extern off_t fdlength(int fd); + extern int xsocket(int domain, int type, int protocol); extern void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); extern void xlisten(int s, int backlog); @@ -233,11 +243,34 @@ extern void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen); extern int xconnect_tcp_v4(struct sockaddr_in *s_addr); extern struct hostent *xgethostbyname(const char *name); extern struct hostent *xgethostbyname2(const char *name, int af); +extern int xsocket_stream_ip4or6(sa_family_t *fp); +typedef union { + struct sockaddr sa; + struct sockaddr_in sin; +#if ENABLE_FEATURE_IPV6 + struct sockaddr_in6 sin6; +#endif +} sockaddr_inet; +extern int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen); +extern int create_and_bind_socket_ip4or6(const char *hostaddr, int port); +extern int setsockopt_reuseaddr(int fd); +extern int setsockopt_broadcast(int fd); + extern char *xstrdup(const char *s); extern char *xstrndup(const char *s, int n); extern char *safe_strncpy(char *dst, const char *src, size_t size); extern char *xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); +// gcc-4.1.1 still isn't good enough at optimizing it +// (+200 bytes compared to macro) +//static ATTRIBUTE_ALWAYS_INLINE +//int LONE_DASH(const char *s) { return s[0] == '-' && !s[1]; } +//static ATTRIBUTE_ALWAYS_INLINE +//int NOT_LONE_DASH(const char *s) { return s[0] != '-' || s[1]; } +#define LONE_DASH(s) ((s)[0] == '-' && !(s)[1]) +#define NOT_LONE_DASH(s) ((s)[0] != '-' || (s)[1]) +#define LONE_CHAR(s,c) ((s)[0] == (c) && !(s)[1]) +#define NOT_LONE_CHAR(s,c) ((s)[0] != (c) || (s)[1]) /* dmalloc will redefine these to it's own implementation. It is safe * to have the prototypes here unconditionally. */ @@ -256,7 +289,7 @@ extern void *xmalloc_open_read_close(const char *filename, size_t *sizep); extern ssize_t safe_write(int fd, const void *buf, size_t count); extern ssize_t full_write(int fd, const void *buf, size_t count); -extern void xwrite(int fd, void *buf, size_t count); +extern void xwrite(int fd, const void *buf, size_t count); /* Reads and prints to stdout till eof, then closes FILE. Exits on error: */ extern void xprint_and_close_file(FILE *file); @@ -278,71 +311,23 @@ extern FILE *fopen_or_warn(const char *filename, const char *mode); extern FILE *fopen_or_warn_stdin(const char *filename); +extern void smart_ulltoa5(unsigned long long ul, char buf[5]); 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); -// 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); - struct suffix_mult { const char *suffix; unsigned mult; }; -unsigned long long xstrtoull(const char *numstr, int base); -unsigned long long xatoull(const char *numstr); -unsigned long xstrtoul_range_sfx(const char *numstr, int base, - unsigned long lower, - unsigned long upper, - const struct suffix_mult *suffixes); -unsigned long xstrtoul_range(const char *numstr, int base, - unsigned long lower, - unsigned long upper); -unsigned long xstrtoul_sfx(const char *numstr, int base, - const struct suffix_mult *suffixes); -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, - unsigned long lower, - unsigned long upper); -unsigned long xatoul(const char *numstr); -long xstrtol_range_sfx(const char *numstr, int base, - long lower, - long upper, - const struct suffix_mult *suffixes); -long xstrtol_range(const char *numstr, int base, long lower, long upper); -long xatol_range_sfx(const char *numstr, - long lower, - long upper, - const struct suffix_mult *suffixes); -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); +#include "xatonum.h" /* Specialized: */ -unsigned xatou(const char *numstr); -int xatoi_range(const char *numstr, int lower, int upper); -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); @@ -352,7 +337,7 @@ uint16_t xatou16(const char *numstr); * 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); -extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix); +/*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); /* from chpst */ @@ -365,7 +350,9 @@ extern unsigned uidgid_get(struct bb_uidgid_t*, const char* /*, unsigned*/); enum { BB_GETOPT_ERROR = 0x80000000 }; extern const char *opt_complementary; +#if ENABLE_GETOPT_LONG extern const struct option *applet_long_options; +#endif extern uint32_t option_mask32; extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...); @@ -401,13 +388,15 @@ extern void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, extern void bb_perror_nomsg_and_die(void) ATTRIBUTE_NORETURN; extern void bb_perror_nomsg(void); extern void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); -/* These two are used internally -- you shouldn't need to use them */ +/* These are used internally -- you shouldn't need to use them */ extern void bb_verror_msg(const char *s, va_list p, const char *strerr); extern void bb_vperror_msg(const char *s, va_list p); extern void bb_vinfo_msg(const char *s, va_list p); -extern int bb_echo(int argc, char** argv); +/* applets which are useful from another applets */ +extern int bb_cat(char** argv); +extern int bb_echo(char** argv); extern int bb_test(int argc, char** argv); #ifndef BUILD_INDIVIDUAL @@ -470,13 +459,13 @@ extern void run_shell(const char *shell, int loginshell, const char *command, co extern void renew_current_security_context(void); extern void set_current_security_context(security_context_t sid); #endif -extern int run_parts(char **args, const unsigned char test_mode, char **env); 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); extern char *pw_encrypt(const char *clear, const char *salt); extern int obscure(const char *old, const char *newval, const struct passwd *pwdp); -extern int compare_string_array(const char * const string_array[], const char *key); +extern int index_in_str_array(const char * const string_array[], const char *key); +extern int index_in_substr_array(const char * const string_array[], const char *key); extern void print_login_issue(const char *issue_file, const char *tty); extern void print_login_prompt(void); #ifdef BB_NOMMU @@ -490,6 +479,12 @@ extern unsigned long get_ug_id(const char *s, long (*__bb_getxxnam)(const char * 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); +#ifdef __GLIBC__ +/* At least glibc has horrendously large inline for this, so wrap it */ +extern unsigned long long bb_makedev(unsigned int major, unsigned int minor); +#undef makedev +#define makedev(a,b) bb_makedev(a,b) +#endif #ifndef COMM_LEN @@ -542,6 +537,7 @@ pid_t *find_pid_by_name(const char* procName); pid_t *pidlist_reverse(pid_t *pidList); void clear_username_cache(void); const char* get_cached_username(uid_t uid); +const char* get_cached_groupname(gid_t gid); extern const char bb_uuenc_tbl_base64[]; @@ -592,7 +588,6 @@ 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[]; @@ -601,6 +596,8 @@ 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_str_default[]; + extern const char bb_path_mtab_file[]; extern const char bb_path_nologin_file[]; extern const char bb_path_passwd_file[]; @@ -684,13 +681,12 @@ extern const char bb_default_login_shell[]; #define RB_POWER_OFF 0x4321fedc #endif -// Make sure we call functions instead of macros. +/* 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 @@ -699,6 +695,11 @@ extern const char bb_default_login_shell[]; #undef isupper #undef isxdigit +/* This one is more efficient - we save ~400 bytes */ +#undef isdigit +#define isdigit(a) ((unsigned)((a) - '0') <= 9) + + #ifdef DMALLOC #include #endif