# HG changeset patch # User landley@driftwood # Date 1161815917 14400 # Node ID 732b055e17f7f34f5fef19da0cffbb19f1731821 # Parent 266a462ed18c775a671f1d7384c059d1c10d0168 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path(). diff -r 266a462ed18c -r 732b055e17f7 lib/functions.c --- 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; +} diff -r 266a462ed18c -r 732b055e17f7 lib/lib.h --- 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)); diff -r 266a462ed18c -r 732b055e17f7 toys.h --- a/toys.h Wed Oct 18 18:38:16 2006 -0400 +++ b/toys.h Wed Oct 25 18:38:37 2006 -0400 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "lib/lib.h"