blob: 54876b6a4f8d7e0b02fe2af2cdb4f630911cf21c [file] [log] [blame]
landley09ea7ac2006-10-30 01:38:00 -05001/* lib.h - header file for lib directory
2 *
3 * Copyright 2006 Rob Landley <rob@landley.net>
4 */
landley4f344e32006-10-05 16:18:03 -04005
Rob Landley0a04b3e2006-11-03 00:05:52 -05006// llist.c
Rob Landley0a04b3e2006-11-03 00:05:52 -05007
Rob Landleyeb7ea222012-04-14 22:30:41 -05008// All these list types can be handled by the same code because first element
Rob Landleye5f3a0b2013-03-17 17:57:28 -05009// is always next pointer, so next = (mytype *)&struct. (The payloads are
10// named differently to catch using the wrong type early.)
Rob Landleyeb7ea222012-04-14 22:30:41 -050011
Rob Landley0a04b3e2006-11-03 00:05:52 -050012struct string_list {
Rob Landley7aa651a2012-11-13 17:14:08 -060013 struct string_list *next;
14 char str[0];
Rob Landley0a04b3e2006-11-03 00:05:52 -050015};
16
Rob Landley8324b892006-11-19 02:49:22 -050017struct arg_list {
Rob Landley7aa651a2012-11-13 17:14:08 -060018 struct arg_list *next;
19 char *arg;
Rob Landley8324b892006-11-19 02:49:22 -050020};
21
Rob Landleybc078652007-12-15 21:47:25 -060022struct double_list {
Rob Landley7aa651a2012-11-13 17:14:08 -060023 struct double_list *next, *prev;
24 char *data;
Rob Landleybc078652007-12-15 21:47:25 -060025};
26
Rob Landleye604d532014-05-21 06:57:43 -050027void llist_free_arg(void *node);
28void llist_free_double(void *node);
29void llist_traverse(void *list, void (*using)(void *node));
Rob Landley5f57bcc2013-09-09 04:26:03 -050030void *llist_pop(void *list); // actually void **list
31void *dlist_pop(void *list); // actually struct double_list **list
Rob Landley2c482472012-03-12 00:25:40 -050032void dlist_add_nomalloc(struct double_list **list, struct double_list *new);
Rob Landleybdf037f2008-10-23 16:44:30 -050033struct double_list *dlist_add(struct double_list **list, char *data);
Rob Landleydc640252014-05-29 05:22:02 -050034void *dlist_terminate(void *list);
Rob Landley6ef04ef2008-01-20 17:34:53 -060035
Rob Landley103b7e02007-10-04 02:04:10 -050036// args.c
37void get_optflags(void);
38
39// dirtree.c
Rob Landleyeb7ea222012-04-14 22:30:41 -050040
41// Values returnable from callback function (bitfield, or them together)
42// Default with no callback is 0
43
Rob Landley8c4ae8a2012-05-20 15:00:19 -050044// Add this node to the tree
45#define DIRTREE_SAVE 1
46// Recurse into children
47#define DIRTREE_RECURSE 2
48// Call again after handling all children of this directory
49// (Ignored for non-directories, sets linklen = -1 before second call.)
Rob Landleyeb7ea222012-04-14 22:30:41 -050050#define DIRTREE_COMEAGAIN 4
51// Follow symlinks to directories
52#define DIRTREE_SYMFOLLOW 8
Rob Landleyaab91642015-05-09 18:11:22 -050053// Don't warn about failure to stat
54#define DIRTREE_SHUTUP 16
Rob Landley8c4ae8a2012-05-20 15:00:19 -050055// Don't look at any more files in this directory.
56#define DIRTREE_ABORT 256
Rob Landleyeb7ea222012-04-14 22:30:41 -050057
58#define DIRTREE_ABORTVAL ((struct dirtree *)1)
59
Rob Landleyd25f7e42007-02-03 14:11:26 -050060struct dirtree {
Rob Landley7aa651a2012-11-13 17:14:08 -060061 struct dirtree *next, *parent, *child;
62 long extra; // place for user to store their stuff (can be pointer)
63 struct stat st;
64 char *symlink;
Rob Landleyfec3fd12014-07-26 13:30:40 -050065 int data; // dirfd for directory, linklen for symlink
66 char again;
Rob Landley7aa651a2012-11-13 17:14:08 -060067 char name[];
Rob Landleyd25f7e42007-02-03 14:11:26 -050068};
69
Rob Landleyaab91642015-05-09 18:11:22 -050070struct dirtree *dirtree_start(char *name, int symfollow);
71struct dirtree *dirtree_add_node(struct dirtree *p, char *name, int flags);
Rob Landleyeb7ea222012-04-14 22:30:41 -050072char *dirtree_path(struct dirtree *node, int *plen);
Rob Landley8c4ae8a2012-05-20 15:00:19 -050073int dirtree_notdotdot(struct dirtree *catch);
Rob Landley6ec21782012-06-16 15:16:08 -050074int dirtree_parentfd(struct dirtree *node);
Rob Landley090c5c62012-12-31 14:38:13 -060075struct dirtree *dirtree_handle_callback(struct dirtree *new,
Rob Landley7aa651a2012-11-13 17:14:08 -060076 int (*callback)(struct dirtree *node));
Rob Landleyfec3fd12014-07-26 13:30:40 -050077int dirtree_recurse(struct dirtree *node, int (*callback)(struct dirtree *node),
78 int symfollow);
Rob Landleyeb7ea222012-04-14 22:30:41 -050079struct dirtree *dirtree_read(char *path, int (*callback)(struct dirtree *node));
Rob Landley8324b892006-11-19 02:49:22 -050080
Rob Landley36ffc5a2013-04-14 21:43:22 -050081// help.c
82
83void show_help(void);
84
Rob Landley72756672013-07-17 17:22:46 -050085// xwrap.c
Rob Landleybe93c912013-04-20 23:33:48 -050086void xstrncpy(char *dest, char *src, size_t size);
Rob Landley2fb85a32014-12-04 21:41:12 -060087void xstrncat(char *dest, char *src, size_t size);
Rob Landley55830302013-06-16 19:59:51 -050088void xexit(void) noreturn;
landley4f344e32006-10-05 16:18:03 -040089void *xmalloc(size_t size);
landleycd9dfc32006-10-18 18:38:16 -040090void *xzalloc(size_t size);
Rob Landley0c93f6c2007-04-29 19:55:21 -040091void *xrealloc(void *ptr, size_t size);
Rob Landley1e01cd12010-01-05 10:48:32 -060092char *xstrndup(char *s, size_t n);
93char *xstrdup(char *s);
Elliott Hughes1be99e62015-03-01 16:16:50 -060094char *xmprintf(char *format, ...) printf_format;
95void xprintf(char *format, ...) printf_format;
Rob Landley5084fea2007-06-18 00:14:03 -040096void xputs(char *s);
Rob Landley24d1d452007-01-20 18:04:20 -050097void xputc(char c);
98void xflush(void);
landley09ea7ac2006-10-30 01:38:00 -050099void xexec(char **argv);
Rob Landley360d57f2014-09-14 12:29:44 -0500100pid_t xpopen_both(char **argv, int *pipes);
101int xpclose_both(pid_t pid, int *pipes);
102pid_t xpopen(char **argv, int *pipe, int stdout);
103pid_t xpclose(pid_t pid, int pipe);
104int xrun(char **argv);
105int xpspawn(char **argv, int*pipes);
Rob Landleyd3e9d642007-01-08 03:25:47 -0500106void xaccess(char *path, int flags);
Rob Landleye745d8e2007-12-20 06:30:19 -0600107void xunlink(char *path);
Rob Landley1322beb2007-01-07 22:51:12 -0500108int xcreate(char *path, int flags, int mode);
109int xopen(char *path, int flags);
Rob Landleybc078652007-12-15 21:47:25 -0600110void xclose(int fd);
Rob Landleyeb7ea222012-04-14 22:30:41 -0500111int xdup(int fd);
Rob Landley1aa75112013-08-07 12:19:51 -0500112FILE *xfdopen(int fd, char *mode);
landley4f344e32006-10-05 16:18:03 -0400113FILE *xfopen(char *path, char *mode);
Rob Landley90163772007-01-18 21:54:08 -0500114size_t xread(int fd, void *buf, size_t len);
115void xreadall(int fd, void *buf, size_t len);
116void xwrite(int fd, void *buf, size_t len);
Rob Landley52476712009-01-18 16:19:25 -0600117off_t xlseek(int fd, off_t offset, int whence);
Rob Landleydc373172013-12-27 18:45:01 -0600118char *xreadfile(char *name, char *buf, off_t len);
Rob Landleyf0153442013-04-26 02:41:05 -0500119int xioctl(int fd, int request, void *data);
landley00f87f12006-10-25 18:38:37 -0400120char *xgetcwd(void);
Rob Landleyd25f7e42007-02-03 14:11:26 -0500121void xstat(char *path, struct stat *st);
Rob Landleyfe91e682012-11-22 21:18:09 -0600122char *xabspath(char *path, int exact);
Rob Landley988abb32008-05-12 00:52:27 -0500123void xchdir(char *path);
Rob Landleyafba5b82013-12-23 06:49:38 -0600124void xchroot(char *path);
Rob Landley9e44a582013-11-28 20:18:04 -0600125struct passwd *xgetpwuid(uid_t uid);
126struct group *xgetgrgid(gid_t gid);
Rob Landley5ec4ab32013-11-28 21:06:15 -0600127struct passwd *xgetpwnam(char *name);
Rob Landley60c35c42014-08-03 15:50:10 -0500128struct group *xgetgrnam(char *name);
Rob Landleyb8140d12015-03-12 11:11:08 -0500129struct passwd *xgetpwnamid(char *user);
130struct group *xgetgrnamid(char *group);
Rob Landleyafba5b82013-12-23 06:49:38 -0600131void xsetuser(struct passwd *pwd);
Rob Landleyd3904932013-07-16 00:04:56 -0500132char *xreadlink(char *name);
Rob Landley72756672013-07-17 17:22:46 -0500133long xparsetime(char *arg, long units, long *fraction);
Felix Jandadccfb2a2013-08-26 21:55:33 +0200134void xpidfile(char *name);
Rob Landley5b405822014-03-29 18:11:00 -0500135void xregcomp(regex_t *preg, char *rexec, int cflags);
Rob Landleyc277f342015-02-09 16:34:24 -0600136char *xtzset(char *new);
Rob Landleye6abb612015-03-09 14:52:32 -0500137void xsignal(int signal, void *handler);
Rob Landleyd3904932013-07-16 00:04:56 -0500138
139// lib.c
140void verror_msg(char *msg, int err, va_list va);
Elliott Hughes1be99e62015-03-01 16:16:50 -0600141void error_msg(char *msg, ...) printf_format;
142void perror_msg(char *msg, ...) printf_format;
143void error_exit(char *msg, ...) printf_format noreturn;
144void perror_exit(char *msg, ...) printf_format noreturn;
Rob Landleyd3904932013-07-16 00:04:56 -0500145ssize_t readall(int fd, void *buf, size_t len);
146ssize_t writeall(int fd, void *buf, size_t len);
147off_t lskip(int fd, off_t offset);
Rob Landleyca1b60e2014-03-11 20:44:55 -0500148int mkpathat(int atfd, char *dir, mode_t lastmode, int flags);
Rob Landleyd3904932013-07-16 00:04:56 -0500149struct string_list **splitpath(char *path, struct string_list **list);
Rob Landleye10483f2015-04-03 11:49:31 -0500150char *readfileat(int dirfd, char *name, char *buf, off_t len);
Rob Landley8fdcfdb2013-09-03 17:56:28 -0500151char *readfile(char *name, char *buf, off_t len);
Rob Landleyd3904932013-07-16 00:04:56 -0500152void msleep(long miliseconds);
Rob Landley546b2932014-07-21 19:56:53 -0500153int64_t peek_le(void *ptr, unsigned size);
154int64_t peek_be(void *ptr, unsigned size);
155int64_t peek(void *ptr, unsigned size);
Rob Landleyd3904932013-07-16 00:04:56 -0500156void poke(void *ptr, uint64_t val, int size);
Rob Landley0a04b3e2006-11-03 00:05:52 -0500157struct string_list *find_in_path(char *path, char *filename);
Rob Landley86c747a2015-01-01 16:28:51 -0600158long estrtol(char *str, char **end, int base);
159long xstrtol(char *str, char **end, int base);
Rob Landleyf5757162007-02-16 21:08:22 -0500160long atolx(char *c);
Rob Landleyb5e74162013-11-28 21:11:34 -0600161long atolx_range(char *numstr, long low, long high);
Rob Landley2037b832012-07-15 16:56:20 -0500162int stridx(char *haystack, char needle);
Rob Landley5fcc7152014-10-18 17:14:12 -0500163int unescape(char c);
Rob Landley8115fc12014-06-09 07:12:49 -0500164int strstart(char **a, char *b);
Rob Landleye2580db2007-01-23 13:20:38 -0500165off_t fdlength(int fd);
Rob Landleyad63f4b2011-12-12 15:19:52 -0600166void loopfiles_rw(char **argv, int flags, int permissions, int failok,
Rob Landley7aa651a2012-11-13 17:14:08 -0600167 void (*function)(int fd, char *name));
Rob Landley7634b552007-11-29 17:49:50 -0600168void loopfiles(char **argv, void (*function)(int fd, char *name));
Rob Landley3fc4e0f2008-04-13 00:29:00 -0500169char *get_rawline(int fd, long *plen, char end);
Rob Landleybc078652007-12-15 21:47:25 -0600170char *get_line(int fd);
171void xsendfile(int in, int out);
Rob Landley67a069d2012-06-03 00:32:12 -0500172int wfchmodat(int rc, char *name, mode_t mode);
Rob Landley42ecbab2007-12-18 02:02:21 -0600173int copy_tempfile(int fdin, char *name, char **tempname);
174void delete_tempfile(int fdin, int fdout, char **tempname);
175void replace_tempfile(int fdin, int fdout, char **tempname);
Rob Landleyb15b8fa2009-01-05 01:05:43 -0600176void crc_init(unsigned int *crc_table, int little_endian);
Rob Landley5bec5ba2014-12-13 11:59:37 -0600177void base64_init(char *p);
Rob Landleyf793d532012-02-27 21:56:49 -0600178int yesno(char *prompt, int def);
Rob Landley48c172b2014-05-06 06:31:28 -0500179int human_readable(char *buf, unsigned long long num);
Rob Landley5b493dc2015-04-19 21:50:51 -0500180int qstrcmp(const void *a, const void *b);
Rob Landley2fd86242015-04-27 11:13:19 -0500181int xpoll(struct pollfd *fds, int nfds, int timeout);
Rob Landley72cd2e02015-05-08 20:20:29 -0500182
183// interestingtimes.c
Rob Landley5b2644c2015-05-14 13:43:01 -0500184int xgettty(void);
Rob Landley72cd2e02015-05-08 20:20:29 -0500185int terminal_size(unsigned *xx, unsigned *yy);
186int set_terminal(int fd, int raw, struct termios *old);
Rob Landley2fd86242015-04-27 11:13:19 -0500187int scan_key(char *scratch, char **seqs, int block);
landley4f344e32006-10-05 16:18:03 -0400188
Rob Landleyf0153442013-04-26 02:41:05 -0500189// net.c
190int xsocket(int domain, int type, int protocol);
Rob Landley5bec5ba2014-12-13 11:59:37 -0600191void xsetsockopt(int fd, int level, int opt, void *val, socklen_t len);
Rob Landleyf0153442013-04-26 02:41:05 -0500192
Rob Landley6d15f0d2014-06-25 22:54:59 -0500193// password.c
194int get_salt(char *salt, char * algo);
195
landleycd9dfc32006-10-18 18:38:16 -0400196// getmountlist.c
landley4f344e32006-10-05 16:18:03 -0400197struct mtab_list {
Rob Landleydc640252014-05-29 05:22:02 -0500198 struct mtab_list *next, *prev;
Rob Landley7aa651a2012-11-13 17:14:08 -0600199 struct stat stat;
200 struct statvfs statvfs;
201 char *dir;
202 char *device;
Rob Landley55e9f352014-05-27 07:56:51 -0500203 char *opts;
Rob Landley7aa651a2012-11-13 17:14:08 -0600204 char type[0];
landley4f344e32006-10-05 16:18:03 -0400205};
206
Rob Landleye996bdd2014-08-24 23:46:23 -0500207void comma_collate(char **old, char *new);
208char *comma_iterate(char **list, int *len);
209int comma_scan(char *optlist, char *opt, int clean);
210int comma_scanall(char *optlist, char *scanlist);
211int mountlist_istype(struct mtab_list *ml, char *typelist);
Rob Landley42adb7a2013-08-30 17:34:24 -0500212struct mtab_list *xgetmountlist(char *path);
landley4f344e32006-10-05 16:18:03 -0400213
Rob Landley2dd50ad2012-02-26 13:48:00 -0600214// signal
215
Rob Landley1bc52242014-05-21 07:24:16 -0500216void generic_signal(int signal);
Rob Landleyc52db602012-07-30 01:01:33 -0500217void sigatexit(void *handler);
Rob Landley2dd50ad2012-02-26 13:48:00 -0600218int sig_to_num(char *pidstr);
219char *num_to_sig(int sig);
Daniel Walter05744b32012-03-19 19:57:56 -0500220
221mode_t string_to_mode(char *mode_str, mode_t base);
Rob Landley5a26a862013-06-02 00:24:24 -0500222void mode_to_string(mode_t mode, char *buf);
Rob Landleydb1009d2013-12-19 09:32:30 -0600223void names_to_pid(char **names, int (*callback)(pid_t pid, char *name));
Rob Landley2c917f52012-07-17 08:54:47 -0500224
Rob Landley5b405822014-03-29 18:11:00 -0500225// Functions in need of further review/cleanup
Rob Landley34b91a92013-11-10 18:20:16 -0600226#include "lib/pending.h"