#ifdef __GNUC__ #define printf_format __attribute__((format(printf, 1, 2))) #else #define printf_format #endif // General posix-2008 headers #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Posix networking #include #include #include #include #include #include #include #include // Linux headers not listed by POSIX or LSB #include #ifdef __linux__ #include #include #include #endif #define WARN_ONLY (1<<31) // xwrap.c //void xstrncpy(char *dest, char *src, size_t size); //void xstrncat(char *dest, char *src, size_t size); void _xexit(void) __attribute__((__noreturn__)); void xexit(void) __attribute__((__noreturn__)); //void *xmmap(void *addr, size_t length, int prot, int flags, int fd, off_t off); void *xmalloc(size_t size); void *xzalloc(size_t size); void *xrealloc(void *ptr, size_t size); char *xstrndup(char *s, size_t n); char *xstrdup(char *s); void *xmemdup(void *s, long len); char *xmprintf(char *format, ...) printf_format; //void xprintf(char *format, ...) printf_format; //void xputsl(char *s, int len); //void xputsn(char *s); //void xputs(char *s); //void xputc(char c); void xflush(int flush); //void xexec(char **argv); //pid_t xpopen_setup(char **argv, int *pipes, void (*callback)(void)); //pid_t xpopen_both(char **argv, int *pipes); //int xwaitpid(pid_t pid); //int xpclose_both(pid_t pid, int *pipes); //pid_t xpopen(char **argv, int *pipe, int isstdout); //pid_t xpclose(pid_t pid, int pipe); //int xrun(char **argv); //int xpspawn(char **argv, int*pipes); //void xaccess(char *path, int flags); //void xunlink(char *path); //void xrename(char *from, char *to); //int xtempfile(char *name, char **tempname); //int xcreate(char *path, int flags, int mode); int xopen(char *path, int flags); int xcreate_stdio(char *path, int flags, int mode); int xopen_stdio(char *path, int flags); int openro(char *path, int flags); int xopenro(char *path); //void xpipe(int *pp); void xclose(int fd); int xdup(int fd); int notstdio(int fd); //FILE *xfdopen(int fd, char *mode); //FILE *xfopen(char *path, char *mode); //size_t xread(int fd, void *buf, size_t len); //void xreadall(int fd, void *buf, size_t len); //void xwrite(int fd, void *buf, size_t len); //off_t xlseek(int fd, off_t offset, int whence); //char *xreadfile(char *name, char *buf, off_t len); //int xioctl(int fd, int request, void *data); //char *xgetcwd(void); //void xstat(char *path, struct stat *st); //char *xabspath(char *path, int exact); //void xchdir(char *path); //void xchroot(char *path); //struct passwd *xgetpwuid(uid_t uid); //struct group *xgetgrgid(gid_t gid); //struct passwd *xgetpwnam(char *name); //struct group *xgetgrnam(char *name); //unsigned xgetuid(char *name); //unsigned xgetgid(char *name); //void xsetuser(struct passwd *pwd); //char *xreadlink(char *name); //double xstrtod(char *s); //long xparsetime(char *arg, long units, long *fraction); //long long xparsemillitime(char *arg); //void xpidfile(char *name); void xregcomp(regex_t *preg, char *rexec, int cflags); //char *xtzset(char *new); //void xsignal_flags(int signal, void *handler, int flags); //void xsignal(int signal, void *handler); //time_t xvali_date(struct tm *tm, char *str); //void xparsedate(char *str, time_t *t, unsigned *nano, int endian); //char *xgetline(FILE *fp, int *len); // lib.c void tb_verror_msg(char *msg, int err, va_list va); void tb_error_msg(char *msg, ...) printf_format; void tb_perror_msg(char *msg, ...) printf_format; void tb_error_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); void tb_perror_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); //void help_exit(char *msg, ...) printf_format __attribute__((__noreturn__)); void tb_error_msg_raw(char *msg); void tb_perror_msg_raw(char *msg); void tb_error_exit_raw(char *msg); void tb_perror_exit_raw(char *msg); //ssize_t readall(int fd, void *buf, size_t len); //ssize_t writeall(int fd, void *buf, size_t len); //off_t lskip(int fd, off_t offset); //#define MKPATHAT_MKLAST 1 //#define MKPATHAT_MAKE 2 //#define MKPATHAT_VERBOSE 4 //int mkpathat(int atfd, char *dir, mode_t lastmode, int flags); //int mkpath(char *dir); //struct string_list **splitpath(char *path, struct string_list **list); //char *readfileat(int dirfd, char *name, char *buf, off_t *len); //char *readfile(char *name, char *buf, off_t len); void msleep(long milliseconds); //void nanomove(struct timespec *ts, long long offset); //long long nanodiff(struct timespec *old, struct timespec *new); //int highest_bit(unsigned long l); //int64_t peek_le(void *ptr, unsigned size); //int64_t peek_be(void *ptr, unsigned size); //int64_t peek(void *ptr, unsigned size); //void poke_le(void *ptr, long long val, unsigned size); //void poke_be(void *ptr, long long val, unsigned size); //void poke(void *ptr, long long val, unsigned size); //struct string_list *find_in_path(char *path, char *filename); //long long estrtol(char *str, char **end, int base); //long long xstrtol(char *str, char **end, int base); //long long atolx(char *c); //long long atolx_range(char *numstr, long long low, long long high); //int stridx(char *haystack, char needle); //int utf8towc(wchar_t *wc, char *str, unsigned len); //char *strlower(char *s); //char *strafter(char *haystack, char *needle); //char *chomp(char *s); //int unescape(char c); //char *strend(char *str, char *suffix); //int strstart(char **a, char *b); //int strcasestart(char **a, char *b); //off_t fdlength(int fd); //void loopfiles_rw(char **argv, int flags, int permissions, // void (*function)(int fd, char *name)); //void loopfiles(char **argv, void (*function)(int fd, char *name)); //void loopfiles_lines(char **argv, void (*function)(char **pline, long len)); //long long sendfile_len(int in, int out, long long len, long long *consumed); //long long xsendfile_len(int in, int out, long long len); //void xsendfile_pad(int in, int out, long long len); //long long xsendfile(int in, int out); //int wfchmodat(int rc, char *name, mode_t mode); //int copy_tempfile(int fdin, char *name, char **tempname); //void delete_tempfile(int fdin, int fdout, char **tempname); //void replace_tempfile(int fdin, int fdout, char **tempname); //void crc_init(unsigned int *crc_table, int little_endian); //void base64_init(char *p); //int yesno(int def); //int fyesno(FILE *fp, int def); int qstrcmp(const void *a, const void *b); //void tb_create_uuid(char *uuid); //char *tb_show_uuid(char *uuid); //char *next_printf(char *s, char **start); //struct passwd *bufgetpwuid(uid_t uid); //struct group *bufgetgrgid(gid_t gid); //int readlinkat0(int dirfd, char *path, char *buf, int len); //int readlink0(char *path, char *buf, int len); //int regexec0(regex_t *preg, char *string, long len, int nmatch, // regmatch_t pmatch[], int eflags); //char *getusername(uid_t uid); //char *getgroupname(gid_t gid); //void do_lines(int fd, char delim, void (*call)(char **pline, long len)); //long long millitime(void); //char *format_iso_time(char *buf, size_t len, struct timespec *ts); //void reset_env(struct passwd *p, int clear); //void loggit(int priority, char *format, ...); //unsigned tar_cksum(void *data); //int is_tar_header(void *pkt); //char *elf_arch_name(int type); // pending.c char *get_line(int fd); // dirtree.c // Values returnable from callback function (bitfield, or them together) // Default with no callback is 0 // Add this node to the tree #define TB_DIRTREE_SAVE 1 // Recurse into children #define TB_DIRTREE_RECURSE 2 // Call again after handling all children of this directory // (Ignored for non-directories, sets linklen = -1 before second call.) #define TB_DIRTREE_COMEAGAIN 4 // Follow symlinks to directories #define TB_DIRTREE_SYMFOLLOW 8 // Don't warn about failure to stat #define TB_DIRTREE_SHUTUP 16 // Breadth first traversal, conserves filehandles at the expense of memory #define TB_DIRTREE_BREADTH 32 // skip non-numeric entries #define TB_DIRTREE_PROC 64 // Return files we can't stat #define TB_DIRTREE_STATLESS 128 // Don't look at any more files in this directory. #define TB_DIRTREE_ABORT 256 #define TB_DIRTREE_ABORTVAL ((struct tb_dirtree *)1) struct tb_dirtree { struct tb_dirtree *next, *parent, *child; long extra; // place for user to store their stuff (can be pointer) char *symlink; int dirfd; struct stat st; char again; char name[]; }; int tb_isdotdot(char *name); struct tb_dirtree *tb_dirtree_add_node(struct tb_dirtree *p, char *name, int flags); char *tb_dirtree_path(struct tb_dirtree *node, int *plen); int tb_dirtree_notdotdot(struct tb_dirtree *catch); int tb_dirtree_parentfd(struct tb_dirtree *node); int tb_dirtree_recurse(struct tb_dirtree *node, int (*callback)(struct tb_dirtree *node), int dirfd, int symfollow); // Rob forget to do this, but at least he didn't declare it static. struct tb_dirtree *tb_dirtree_handle_callback(struct tb_dirtree *new, int (*callback)(struct tb_dirtree *node)); void tb_dirtree_free(struct tb_dirtree *new);