Couple related things:

- Use err(3) everywhere.

  For many of these errors we are not currently printing the errno
  string.  Is there any reason not to do so?  The errno string is
  useful.

- Set ifile/ofile to "stdin"/"stdout" if the user passes in
  "-" to make the err(3) message a little more obvious.

- Add a usage() function.

ok?

Index: midicat.c
===================================================================
RCS file: /cvs/src/usr.bin/midicat/midicat.c,v
retrieving revision 1.4
diff -u -p -r1.4 midicat.c
--- midicat.c   30 Nov 2022 14:56:45 -0000      1.4
+++ midicat.c   30 Nov 2022 15:13:01 -0000
@@ -22,8 +22,7 @@
 #include <unistd.h>
 #include <string.h>
 
-char usagestr[] = "usage: midicat [-d] [-i in-file] [-o out-file] "
-       "[-q in-port] [-q out-port]\n";
+void usage(void);
 
 int
 main(int argc, char **argv)
@@ -50,10 +49,8 @@ main(int argc, char **argv)
                                port0 = optarg;
                        else if (port1 == NULL)
                                port1 = optarg;
-                       else {
-                               fputs("too many -q options\n", stderr);
-                               return 1;
-                       }
+                       else
+                               errx(1, "too many -q options");
                        break;
                case 'i':
                        ifile = optarg;
@@ -62,32 +59,25 @@ main(int argc, char **argv)
                        ofile = optarg;
                        break;
                default:
-                       goto bad_usage;
+                       usage();
                }
        }
        argc -= optind;
        argv += optind;
-       if (argc != 0) {
-       bad_usage:
-               fputs(usagestr, stderr);
-               return 1;
-       }
+       if (argc != 0)
+               usage();
 
        /* we don't support more than one data flow */
-       if (ifile != NULL && ofile != NULL) {
-               fputs("-i and -o are exclusive\n", stderr);
-               return 1;
-       }
+       if (ifile != NULL && ofile != NULL)
+               errx(1, "-i and -o are exclusive");
 
        /* second port makes sense only for port-to-port transfers */
-       if (port1 != NULL && !(ifile == NULL && ofile == NULL)) {
-               fputs("too many -q options\n", stderr);
-               return 1;
-       }
+       if (port1 != NULL && !(ifile == NULL && ofile == NULL))
+               errx(1, "too many -q options");
 
        /* if there're neither files nor ports, then we've nothing to do */
        if (port0 == NULL && ifile == NULL && ofile == NULL)
-               goto bad_usage;
+               usage();
 
        /* if no port specified, use default one */
        if (port0 == NULL)
@@ -95,24 +85,22 @@ main(int argc, char **argv)
 
        /* open input or output file (if any) */
        if (ifile) {
-               if (strcmp(ifile, "-") == 0)
+               if (strcmp(ifile, "-") == 0) {
+                       ifile = "stdin";
                        ifd = STDIN_FILENO;
-               else {
+               } else {
                        ifd = open(ifile, O_RDONLY);
-                       if (ifd == -1) {
-                               perror(ifile);
-                               return 1;
-                       }
+                       if (ifd == -1)
+                               err(1, "%s", ifile);
                }
        } else if (ofile) {
-               if (strcmp(ofile, "-") == 0)
+               if (strcmp(ofile, "-") == 0) {
+                       ofile = "stdout";
                        ofd = STDOUT_FILENO;
-               else {
+               } else {
                        ofd = open(ofile, O_WRONLY | O_CREAT | O_TRUNC, 0666);
-                       if (ofd == -1) {
-                               perror(ofile);
-                               return 1;
-                       }
+                       if (ofd == -1)
+                               err(1, "%s", ofile);
                }
        }
 
@@ -126,20 +114,16 @@ main(int argc, char **argv)
        else
                mode = MIO_IN;
        ih = mio_open(port0, mode, 0);
-       if (ih == NULL) {
-               fprintf(stderr, "%s: couldn't open port\n", port0);
-               return 1;
-       }
+       if (ih == NULL)
+               err(1, "%s: couldn't open port", port0);
 
        /* open second port, output only */
        if (port1 == NULL)
                oh = ih;
        else {
                oh = mio_open(port1, MIO_OUT, 0);
-               if (oh == NULL) {
-                       fprintf(stderr, "%s: couldn't open port\n", port1);
-                       exit(1);
-               }
+               if (oh == NULL)
+                       err(1, "%s: couldn't open port", port1);
        }
 
        if (pledge("stdio", NULL) == -1)
@@ -152,26 +136,26 @@ main(int argc, char **argv)
                        if (len == 0)
                                break;
                        if (len == -1) {
-                               perror("stdin");
+                               warn("%s", ifile);
                                break;
                        }
                } else {
                        len = mio_read(ih, buf, sizeof(buf));
                        if (len == 0) {
-                               fprintf(stderr, "%s: disconnected\n", port0);
+                               warn("%s: disconnected", port0);
                                break;
                        }
                }
                if (ofile != NULL) {
                        n = write(ofd, buf, len);
                        if (n != len) {
-                               fprintf(stderr, "%s: short write\n", ofile);
+                               warn("%s: short write", ofile);
                                break;
                        }
                } else {
                        n = mio_write(oh, buf, len);
                        if (n != len) {
-                               fprintf(stderr, "%s: disconnected\n", port1);
+                               warn("%s: disconnected", port1);
                                break;
                        }
                }
@@ -194,4 +178,12 @@ main(int argc, char **argv)
        if (ofile)
                close(ofd);
        return 0;
+}
+
+void
+usage(void)
+{
+       fprintf(stderr, "usage: midicat [-d] [-i in-file] [-o out-file] "
+           "[-q in-port] [-q out-port]\n");
+       exit(1);
 }

Reply via email to