changeset 49:bb4c38853a7d

xopen() wants 2 arguments unless you're creating a file, in which case you need 3. Doing varargs for this doesn't really appeal to me (bugs in waiting) so I made an xcreate() that takes 3 args, and had xopen() call it with 0 for the third argument. That way, if we feed O_CREAT to xopen() the permission 000 result should be easy to spot.
author Rob Landley <rob@landley.net>
date Sun, 07 Jan 2007 22:51:12 -0500
parents 691bbc9f7b1b
children 63c168b65fa6
files lib/args.c lib/functions.c lib/lib.h toys/catv.c
diffstat 4 files changed, 43 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lib/args.c	Sun Jan 07 03:48:26 2007 -0500
+++ b/lib/args.c	Sun Jan 07 22:51:12 2007 -0500
@@ -289,3 +289,35 @@
 	if (optarg<minargs) error_exit("Need %d arguments", minargs);
 	if (optarg>maxargs) error_exit("Max %d arguments", maxargs);
 }
+
+// Loop through files listed on the command line
+
+static int dofileargs(char ***files, int fd, int iswrite)
+{
+	char *filename = *((*files)++);
+	static int flags[] = {O_RDONLY, O_CREAT|O_TRUNC, O_RDWR};
+
+	if (fd != -1) close(fd);
+
+	for (;;) {
+
+		// Are there no more files?
+		if (!*filename) 
+			return (fd == -1) ? iswrite : -1;
+
+		// A filename of "-" means stdin.
+		if (*filename == '-' && !filename[1]) return 0;
+
+		fd = xcreate(filename, flags[iswrite], 0777);
+	}
+}
+
+int readfileargs(char ***files, int fd)
+{
+	return dofileargs(files, fd, 0);
+}
+
+int writefileargs(char ***files, int fd)
+{
+	return dofileargs(files, fd, 1);
+}
--- a/lib/functions.c	Sun Jan 07 03:48:26 2007 -0500
+++ b/lib/functions.c	Sun Jan 07 22:51:12 2007 -0500
@@ -141,13 +141,19 @@
 }
 
 // Die unless we can open/create a file, returning file descriptor.
-int xopen(char *path, int flags, int mode)
+int xcreate(char *path, int flags, int mode)
 {
 	int fd = open(path, flags, mode);
 	if (fd == -1) error_exit("No file %s\n", path);
 	return fd;
 }
 
+// Die unless we can open a file, returning file descriptor.
+int xopen(char *path, int flags)
+{
+	return xcreate(path, flags, 0);
+}
+
 // Die unless we can open/create a file, returning FILE *.
 FILE *xfopen(char *path, char *mode)
 {
--- a/lib/lib.h	Sun Jan 07 03:48:26 2007 -0500
+++ b/lib/lib.h	Sun Jan 07 22:51:12 2007 -0500
@@ -38,7 +38,8 @@
 void *xstrdup(char *s);
 char *xmsprintf(char *format, ...);
 void xexec(char **argv);
-int xopen(char *path, int flags, int mode);
+int xcreate(char *path, int flags, int mode);
+int xopen(char *path, int flags);
 FILE *xfopen(char *path, char *mode);
 ssize_t reread(int fd, void *buf, size_t count);
 ssize_t readall(int fd, void *buf, size_t count);
@@ -63,3 +64,4 @@
 
 struct mtab_list *getmountlist(int die);
 
+char *bunzipStream(int src_fd, int dst_fd);
--- a/toys/catv.c	Sun Jan 07 03:48:26 2007 -0500
+++ b/toys/catv.c	Sun Jan 07 22:51:12 2007 -0500
@@ -23,7 +23,7 @@
 		// Read from stdin if there's nothing else to do.
 
 		fd = 0;
-		if (*argv && 0>(fd = xopen(*argv, O_RDONLY, 0))) retval = EXIT_FAILURE;
+		if (*argv && 0>(fd = xopen(*argv, O_RDONLY))) retval = EXIT_FAILURE;
 		else for(;;) {
 			int i, res;