diff options
Diffstat (limited to 'src/toybox.h')
-rw-r--r-- | src/toybox.h | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/src/toybox.h b/src/toybox.h new file mode 100644 index 0000000..1f64310 --- /dev/null +++ b/src/toybox.h | |||
@@ -0,0 +1,278 @@ | |||
1 | |||
2 | #ifdef __GNUC__ | ||
3 | #define printf_format __attribute__((format(printf, 1, 2))) | ||
4 | #else | ||
5 | #define printf_format | ||
6 | #endif | ||
7 | |||
8 | // General posix-2008 headers | ||
9 | #include <ctype.h> | ||
10 | #include <dirent.h> | ||
11 | #include <errno.h> | ||
12 | #include <fcntl.h> | ||
13 | #include <fnmatch.h> | ||
14 | #include <grp.h> | ||
15 | #include <inttypes.h> | ||
16 | #include <limits.h> | ||
17 | #include <math.h> | ||
18 | #include <paths.h> | ||
19 | #include <pwd.h> | ||
20 | #include <regex.h> | ||
21 | #include <sched.h> | ||
22 | #include <setjmp.h> | ||
23 | #include <signal.h> | ||
24 | #include <stdarg.h> | ||
25 | #include <stddef.h> | ||
26 | #include <stdint.h> | ||
27 | #include <stdio.h> | ||
28 | #include <stdlib.h> | ||
29 | #include <string.h> | ||
30 | #include <strings.h> | ||
31 | #include <sys/mman.h> | ||
32 | #include <sys/resource.h> | ||
33 | #include <sys/stat.h> | ||
34 | #include <sys/statvfs.h> | ||
35 | #include <sys/time.h> | ||
36 | #include <sys/times.h> | ||
37 | #include <sys/utsname.h> | ||
38 | #include <sys/wait.h> | ||
39 | #include <syslog.h> | ||
40 | #include <termios.h> | ||
41 | #include <time.h> | ||
42 | #include <unistd.h> | ||
43 | #include <utime.h> | ||
44 | |||
45 | // Posix networking | ||
46 | |||
47 | #include <arpa/inet.h> | ||
48 | #include <netdb.h> | ||
49 | #include <net/if.h> | ||
50 | #include <netinet/in.h> | ||
51 | #include <netinet/tcp.h> | ||
52 | #include <poll.h> | ||
53 | #include <sys/socket.h> | ||
54 | #include <sys/un.h> | ||
55 | |||
56 | // Linux headers not listed by POSIX or LSB | ||
57 | #include <sys/mount.h> | ||
58 | #ifdef __linux__ | ||
59 | #include <sys/statfs.h> | ||
60 | #include <sys/swap.h> | ||
61 | #include <sys/sysinfo.h> | ||
62 | #endif | ||
63 | |||
64 | #define WARN_ONLY (1<<31) | ||
65 | |||
66 | // xwrap.c | ||
67 | //void xstrncpy(char *dest, char *src, size_t size); | ||
68 | //void xstrncat(char *dest, char *src, size_t size); | ||
69 | void _xexit(void) __attribute__((__noreturn__)); | ||
70 | void xexit(void) __attribute__((__noreturn__)); | ||
71 | //void *xmmap(void *addr, size_t length, int prot, int flags, int fd, off_t off); | ||
72 | void *xmalloc(size_t size); | ||
73 | void *xzalloc(size_t size); | ||
74 | void *xrealloc(void *ptr, size_t size); | ||
75 | char *xstrndup(char *s, size_t n); | ||
76 | char *xstrdup(char *s); | ||
77 | void *xmemdup(void *s, long len); | ||
78 | char *xmprintf(char *format, ...) printf_format; | ||
79 | //void xprintf(char *format, ...) printf_format; | ||
80 | //void xputsl(char *s, int len); | ||
81 | //void xputsn(char *s); | ||
82 | //void xputs(char *s); | ||
83 | //void xputc(char c); | ||
84 | void xflush(int flush); | ||
85 | //void xexec(char **argv); | ||
86 | //pid_t xpopen_setup(char **argv, int *pipes, void (*callback)(void)); | ||
87 | //pid_t xpopen_both(char **argv, int *pipes); | ||
88 | //int xwaitpid(pid_t pid); | ||
89 | //int xpclose_both(pid_t pid, int *pipes); | ||
90 | //pid_t xpopen(char **argv, int *pipe, int isstdout); | ||
91 | //pid_t xpclose(pid_t pid, int pipe); | ||
92 | //int xrun(char **argv); | ||
93 | //int xpspawn(char **argv, int*pipes); | ||
94 | //void xaccess(char *path, int flags); | ||
95 | //void xunlink(char *path); | ||
96 | //void xrename(char *from, char *to); | ||
97 | //int xtempfile(char *name, char **tempname); | ||
98 | //int xcreate(char *path, int flags, int mode); | ||
99 | int xopen(char *path, int flags); | ||
100 | int xcreate_stdio(char *path, int flags, int mode); | ||
101 | int xopen_stdio(char *path, int flags); | ||
102 | int openro(char *path, int flags); | ||
103 | int xopenro(char *path); | ||
104 | //void xpipe(int *pp); | ||
105 | void xclose(int fd); | ||
106 | int xdup(int fd); | ||
107 | int notstdio(int fd); | ||
108 | //FILE *xfdopen(int fd, char *mode); | ||
109 | //FILE *xfopen(char *path, char *mode); | ||
110 | //size_t xread(int fd, void *buf, size_t len); | ||
111 | //void xreadall(int fd, void *buf, size_t len); | ||
112 | //void xwrite(int fd, void *buf, size_t len); | ||
113 | //off_t xlseek(int fd, off_t offset, int whence); | ||
114 | //char *xreadfile(char *name, char *buf, off_t len); | ||
115 | //int xioctl(int fd, int request, void *data); | ||
116 | //char *xgetcwd(void); | ||
117 | //void xstat(char *path, struct stat *st); | ||
118 | //char *xabspath(char *path, int exact); | ||
119 | //void xchdir(char *path); | ||
120 | //void xchroot(char *path); | ||
121 | //struct passwd *xgetpwuid(uid_t uid); | ||
122 | //struct group *xgetgrgid(gid_t gid); | ||
123 | //struct passwd *xgetpwnam(char *name); | ||
124 | //struct group *xgetgrnam(char *name); | ||
125 | //unsigned xgetuid(char *name); | ||
126 | //unsigned xgetgid(char *name); | ||
127 | //void xsetuser(struct passwd *pwd); | ||
128 | //char *xreadlink(char *name); | ||
129 | //double xstrtod(char *s); | ||
130 | //long xparsetime(char *arg, long units, long *fraction); | ||
131 | //long long xparsemillitime(char *arg); | ||
132 | //void xpidfile(char *name); | ||
133 | void xregcomp(regex_t *preg, char *rexec, int cflags); | ||
134 | //char *xtzset(char *new); | ||
135 | //void xsignal_flags(int signal, void *handler, int flags); | ||
136 | //void xsignal(int signal, void *handler); | ||
137 | //time_t xvali_date(struct tm *tm, char *str); | ||
138 | //void xparsedate(char *str, time_t *t, unsigned *nano, int endian); | ||
139 | //char *xgetline(FILE *fp, int *len); | ||
140 | |||
141 | // lib.c | ||
142 | void tb_verror_msg(char *msg, int err, va_list va); | ||
143 | void tb_error_msg(char *msg, ...) printf_format; | ||
144 | void tb_perror_msg(char *msg, ...) printf_format; | ||
145 | void tb_error_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); | ||
146 | void tb_perror_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); | ||
147 | //void help_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); | ||
148 | void tb_error_msg_raw(char *msg); | ||
149 | void tb_perror_msg_raw(char *msg); | ||
150 | void tb_error_exit_raw(char *msg); | ||
151 | void tb_perror_exit_raw(char *msg); | ||
152 | //ssize_t readall(int fd, void *buf, size_t len); | ||
153 | //ssize_t writeall(int fd, void *buf, size_t len); | ||
154 | //off_t lskip(int fd, off_t offset); | ||
155 | //#define MKPATHAT_MKLAST 1 | ||
156 | //#define MKPATHAT_MAKE 2 | ||
157 | //#define MKPATHAT_VERBOSE 4 | ||
158 | //int mkpathat(int atfd, char *dir, mode_t lastmode, int flags); | ||
159 | //int mkpath(char *dir); | ||
160 | //struct string_list **splitpath(char *path, struct string_list **list); | ||
161 | //char *readfileat(int dirfd, char *name, char *buf, off_t *len); | ||
162 | //char *readfile(char *name, char *buf, off_t len); | ||
163 | void msleep(long milliseconds); | ||
164 | //void nanomove(struct timespec *ts, long long offset); | ||
165 | //long long nanodiff(struct timespec *old, struct timespec *new); | ||
166 | //int highest_bit(unsigned long l); | ||
167 | //int64_t peek_le(void *ptr, unsigned size); | ||
168 | //int64_t peek_be(void *ptr, unsigned size); | ||
169 | //int64_t peek(void *ptr, unsigned size); | ||
170 | //void poke_le(void *ptr, long long val, unsigned size); | ||
171 | //void poke_be(void *ptr, long long val, unsigned size); | ||
172 | //void poke(void *ptr, long long val, unsigned size); | ||
173 | //struct string_list *find_in_path(char *path, char *filename); | ||
174 | //long long estrtol(char *str, char **end, int base); | ||
175 | //long long xstrtol(char *str, char **end, int base); | ||
176 | //long long atolx(char *c); | ||
177 | //long long atolx_range(char *numstr, long long low, long long high); | ||
178 | //int stridx(char *haystack, char needle); | ||
179 | //int utf8towc(wchar_t *wc, char *str, unsigned len); | ||
180 | //char *strlower(char *s); | ||
181 | //char *strafter(char *haystack, char *needle); | ||
182 | //char *chomp(char *s); | ||
183 | //int unescape(char c); | ||
184 | //char *strend(char *str, char *suffix); | ||
185 | //int strstart(char **a, char *b); | ||
186 | //int strcasestart(char **a, char *b); | ||
187 | //off_t fdlength(int fd); | ||
188 | //void loopfiles_rw(char **argv, int flags, int permissions, | ||
189 | // void (*function)(int fd, char *name)); | ||
190 | //void loopfiles(char **argv, void (*function)(int fd, char *name)); | ||
191 | //void loopfiles_lines(char **argv, void (*function)(char **pline, long len)); | ||
192 | //long long sendfile_len(int in, int out, long long len, long long *consumed); | ||
193 | //long long xsendfile_len(int in, int out, long long len); | ||
194 | //void xsendfile_pad(int in, int out, long long len); | ||
195 | //long long xsendfile(int in, int out); | ||
196 | //int wfchmodat(int rc, char *name, mode_t mode); | ||
197 | //int copy_tempfile(int fdin, char *name, char **tempname); | ||
198 | //void delete_tempfile(int fdin, int fdout, char **tempname); | ||
199 | //void replace_tempfile(int fdin, int fdout, char **tempname); | ||
200 | //void crc_init(unsigned int *crc_table, int little_endian); | ||
201 | //void base64_init(char *p); | ||
202 | //int yesno(int def); | ||
203 | //int fyesno(FILE *fp, int def); | ||
204 | int qstrcmp(const void *a, const void *b); | ||
205 | //void tb_create_uuid(char *uuid); | ||
206 | //char *tb_show_uuid(char *uuid); | ||
207 | //char *next_printf(char *s, char **start); | ||
208 | //struct passwd *bufgetpwuid(uid_t uid); | ||
209 | //struct group *bufgetgrgid(gid_t gid); | ||
210 | //int readlinkat0(int dirfd, char *path, char *buf, int len); | ||
211 | //int readlink0(char *path, char *buf, int len); | ||
212 | //int regexec0(regex_t *preg, char *string, long len, int nmatch, | ||
213 | // regmatch_t pmatch[], int eflags); | ||
214 | //char *getusername(uid_t uid); | ||
215 | //char *getgroupname(gid_t gid); | ||
216 | //void do_lines(int fd, char delim, void (*call)(char **pline, long len)); | ||
217 | //long long millitime(void); | ||
218 | //char *format_iso_time(char *buf, size_t len, struct timespec *ts); | ||
219 | //void reset_env(struct passwd *p, int clear); | ||
220 | //void loggit(int priority, char *format, ...); | ||
221 | //unsigned tar_cksum(void *data); | ||
222 | //int is_tar_header(void *pkt); | ||
223 | //char *elf_arch_name(int type); | ||
224 | |||
225 | |||
226 | // pending.c | ||
227 | char *get_line(int fd); | ||
228 | |||
229 | |||
230 | // dirtree.c | ||
231 | |||
232 | // Values returnable from callback function (bitfield, or them together) | ||
233 | // Default with no callback is 0 | ||
234 | |||
235 | // Add this node to the tree | ||
236 | #define TB_DIRTREE_SAVE 1 | ||
237 | // Recurse into children | ||
238 | #define TB_DIRTREE_RECURSE 2 | ||
239 | // Call again after handling all children of this directory | ||
240 | // (Ignored for non-directories, sets linklen = -1 before second call.) | ||
241 | #define TB_DIRTREE_COMEAGAIN 4 | ||
242 | // Follow symlinks to directories | ||
243 | #define TB_DIRTREE_SYMFOLLOW 8 | ||
244 | // Don't warn about failure to stat | ||
245 | #define TB_DIRTREE_SHUTUP 16 | ||
246 | // Breadth first traversal, conserves filehandles at the expense of memory | ||
247 | #define TB_DIRTREE_BREADTH 32 | ||
248 | // skip non-numeric entries | ||
249 | #define TB_DIRTREE_PROC 64 | ||
250 | // Return files we can't stat | ||
251 | #define TB_DIRTREE_STATLESS 128 | ||
252 | // Don't look at any more files in this directory. | ||
253 | #define TB_DIRTREE_ABORT 256 | ||
254 | |||
255 | #define TB_DIRTREE_ABORTVAL ((struct tb_dirtree *)1) | ||
256 | |||
257 | struct tb_dirtree { | ||
258 | struct tb_dirtree *next, *parent, *child; | ||
259 | long extra; // place for user to store their stuff (can be pointer) | ||
260 | char *symlink; | ||
261 | int dirfd; | ||
262 | struct stat st; | ||
263 | char again; | ||
264 | char name[]; | ||
265 | }; | ||
266 | |||
267 | int tb_isdotdot(char *name); | ||
268 | struct tb_dirtree *tb_dirtree_add_node(struct tb_dirtree *p, char *name, int flags); | ||
269 | char *tb_dirtree_path(struct tb_dirtree *node, int *plen); | ||
270 | int tb_dirtree_notdotdot(struct tb_dirtree *catch); | ||
271 | int tb_dirtree_parentfd(struct tb_dirtree *node); | ||
272 | int tb_dirtree_recurse(struct tb_dirtree *node, int (*callback)(struct tb_dirtree *node), | ||
273 | int dirfd, int symfollow); | ||
274 | |||
275 | // Rob forget to do this, but at least he didn't declare it static. | ||
276 | struct tb_dirtree *tb_dirtree_handle_callback(struct tb_dirtree *new, int (*callback)(struct tb_dirtree *node)); | ||
277 | void tb_dirtree_free(struct tb_dirtree *new); | ||
278 | |||