$OpenBSD: patch-mpg321_c,v 1.6 2008/10/30 14:46:59 naddy Exp $
--- mpg321.c.orig	Sun Mar 24 06:49:20 2002
+++ mpg321.c	Thu Oct 30 14:48:54 2008
@@ -75,9 +75,15 @@ void mpg321_error(char *file)
 
 void usage(char *argv0)
 {
+    ao_info **devices;
+    int i, driver_count;
+
+    devices = ao_driver_info_list(&driver_count);
+
     mpg123_boilerplate();
     fprintf(stderr,
-        "\nUsage: %s [options] file(s) | URL(s) | -\n\n"
+        "\nUsage: %s [options] file(s) | URL(s) | -\n\n", argv0);
+    fprintf(stderr,
         "Options supported:\n"
         "   --verbose or -v          Increase verbosity\n"
         "   --quiet or -q            Quiet mode (no title or boilerplate)\n"
@@ -85,7 +91,13 @@ void usage(char *argv0)
         "   --skip N or -k N         Skip N frames into the file\n"
         "   --verbose or -v          Be more verbose in playing files\n"
         "   -o dt                    Set output devicetype to dt\n" 
-    "                                [esd,alsa(09),arts,sun,oss]\n"
+        "                            (");
+    for (i = 0; i < driver_count; i++) {
+        fprintf(stderr, "%s%s", devices[i]->short_name,
+            (i + 1 < driver_count) ? ", " : "");
+    }
+    fprintf(stderr,
+        ")\n"
         "   --audiodevice N or -a N  Use N for audio-out\n"
         "   --stdout or -s           Use stdout for audio-out\n"
         "   --au N                   Use au file N for output\n"
@@ -101,7 +113,7 @@ void usage(char *argv0)
         "   --version or -V          Print version information\n"
         "\n"
         "This version of mpg321 has been configured with " AUDIO_DEFAULT " as its default\n"
-        "libao output device.\n" , argv0);
+        "libao output device.\n");
 }
 
 /* retsigtype is defined by configure;
@@ -188,7 +200,7 @@ static int show_id3(struct id3_tag const *tag)
             
             else
             {
-                printf(names[i]);
+                printf("%s", names[i]);
                 free(names[i]);
             }
         }
@@ -203,7 +215,7 @@ static int show_id3(struct id3_tag const *tag)
             if (!names[i])  {
                 fprintf (stderr, emptystring);
             }   else    {
-                fprintf (stderr, names[i]);
+                fprintf (stderr, "%s", names[i]);
                 free (names[i]);
             }
             if (i%2) fprintf (stderr, "\n");
@@ -239,6 +251,8 @@ int main(int argc, char *argv[])
 
     status = MPG321_PLAYING;
     
+    ao_initialize();
+
     /* Get the command line options */
     parse_options(argc, argv, pl);
 
@@ -257,8 +271,6 @@ int main(int argc, char *argv[])
     if (shuffle_play)
         shuffle_files(pl);
 
-    ao_initialize();
-
     check_default_play_device();
     
     if (!(options.opt & MPG321_REMOTE_PLAY))
@@ -285,6 +297,8 @@ int main(int argc, char *argv[])
         signal(SIGINT, SIG_DFL);
         
         playbuf.buf = NULL;
+        playbuf.frames = NULL;
+        playbuf.times = NULL;
         playbuf.fd = -1;
         playbuf.length = 0;
         playbuf.done = 0;
@@ -410,12 +424,14 @@ int main(int argc, char *argv[])
             
             if(fstat(fd, &stat) == -1)
             {
+                close(fd);
                 mpg321_error(currentfile);
                 continue;
             }
             
             if (!S_ISREG(stat.st_mode))
             {
+                close(fd);
                 continue;
             }
             
@@ -432,6 +448,7 @@ int main(int argc, char *argv[])
             if((playbuf.buf = mmap(0, playbuf.length, PROT_READ, MAP_SHARED, fd, 0))
                                 == MAP_FAILED)
             {
+                close(fd);
                 mpg321_error(currentfile);
                 continue;
             }
@@ -509,9 +526,6 @@ int main(int argc, char *argv[])
 
         mad_decoder_finish(&decoder);
 
-        if (quit_now)
-            break;
-
         if (playbuf.frames)
              free(playbuf.frames);
 
@@ -521,6 +535,7 @@ int main(int argc, char *argv[])
         if (playbuf.fd == -1)
         {
             munmap(playbuf.buf, playbuf.length);
+            close(fd);
         }
 
         else
@@ -535,10 +550,6 @@ int main(int argc, char *argv[])
         ao_close(playdevice);
 
     ao_shutdown();
-
-#if defined(RAW_SUPPORT) || defined(HTTP_SUPPORT) || defined(FTP_SUPPORT) 
-    if(fd) close(fd);
-#endif
 
     return(0);
 }
