diff --git a/bin/cat/cat.1 b/bin/cat/cat.1 index 861d62e..6a3a5d6 100644 --- a/bin/cat/cat.1 +++ b/bin/cat/cat.1 @@ -57,18 +57,6 @@ is a single dash or absent, .Nm reads from the standard input. -If -.Ar file -is a -.Ux -domain socket, -.Nm -connects to it and then reads it until -.Dv EOF . -This complements the -.Ux -domain binding capability available in -.Xr inetd 8 . .Pp The options are as follows: .Bl -tag -width indent diff --git a/bin/cat/cat.c b/bin/cat/cat.c index a2aff71..c58fb0c 100644 --- a/bin/cat/cat.c +++ b/bin/cat/cat.c @@ -37,17 +37,11 @@ #include #include -#ifndef NO_UDOM_SUPPORT -#include -#include -#include -#endif #include #include #include #include -#include #include #include #include @@ -56,13 +50,10 @@ static int bflag, eflag, nflag, sflag, tflag, vflag, rval; static const char *filename; -static void scanfiles(char **, int); -static void cook_cat(FILE *); -static void raw_cat(int); - -#ifndef NO_UDOM_SUPPORT -static int udom_open(const char *, int); -#endif +void cook_args(char *argv[]); +void cook_buf(FILE *); +void raw_args(char *argv[]); +void raw_cat(int); static void usage(void) @@ -109,63 +100,42 @@ main(int argc, char **argv) argv += optind; if (bflag || eflag || nflag || sflag || tflag || vflag) - scanfiles(argv, 1); + cook_args(argv); else - scanfiles(argv, 0); + raw_args(argv); if (fclose(stdout)) err(1, "stdout"); exit(rval); /* NOTREACHED */ } -static void -scanfiles(char **argv, int cooked) +void +cook_args(char **argv) { - char *path; FILE *fp; - int fd; - int i; - i = 0; - - while ((path = argv[i]) != NULL || i == 0) { - if (path == NULL || strcmp(path, "-") == 0) { - filename = "stdin"; - fd = STDIN_FILENO; - } else { - filename = path; - fd = open(path, O_RDONLY); -#ifndef NO_UDOM_SUPPORT - if (fd < 0 && errno == EOPNOTSUPP) - fd = udom_open(path, O_RDONLY); -#endif - } - if (fd < 0) { - warn("%s", path); - rval = 1; - } else if (cooked) { - if (fd == STDIN_FILENO) { - cook_cat(stdin); - } else { - fp = fdopen(fd, "r"); - if (fp == NULL) - err(1, "%s", path); - cook_cat(fp); - fclose(fp); + fp = stdin; + filename = "stdin"; + do { + if (*argv) { + if (!strcmp(*argv, "-")) + fp = stdin; + else if ((fp = fopen(*argv, "r")) == NULL) { + warn("%s", *argv); + rval = 1; + ++argv; + continue; } - } else { - raw_cat(fd); - if (fd != STDIN_FILENO) - close(fd); + filename = *argv++; } - if (path == NULL) - break; - ++i; - } + cook_buf(fp); + if (fp != stdin) + (void)fclose(fp); + } while (*argv); } -static void -cook_cat(FILE *fp) +void +cook_buf(FILE *fp) { int ch, gobble, line, prev; @@ -231,7 +201,32 @@ cook_cat(FILE *fp) err(1, "stdout"); } -static void +void +raw_args(char **argv) +{ + int fd; + + fd = fileno(stdin); + filename = "stdin"; + do { + if (*argv) { + if (!strcmp(*argv, "-")) + fd = fileno(stdin); + else if ((fd = open(*argv, O_RDONLY, 0)) < 0) { + warn("%s", *argv); + rval = 1; + ++argv; + continue; + } + filename = *argv++; + } + raw_cat(fd); + if (fd != fileno(stdin)) + (void)close(fd); + } while (*argv); +}; + +void raw_cat(int rfd) { int off; @@ -276,55 +271,3 @@ raw_cat(int rfd) rval = 1; } } - -#ifndef NO_UDOM_SUPPORT - -static int -udom_open(const char *path, int flags) -{ - struct sockaddr_un sou; - int fd; - unsigned int len; - - bzero(&sou, sizeof(sou)); - - /* - * Construct the unix domain socket address and attempt to connect - */ - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd >= 0) { - sou.sun_family = AF_UNIX; - if ((len = strlcpy(sou.sun_path, path, - sizeof(sou.sun_path))) >= sizeof(sou.sun_path)) { - errno = ENAMETOOLONG; - return (-1); - } - len = offsetof(struct sockaddr_un, sun_path[len+1]); - - if (connect(fd, (void *)&sou, len) < 0) { - close(fd); - fd = -1; - } - } - - /* - * handle the open flags by shutting down appropriate directions - */ - if (fd >= 0) { - switch (flags & O_ACCMODE) { - case O_RDONLY: - if (shutdown(fd, SHUT_WR) == -1) - warn(NULL); - break; - case O_WRONLY: - if (shutdown(fd, SHUT_RD) == -1) - warn(NULL); - break; - default: - break; - } - } - return(fd); -} - -#endif