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));
--- 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 <stdlib.h>
 #include <string.h>
 #include <strings.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
 #include "lib/lib.h"