Mercurial > hg > toybox
changeset 4:732b055e17f7
Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
author | landley@driftwood |
---|---|
date | Wed, 25 Oct 2006 18:38:37 -0400 |
parents | 266a462ed18c |
children | 4372fb5eb200 |
files | lib/functions.c lib/lib.h toys.h |
diffstat | 3 files changed, 62 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/functions.c Wed Oct 18 18:38:16 2006 -0400 +++ b/lib/functions.c Wed Oct 25 18:38:37 2006 -0400 @@ -62,6 +62,29 @@ return ret; } +// Die unless we can allocate enough space to sprintf() into. +char *xmsprintf(char *format, ...) +{ + va_list va; + int len; + char *ret; + + // How long is it? + + va_start(va, format); + len = vsnprintf(0, 0, format, va); + len++; + va_end(va); + + // Allocate and do the sprintf() + ret = xmalloc(len); + va_start(va, format); + vsnprintf(ret, len, format, va); + va_end(va); + + return ret; +} + // Die unless we can exec argv[] (or run builtin command). Note that anything // with a path isn't a builtin, so /bin/sh won't match the builtin sh. void *xexec(char **argv) @@ -86,3 +109,38 @@ if (!f) error_exit("No file %s\n", path); return f; } + +// int xread(int fd, char *buf, int len) // Die if can't fill buffer +// int readall(int fd, char *buf, int len) // Keep reading until full or EOF +// int toy_read(int fd, char *buf, int len) // retry if interrupted + +char *xgetcwd(void) +{ + char *buf = getcwd(NULL, 0); + if (!buf) error_exit("xgetcwd"); +} + +// Find this file in a colon-separated path. + +char *find_in_path(char *path, char *filename) +{ + char *next, *res = NULL, *cwd = xgetcwd(); + + while (next = index(path,':')) { + int len = next-path; + + if (len==1) res = xmsprintf("%s/%s", cwd, filename); + else res = xmsprintf("%*s/%s",len-1,path,filename); + // Is there a file here we can execute? + if (!access(res, X_OK)) { + struct stat st; + // Confirm it's not a directory. + if (!stat(res, &st) && S_ISREG(st.st_mode)) break; + } + free(res); + res = NULL; + } + free(cwd); + + return res; +}
--- a/lib/lib.h Wed Oct 18 18:38:16 2006 -0400 +++ b/lib/lib.h Wed Oct 25 18:38:37 2006 -0400 @@ -7,9 +7,12 @@ void *xzalloc(size_t size); void xrealloc(void **ptr, size_t size); void *xstrndup(char *s, size_t n); +char *xmsprintf(char *format, ...); void *xexec(char **argv); int xopen(char *path, int flags, int mode); FILE *xfopen(char *path, char *mode); +char *xgetcwd(void); +char *find_in_path(char *path, char *filename); // llist.c void llist_free(void *list, void (*freeit)(void *data));