Mercurial > hg > toybox
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;