[BACK]Return to cdio.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / cdio

Diff for /src/usr.bin/cdio/cdio.c between version 1.17 and 1.18

version 1.17, 2001/08/14 00:01:56 version 1.18, 2001/10/28 03:57:59
Line 129 
Line 129 
 int             run __P((int cmd, char *arg));  int             run __P((int cmd, char *arg));
 char            *parse __P((char *buf, int *cmd));  char            *parse __P((char *buf, int *cmd));
   
 void help ()  void
   help()
 {  {
         struct cmdtab *c;          struct cmdtab *c;
         char *s, n;          char *s, n;
Line 147 
Line 148 
                         putchar(n);                          putchar(n);
                 }                  }
                 if (*c->args)                  if (*c->args)
                         printf (" %s", c->args);                          printf(" %s", c->args);
                 printf ("\n");                  printf("\n");
         }          }
         printf ("\n\tThe word \"play\" is not required for the play commands.\n");          printf("\n\tThe word \"play\" is not required for the play commands.\n");
         printf ("\tThe plain target address is taken as a synonym for play.\n");          printf("\tThe plain target address is taken as a synonym for play.\n");
 }  }
   
 void usage ()  void
   usage()
 {  {
         (void)fprintf(stderr,          fprintf(stderr, "usage: %s [-sv] [-f device] [command args ...]\n",
             "usage: %s [-sv] [-f device] [command args ...]\n", __progname);              __progname);
         exit (1);          exit(1);
 }  }
   
 int main (argc, argv)  int
   main(argc, argv)
         int argc;          int argc;
         char **argv;          char **argv;
 {  {
         int cmd;          int cmd;
         char *arg;          char *arg;
   
         cdname = getenv ("DISC");          cdname = getenv("DISC");
         if (! cdname)          if (! cdname)
                 cdname = getenv ("CDROM");                  cdname = getenv("CDROM");
   
         for (;;) {          for (;;) {
                 switch (getopt (argc, argv, "svf:")) {                  switch (getopt(argc, argv, "svf:")) {
                 case EOF:                  case EOF:
                         break;                          break;
                 case 's':                  case 's':
Line 186 
Line 189 
                         cdname = optarg;                          cdname = optarg;
                         continue;                          continue;
                 default:                  default:
                         usage ();                          usage();
                 }                  }
                 break;                  break;
         }          }
         argc -= optind;          argc -= optind;
         argv += optind;          argv += optind;
   
         if (argc > 0 && ! strcasecmp (*argv, "help"))          if (argc > 0 && ! strcasecmp(*argv, "help"))
                 usage ();                  usage();
   
         if (! cdname) {          if (! cdname) {
                 cdname = DEFAULT_CD_DRIVE;                  cdname = DEFAULT_CD_DRIVE;
                 fprintf (stderr,                  fprintf(stderr,
                          "No CD device name specified. Defaulting to %s.\n", cdname);                      "No CD device name specified. Defaulting to %s.\n", cdname);
         }          }
   
         if (argc > 0) {          if (argc > 0) {
Line 207 
Line 210 
                 int len;                  int len;
   
                 for (p=buf; argc-->0; ++argv) {                  for (p=buf; argc-->0; ++argv) {
                         len = strlen (*argv);                          len = strlen(*argv);
   
                         if (p + len >= buf + sizeof (buf) - 1)                          if (p + len >= buf + sizeof (buf) - 1)
                                 usage ();                                  usage();
   
                         if (p > buf)                          if (p > buf)
                                 *p++ = ' ';                                  *p++ = ' ';
   
                         strcpy (p, *argv);      /* ok */                          strcpy(p, *argv);       /* ok */
                         p += len;                          p += len;
                 }                  }
                 *p = 0;                  *p = 0;
                 arg = parse (buf, &cmd);                  arg = parse(buf, &cmd);
                 return (run (cmd, arg));                  return (run(cmd, arg));
         }          }
   
         if (verbose == 1)          if (verbose == 1)
                 verbose = isatty (0);                  verbose = isatty(0);
   
         if (verbose) {          if (verbose) {
                 printf ("Compact Disc Control utility, version %s\n", VERSION);                  printf("Compact Disc Control utility, version %s\n", VERSION);
                 printf ("Type `?' for command list\n\n");                  printf("Type `?' for command list\n\n");
         }          }
   
         for (;;) {          for (;;) {
                 arg = input (&cmd);                  arg = input(&cmd);
                 if (run (cmd, arg) < 0) {                  if (run(cmd, arg) < 0) {
                         if (verbose)                          if (verbose)
                                 warn (NULL);                                  warn(NULL);
                         close (fd);                          close(fd);
                         fd = -1;                          fd = -1;
                 }                  }
                 fflush (stdout);                  fflush(stdout);
         }          }
 }  }
   
 int run (cmd, arg)  int
   run(cmd, arg)
         int cmd;          int cmd;
         char *arg;          char *arg;
 {  {
Line 253 
Line 257 
         switch (cmd) {          switch (cmd) {
   
         case CMD_QUIT:          case CMD_QUIT:
                 exit (0);                  exit(0);
   
         case CMD_INFO:          case CMD_INFO:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return info (arg);                  return info(arg);
   
         case CMD_STATUS:          case CMD_STATUS:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return pstatus (arg);                  return pstatus(arg);
   
         case CMD_PAUSE:          case CMD_PAUSE:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return ioctl (fd, CDIOCPAUSE);                  return ioctl(fd, CDIOCPAUSE);
   
         case CMD_RESUME:          case CMD_RESUME:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return ioctl (fd, CDIOCRESUME);                  return ioctl(fd, CDIOCRESUME);
   
         case CMD_STOP:          case CMD_STOP:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 rc = ioctl (fd, CDIOCSTOP);                  rc = ioctl(fd, CDIOCSTOP);
   
                 (void) ioctl (fd, CDIOCALLOW);                  (void) ioctl(fd, CDIOCALLOW);
   
                 return (rc);                  return (rc);
   
         case CMD_RESET:          case CMD_RESET:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 rc = ioctl (fd, CDIOCRESET);                  rc = ioctl(fd, CDIOCRESET);
                 if (rc < 0)                  if (rc < 0)
                         return rc;                          return rc;
                 close(fd);                  close(fd);
Line 301 
Line 305 
                 return (0);                  return (0);
   
         case CMD_DEBUG:          case CMD_DEBUG:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 if (! strcasecmp (arg, "on"))                  if (! strcasecmp(arg, "on"))
                         return ioctl (fd, CDIOCSETDEBUG);                          return ioctl(fd, CDIOCSETDEBUG);
   
                 if (! strcasecmp (arg, "off"))                  if (! strcasecmp(arg, "off"))
                         return ioctl (fd, CDIOCCLRDEBUG);                          return ioctl(fd, CDIOCCLRDEBUG);
   
                 printf ("%s: Invalid command arguments\n", __progname);                  printf("%s: Invalid command arguments\n", __progname);
   
                 return (0);                  return (0);
   
         case CMD_DEVICE:          case CMD_DEVICE:
                 /* close old device */                  /* close old device */
                 if (fd > -1) {                  if (fd > -1) {
                         (void) ioctl (fd, CDIOCALLOW);                          (void) ioctl(fd, CDIOCALLOW);
                         close(fd);                          close(fd);
                         fd = -1;                          fd = -1;
                 }                  }
   
                 /* open new device */                  /* open new device */
                 if (!open_cd (arg))                  if (!open_cd(arg))
                         return (0);                          return (0);
                 (void) strlcpy(newcdname, arg, sizeof(newcdname));                  (void) strlcpy(newcdname, arg, sizeof(newcdname));
                 cdname = newcdname;                  cdname = newcdname;
                 return (1);                  return (1);
   
         case CMD_EJECT:          case CMD_EJECT:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 (void) ioctl (fd, CDIOCALLOW);                  (void) ioctl(fd, CDIOCALLOW);
                 rc = ioctl (fd, CDIOCEJECT);                  rc = ioctl(fd, CDIOCEJECT);
                 if (rc < 0)                  if (rc < 0)
                         return (rc);                          return (rc);
 #if defined(__OpenBSD__)  #if defined(__OpenBSD__)
Line 345 
Line 349 
   
         case CMD_CLOSE:          case CMD_CLOSE:
 #if defined(CDIOCCLOSE)  #if defined(CDIOCCLOSE)
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 (void) ioctl (fd, CDIOCALLOW);                  (void) ioctl(fd, CDIOCALLOW);
                 rc = ioctl (fd, CDIOCCLOSE);                  rc = ioctl(fd, CDIOCCLOSE);
                 if (rc < 0)                  if (rc < 0)
                         return (rc);                          return (rc);
                 close(fd);                  close(fd);
                 fd = -1;                  fd = -1;
                 return (0);                  return (0);
 #else  #else
                 printf ("%s: Command not yet supported\n", __progname);                  printf("%s: Command not yet supported\n", __progname);
                 return (0);                  return (0);
 #endif  #endif
   
         case CMD_PLAY:          case CMD_PLAY:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 while (isspace (*arg))                  while (isspace(*arg))
                         arg++;                          arg++;
   
                 return play (arg);                  return play(arg);
   
         case CMD_SET:          case CMD_SET:
                 if (! strcasecmp (arg, "msf"))                  if (!strcasecmp(arg, "msf"))
                         msf = 1;                          msf = 1;
                 else if (! strcasecmp (arg, "lba"))                  else if (!strcasecmp(arg, "lba"))
                         msf = 0;                          msf = 0;
                 else                  else
                         printf ("%s: Invalid command arguments\n", __progname);                          printf("%s: Invalid command arguments\n", __progname);
                 return (0);                  return (0);
   
         case CMD_VOLUME:          case CMD_VOLUME:
                 if (fd < 0 && !open_cd (cdname))                  if (fd < 0 && !open_cd(cdname))
                         return (0);                          return (0);
   
                 if (! strncasecmp (arg, "left", strlen(arg)))                  if (!strncasecmp(arg, "left", strlen(arg)))
                         return ioctl (fd, CDIOCSETLEFT);                          return ioctl(fd, CDIOCSETLEFT);
   
                 if (! strncasecmp (arg, "right", strlen(arg)))                  if (!strncasecmp(arg, "right", strlen(arg)))
                         return ioctl (fd, CDIOCSETRIGHT);                          return ioctl(fd, CDIOCSETRIGHT);
   
                 if (! strncasecmp (arg, "mono", strlen(arg)))                  if (!strncasecmp(arg, "mono", strlen(arg)))
                         return ioctl (fd, CDIOCSETMONO);                          return ioctl(fd, CDIOCSETMONO);
   
                 if (! strncasecmp (arg, "stereo", strlen(arg)))                  if (!strncasecmp(arg, "stereo", strlen(arg)))
                         return ioctl (fd, CDIOCSETSTEREO);                          return ioctl(fd, CDIOCSETSTEREO);
   
                 if (! strncasecmp (arg, "mute", strlen(arg)))                  if (!strncasecmp(arg, "mute", strlen(arg)))
                         return ioctl (fd, CDIOCSETMUTE);                          return ioctl(fd, CDIOCSETMUTE);
   
                 if (2 != sscanf (arg, "%d %d", &l, &r)) {                  if (2 != sscanf(arg, "%d %d", &l, &r)) {
                         printf ("%s: Invalid command arguments\n", __progname);                          printf("%s: Invalid command arguments\n", __progname);
                         return (0);                          return (0);
                 }                  }
   
                 return setvol (l, r);                  return setvol(l, r);
   
         case CMD_NEXT:          case CMD_NEXT:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return play_next (arg);                  return play_next(arg);
   
         case CMD_PREV:          case CMD_PREV:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return (0);                          return (0);
   
                 return play_prev (arg);                  return play_prev(arg);
   
         case CMD_REPLAY:          case CMD_REPLAY:
                 if (fd < 0 && ! open_cd (cdname))                  if (fd < 0 && ! open_cd(cdname))
                         return 0;                          return 0;
   
                 return play_same (arg);                  return play_same(arg);
         default:          default:
         case CMD_HELP:          case CMD_HELP:
                 help ();                  help();
                 return (0);                  return (0);
   
         }          }
 }  }
   
 int play (arg)  int
   play(arg)
         char *arg;          char *arg;
 {  {
         struct ioc_toc_header h;          struct ioc_toc_header h;
         int rc, n, start, end = 0, istart = 1, iend = 1;          int rc, n, start, end = 0, istart = 1, iend = 1;
   
         rc = ioctl (fd, CDIOREADTOCHEADER, &h);          rc = ioctl(fd, CDIOREADTOCHEADER, &h);
   
         if (rc < 0)          if (rc < 0)
                 return (rc);                  return (rc);
   
         n = h.ending_track - h.starting_track + 1;          n = h.ending_track - h.starting_track + 1;
         rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry));          rc = read_toc_entrys((n + 1) * sizeof (struct cd_toc_entry));
   
         if (rc < 0)          if (rc < 0)
                 return (rc);                  return (rc);
   
         if (! arg || ! *arg) {          if (! arg || ! *arg) {
                 /* Play the whole disc */                  /* Play the whole disc */
   
                 return (play_track(h.starting_track, 1,                  return (play_track(h.starting_track, 1,
                                    h.ending_track, 1));                      h.ending_track, 1));
         }          }
   
         if (strchr (arg, '#')) {          if (strchr(arg, '#')) {
                 /* Play block #blk [ len ] */                  /* Play block #blk [ len ] */
                 int blk, len = 0;                  int blk, len = 0;
   
                 if (2 != sscanf (arg, "#%d%d", &blk, &len) &&                  if (2 != sscanf(arg, "#%d%d", &blk, &len) &&
                     1 != sscanf (arg, "#%d", &blk))                      1 != sscanf(arg, "#%d", &blk))
                         goto Clean_up;                          goto Clean_up;
   
                 if (len == 0) {                  if (len == 0) {
                         if (msf)                          if (msf)
                                 len = msf2lba (toc_buffer[n].addr.msf.minute,                                  len = msf2lba(toc_buffer[n].addr.msf.minute,
                                                toc_buffer[n].addr.msf.second,                                      toc_buffer[n].addr.msf.second,
                                                toc_buffer[n].addr.msf.frame) - blk;                                      toc_buffer[n].addr.msf.frame) - blk;
                         else                          else
                                 len = ntohl(toc_buffer[n].addr.lba) - blk;                                  len = ntohl(toc_buffer[n].addr.lba) - blk;
                 }                  }
                 return play_blocks (blk, len);                  return play_blocks(blk, len);
         }          }
   
         if (strchr (arg, ':')) {          if (strchr(arg, ':')) {
                 /*                  /*
                  * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ]                   * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ]
                  *                   *
Line 486 
Line 491 
                 unsigned char tm, ts, tf;                  unsigned char tm, ts, tf;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d",                  if (8 == sscanf(arg, "%d %d:%d.%d %d %d:%d.%d",
                     &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2))                      &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (7 == sscanf (arg, "%d %d:%d %d %d:%d.%d",                  if (7 == sscanf(arg, "%d %d:%d %d %d:%d.%d",
                     &tr1, &m1, &s1, &tr2, &m2, &s2, &f2))                      &tr1, &m1, &s1, &tr2, &m2, &s2, &f2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (7 == sscanf (arg, "%d %d:%d.%d %d %d:%d",                  if (7 == sscanf(arg, "%d %d:%d.%d %d %d:%d",
                     &tr1, &m1, &s1, &f1, &tr2, &m2, &s2))                      &tr1, &m1, &s1, &f1, &tr2, &m2, &s2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (7 == sscanf (arg, "%d %d:%d.%d %d:%d.%d",                  if (7 == sscanf(arg, "%d %d:%d.%d %d:%d.%d",
                     &tr1, &m1, &s1, &f1, &m2, &s2, &f2))                      &tr1, &m1, &s1, &f1, &m2, &s2, &f2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (6 == sscanf (arg, "%d %d:%d.%d %d:%d",                  if (6 == sscanf(arg, "%d %d:%d.%d %d:%d",
                     &tr1, &m1, &s1, &f1, &m2, &s2))                      &tr1, &m1, &s1, &f1, &m2, &s2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (6 == sscanf (arg, "%d %d:%d %d:%d.%d",                  if (6 == sscanf(arg, "%d %d:%d %d:%d.%d",
                     &tr1, &m1, &s1, &m2, &s2, &f2))                      &tr1, &m1, &s1, &m2, &s2, &f2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (6 == sscanf (arg, "%d %d:%d.%d %d %d",                  if (6 == sscanf(arg, "%d %d:%d.%d %d %d",
                     &tr1, &m1, &s1, &f1, &tr2, &m2))                      &tr1, &m1, &s1, &f1, &tr2, &m2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (5 == sscanf (arg, "%d %d:%d %d:%d", &tr1, &m1, &s1, &m2, &s2))                  if (5 == sscanf(arg, "%d %d:%d %d:%d", &tr1, &m1, &s1, &m2, &s2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (5 == sscanf (arg, "%d %d:%d %d %d",                  if (5 == sscanf(arg, "%d %d:%d %d %d",
                     &tr1, &m1, &s1, &tr2, &m2))                      &tr1, &m1, &s1, &tr2, &m2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (5 == sscanf (arg, "%d %d:%d.%d %d",                  if (5 == sscanf(arg, "%d %d:%d.%d %d",
                     &tr1, &m1, &s1, &f1, &tr2))                      &tr1, &m1, &s1, &f1, &tr2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (4 == sscanf (arg, "%d %d:%d %d", &tr1, &m1, &s1, &tr2))                  if (4 == sscanf(arg, "%d %d:%d %d", &tr1, &m1, &s1, &tr2))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (4 == sscanf (arg, "%d %d:%d.%d", &tr1, &m1, &s1, &f1))                  if (4 == sscanf(arg, "%d %d:%d.%d", &tr1, &m1, &s1, &f1))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
                 if (3 == sscanf (arg, "%d %d:%d", &tr1, &m1, &s1))                  if (3 == sscanf(arg, "%d %d:%d", &tr1, &m1, &s1))
                         goto Play_Relative_Addresses;                          goto Play_Relative_Addresses;
   
                 tr2 = m2 = s2 = f2 = f1 = 0;                  tr2 = m2 = s2 = f2 = f1 = 0;
Line 567 
Line 572 
                     && ((s1 > ts)                      && ((s1 > ts)
                     || ((s1 == ts)                      || ((s1 == ts)
                     && (f1 > tf))))) {                      && (f1 > tf))))) {
                         printf ("Track %d is not that long.\n", tr1);                          printf("Track %d is not that long.\n", tr1);
                         return (0);                          return (0);
                 }                  }
   
Line 658 
Line 663 
                     && ((s2 > ts)                      && ((s2 > ts)
                     || ((s2 == ts)                      || ((s2 == ts)
                     && (f2 > tf)))))) {                      && (f2 > tf)))))) {
                         printf ("The playing time of the disc is not that long.\n");                          printf("The playing time of the disc is not that long.\n");
                         return (0);                          return (0);
                 }                  }
                 return (play_msf (m1, s1, f1, m2, s2, f2));                  return (play_msf(m1, s1, f1, m2, s2, f2));
   
 Try_Absolute_Timed_Addresses:  Try_Absolute_Timed_Addresses:
                 if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d",                  if (6 != sscanf(arg, "%d:%d.%d%d:%d.%d",
                         &m1, &s1, &f1, &m2, &s2, &f2) &&                      &m1, &s1, &f1, &m2, &s2, &f2) &&
                     5 != sscanf (arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) &&                      5 != sscanf(arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) &&
                     5 != sscanf (arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) &&                      5 != sscanf(arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) &&
                     3 != sscanf (arg, "%d:%d.%d", &m1, &s1, &f1) &&                      3 != sscanf(arg, "%d:%d.%d", &m1, &s1, &f1) &&
                     4 != sscanf (arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) &&                      4 != sscanf(arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) &&
                     2 != sscanf (arg, "%d:%d", &m1, &s1))                      2 != sscanf(arg, "%d:%d", &m1, &s1))
                         goto Clean_up;                          goto Clean_up;
   
                 if (m2 == 0) {                  if (m2 == 0) {
Line 686 
Line 691 
                                 f2 = tf;                                  f2 = tf;
                         }                          }
                 }                  }
                 return play_msf (m1, s1, f1, m2, s2, f2);                  return play_msf(m1, s1, f1, m2, s2, f2);
         }          }
   
         /*          /*
          * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ]           * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ]
          */           */
         if (4 != sscanf (arg, "%d.%d%d.%d", &start, &istart, &end, &iend) &&          if (4 != sscanf(arg, "%d.%d%d.%d", &start, &istart, &end, &iend) &&
             3 != sscanf (arg, "%d.%d%d", &start, &istart, &end) &&              3 != sscanf(arg, "%d.%d%d", &start, &istart, &end) &&
             3 != sscanf (arg, "%d%d.%d", &start, &end, &iend) &&              3 != sscanf(arg, "%d%d.%d", &start, &end, &iend) &&
             2 != sscanf (arg, "%d.%d", &start, &istart) &&              2 != sscanf(arg, "%d.%d", &start, &istart) &&
             2 != sscanf (arg, "%d%d", &start, &end) &&              2 != sscanf(arg, "%d%d", &start, &end) &&
             1 != sscanf (arg, "%d", &start))              1 != sscanf(arg, "%d", &start))
                 goto Clean_up;                  goto Clean_up;
   
         if (end == 0)          if (end == 0)
                 end = h.ending_track;                  end = h.ending_track;
         return (play_track (start, istart, end, iend));          return (play_track(start, istart, end, iend));
   
 Clean_up:  Clean_up:
         printf ("%s: Invalid command arguments\n", __progname);          printf("%s: Invalid command arguments\n", __progname);
         return (0);          return (0);
 }  }
   
 int play_prev (arg)  int
         char *arg;  play_prev(arg)
           char *arg;
 {  {
         int trk, min, sec, frm, rc;          int trk, min, sec, frm, rc;
         struct ioc_toc_header h;          struct ioc_toc_header h;
   
         if (status (&trk, &min, &sec, &frm) >= 0)          if (status(&trk, &min, &sec, &frm) >= 0) {
         {                  trk--;
                 trk--;  
   
                 rc = ioctl (fd, CDIOREADTOCHEADER, &h);                  rc = ioctl(fd, CDIOREADTOCHEADER, &h);
                 if (rc < 0)                  if (rc < 0) {
                 {                          warn("getting toc header");
                         warn ("getting toc header");                          return (rc);
                         return (rc);                  }
                 }  
   
                 if (trk < h.starting_track)                  if (trk < h.starting_track)
                   return play_track (h.starting_track, 1,                          return play_track(h.starting_track, 1,
                                      h.ending_track + 1, 1);                              h.ending_track + 1, 1);
                   return play_track(trk, 1, h.ending_track, 1);
           }
   
                 return play_track (trk, 1, h.ending_track, 1);          return (0);
         }  
   
         return (0);  
 }  }
   
 int play_same (arg)  int
   play_same(arg)
         char *arg;          char *arg;
 {  {
         int trk, min, sec, frm, rc;          int trk, min, sec, frm, rc;
         struct ioc_toc_header h;          struct ioc_toc_header h;
   
         if (status (&trk, &min, &sec, &frm) >= 0)          if (status (&trk, &min, &sec, &frm) >= 0) {
         {                  rc = ioctl(fd, CDIOREADTOCHEADER, &h);
                 rc = ioctl (fd, CDIOREADTOCHEADER, &h);                  if (rc < 0) {
                 if (rc < 0)                          warn("getting toc header");
                 {                          return (rc);
                         warn ("getting toc header");                  }
                         return (rc);  
                 }  
   
                 return play_track (trk, 1, h.ending_track, 1);                  return play_track(trk, 1, h.ending_track, 1);
         }          }
   
         return (0);          return (0);
 }  }
   
 int play_next (arg)  int
   play_next(arg)
         char *arg;          char *arg;
 {  {
         int trk, min, sec, frm, rc;          int trk, min, sec, frm, rc;
         struct ioc_toc_header h;          struct ioc_toc_header h;
   
         if (status (&trk, &min, &sec, &frm) >= 0)          if (status(&trk, &min, &sec, &frm) >= 0) {
         {  
                 trk++;                  trk++;
                 rc = ioctl (fd, CDIOREADTOCHEADER, &h);                  rc = ioctl(fd, CDIOREADTOCHEADER, &h);
                 if (rc < 0)                  if (rc < 0) {
                 {                          warn("getting toc header");
                         warn ("getting toc header");  
                         return (rc);                          return (rc);
                 }                  }
   
                 if (trk > h.ending_track)                  if (trk > h.ending_track) {
                 {  
                         printf("%s: end of CD\n", __progname);                          printf("%s: end of CD\n", __progname);
   
                         rc = ioctl (fd, CDIOCSTOP);                          rc = ioctl(fd, CDIOCSTOP);
   
                         (void) ioctl (fd, CDIOCALLOW);                          (void) ioctl(fd, CDIOCALLOW);
   
                         return (rc);                          return (rc);
                 }                  }
   
                 return play_track (trk, 1, h.ending_track, 1);                  return play_track(trk, 1, h.ending_track, 1);
         }          }
   
         return (0);          return (0);
 }  }
   
 char *strstatus (sts)  char *
   strstatus(sts)
         int sts;          int sts;
 {  {
         switch (sts) {          switch (sts) {
         case ASTS_INVALID:   return ("invalid");          case ASTS_INVALID:
         case ASTS_PLAYING:   return ("playing");                  return ("invalid");
         case ASTS_PAUSED:    return ("paused");          case ASTS_PLAYING:
         case ASTS_COMPLETED: return ("completed");                  return ("playing");
         case ASTS_ERROR:     return ("error");          case ASTS_PAUSED:
         case ASTS_VOID:      return ("void");                  return ("paused");
         default:             return ("??");          case ASTS_COMPLETED:
                   return ("completed");
           case ASTS_ERROR:
                   return ("error");
           case ASTS_VOID:
                   return ("void");
           default:
                   return ("??");
         }          }
 }  }
   
 int pstatus (arg)  int
   pstatus(arg)
         char *arg;          char *arg;
 {  {
         struct ioc_vol v;          struct ioc_vol v;
Line 813 
Line 822 
         int rc, trk, m, s, f;          int rc, trk, m, s, f;
         char vis_catalog[1 + 4 * 15];          char vis_catalog[1 + 4 * 15];
   
         rc = status (&trk, &m, &s, &f);          rc = status(&trk, &m, &s, &f);
         if (rc >= 0) {          if (rc >= 0) {
                 if (verbose)                  if (verbose)
                         printf ("Audio status = %d<%s>, current track = %d, current position = %d:%02d.%02d\n",                          printf("Audio status = %d<%s>, current track = %d, current position = %d:%02d.%02d\n",
                                 rc, strstatus (rc), trk, m, s, f);                              rc, strstatus(rc), trk, m, s, f);
                 else                  else
                         printf ("%d %d %d:%02d.%02d\n", rc, trk, m, s, f);                          printf("%d %d %d:%02d.%02d\n", rc, trk, m, s, f);
         } else          } else
                 printf ("No current status info available\n");                  printf("No current status info available\n");
   
         bzero (&ss, sizeof (ss));          bzero(&ss, sizeof (ss));
         ss.data = &data;          ss.data = &data;
         ss.data_len = sizeof (data);          ss.data_len = sizeof (data);
         ss.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;          ss.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;
         ss.data_format = CD_MEDIA_CATALOG;          ss.data_format = CD_MEDIA_CATALOG;
         rc = ioctl (fd, CDIOCREADSUBCHANNEL, (char *) &ss);          rc = ioctl(fd, CDIOCREADSUBCHANNEL, (char *) &ss);
         if (rc >= 0) {          if (rc >= 0) {
                 printf("Media catalog is %sactive",                  printf("Media catalog is %sactive",
                 ss.data->what.media_catalog.mc_valid ? "": "in");                  ss.data->what.media_catalog.mc_valid ? "": "in");
Line 843 
Line 852 
         } else          } else
                 printf("No media catalog info available\n");                  printf("No media catalog info available\n");
   
         rc = ioctl (fd, CDIOCGETVOL, &v);          rc = ioctl(fd, CDIOCGETVOL, &v);
         if (rc >= 0) {          if (rc >= 0) {
                 if (verbose)                  if (verbose)
                         printf ("Left volume = %d, right volume = %d\n",                          printf("Left volume = %d, right volume = %d\n",
                                 v.vol[0], v.vol[1]);                                  v.vol[0], v.vol[1]);
                 else                  else
                         printf ("%d %d\n", v.vol[0], v.vol[1]);                          printf("%d %d\n", v.vol[0], v.vol[1]);
         } else          } else
                 printf ("No volume level info available\n");                  printf("No volume level info available\n");
         return(0);          return(0);
 }  }
   
 int info (arg)  int
   info(arg)
         char *arg;          char *arg;
 {  {
         struct ioc_toc_header h;          struct ioc_toc_header h;
         int rc, i, n;          int rc, i, n;
   
         rc = ioctl (fd, CDIOREADTOCHEADER, &h);          rc = ioctl(fd, CDIOREADTOCHEADER, &h);
         if (rc >= 0) {          if (rc >= 0) {
                 if (verbose)                  if (verbose)
                         printf ("Starting track = %d, ending track = %d, TOC size = %d bytes\n",                          printf("Starting track = %d, ending track = %d, TOC size = %d bytes\n",
                                 h.starting_track, h.ending_track, h.len);                              h.starting_track, h.ending_track, h.len);
                 else                  else
                         printf ("%d %d %d\n", h.starting_track,                          printf("%d %d %d\n", h.starting_track,
                                 h.ending_track, h.len);                              h.ending_track, h.len);
         } else {          } else {
                 warn ("getting toc header");                  warn("getting toc header");
                 return (rc);                  return (rc);
         }          }
   
         n = h.ending_track - h.starting_track + 1;          n = h.ending_track - h.starting_track + 1;
         rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry));          rc = read_toc_entrys((n + 1) * sizeof (struct cd_toc_entry));
         if (rc < 0)          if (rc < 0)
                 return (rc);                  return (rc);
   
         if (verbose) {          if (verbose) {
                 printf ("track     start  duration   block  length   type\n");                  printf("track     start  duration   block  length   type\n");
                 printf ("-------------------------------------------------\n");                  printf("-------------------------------------------------\n");
         }          }
   
         for (i = 0; i < n; i++) {          for (i = 0; i < n; i++) {
                 printf ("%5d  ", toc_buffer[i].track);                  printf("%5d  ", toc_buffer[i].track);
                 prtrack (toc_buffer + i, 0);                  prtrack(toc_buffer + i, 0);
         }          }
         printf ("%5d  ", toc_buffer[n].track);          printf("%5d  ", toc_buffer[n].track);
         prtrack (toc_buffer + n, 1);          prtrack(toc_buffer + n, 1);
         return (0);          return (0);
 }  }
   
 void lba2msf (lba, m, s, f)  void
   lba2msf(lba, m, s, f)
         unsigned long lba;          unsigned long lba;
         u_char *m;          u_char *m;
         u_char *s;          u_char *s;
         u_char *f;          u_char *f;
 {  {
         lba += 150;                     /* block start offset */          lba += 150;             /* block start offset */
         lba &= 0xffffff;                /* negative lbas use only 24 bits */          lba &= 0xffffff;        /* negative lbas use only 24 bits */
         *m = lba / (60 * 75);          *m = lba / (60 * 75);
         lba %= (60 * 75);          lba %= (60 * 75);
         *s = lba / 75;          *s = lba / 75;
         *f = lba % 75;          *f = lba % 75;
 }  }
   
 unsigned int msf2lba (m, s, f)  unsigned int
   msf2lba(m, s, f)
         u_char m;          u_char m;
         u_char s;          u_char s;
         u_char f;          u_char f;
Line 915 
Line 927 
         return (((m * 60) + s) * 75 + f) - 150;          return (((m * 60) + s) * 75 + f) - 150;
 }  }
   
 void prtrack (e, lastflag)  void
   prtrack(e, lastflag)
         struct cd_toc_entry *e;          struct cd_toc_entry *e;
         int lastflag;          int lastflag;
 {  {
Line 924 
Line 937 
   
         if (msf) {          if (msf) {
                 /* Print track start */                  /* Print track start */
                 printf ("%2d:%02d.%02d  ", e->addr.msf.minute,                  printf("%2d:%02d.%02d  ", e->addr.msf.minute,
                         e->addr.msf.second, e->addr.msf.frame);                          e->addr.msf.second, e->addr.msf.frame);
   
                 block = msf2lba (e->addr.msf.minute, e->addr.msf.second,                  block = msf2lba(e->addr.msf.minute, e->addr.msf.second,
                         e->addr.msf.frame);                          e->addr.msf.frame);
         } else {          } else {
                 block = ntohl(e->addr.lba);                  block = ntohl(e->addr.lba);
                 lba2msf(block, &m, &s, &f);                  lba2msf(block, &m, &s, &f);
                 /* Print track start */                  /* Print track start */
                 printf ("%2d:%02d.%02d  ", m, s, f);                  printf("%2d:%02d.%02d  ", m, s, f);
         }          }
         if (lastflag) {          if (lastflag) {
                 /* Last track -- print block */                  /* Last track -- print block */
                 printf ("       -  %6d       -      -\n", block);                  printf("       -  %6d       -      -\n", block);
                 return;                  return;
         }          }
   
         if (msf)          if (msf)
                 next = msf2lba (e[1].addr.msf.minute, e[1].addr.msf.second,                  next = msf2lba(e[1].addr.msf.minute, e[1].addr.msf.second,
                         e[1].addr.msf.frame);                          e[1].addr.msf.frame);
         else          else
                 next = ntohl(e[1].addr.lba);                  next = ntohl(e[1].addr.lba);
         len = next - block;          len = next - block;
         lba2msf (len, &m, &s, &f);          lba2msf(len, &m, &s, &f);
   
         /* Print duration, block, length, type */          /* Print duration, block, length, type */
         printf ("%2d:%02d.%02d  %6d  %6d  %5s\n", m, s, f, block, len,          printf("%2d:%02d.%02d  %6d  %6d  %5s\n", m, s, f, block, len,
                 (e->control & 4) ? "data" : "audio");              (e->control & 4) ? "data" : "audio");
 }  }
   
 int play_track (tstart, istart, tend, iend)  int
   play_track(tstart, istart, tend, iend)
         int tstart;          int tstart;
         int istart;          int istart;
         int tend;          int tend;
Line 967 
Line 981 
         t.end_track = tend;          t.end_track = tend;
         t.end_index = iend;          t.end_index = iend;
   
         return ioctl (fd, CDIOCPLAYTRACKS, &t);          return ioctl(fd, CDIOCPLAYTRACKS, &t);
 }  }
   
 int play_blocks (blk, len)  int
   play_blocks(blk, len)
         int blk;          int blk;
         int len;          int len;
 {  {
Line 979 
Line 994 
         t.blk = blk;          t.blk = blk;
         t.len = len;          t.len = len;
   
         return ioctl (fd, CDIOCPLAYBLOCKS, &t);          return ioctl(fd, CDIOCPLAYBLOCKS, &t);
 }  }
   
 int setvol (left, right)  int
   setvol(left, right)
         int left;          int left;
         int right;          int right;
 {  {
Line 993 
Line 1009 
         v.vol[2] = 0;          v.vol[2] = 0;
         v.vol[3] = 0;          v.vol[3] = 0;
   
         return ioctl (fd, CDIOCSETVOL, &v);          return ioctl(fd, CDIOCSETVOL, &v);
 }  }
   
 int read_toc_entrys (len)  int
   read_toc_entrys(len)
         int len;          int len;
 {  {
         struct ioc_read_toc_entry t;          struct ioc_read_toc_entry t;
   
         if (toc_buffer) {          if (toc_buffer) {
           free(toc_buffer);                  free(toc_buffer);
           toc_buffer = 0;                  toc_buffer = 0;
         }          }
   
         toc_buffer = malloc (len);          toc_buffer = malloc(len);
   
         if (!toc_buffer) {          if (!toc_buffer) {
           errno = ENOMEM;                  errno = ENOMEM;
           return (-1);                  return (-1);
         }          }
   
         t.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;          t.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;
Line 1018 
Line 1035 
         t.data_len = len;          t.data_len = len;
         t.data = toc_buffer;          t.data = toc_buffer;
   
         return (ioctl (fd, CDIOREADTOCENTRYS, (char *) &t));          return (ioctl(fd, CDIOREADTOCENTRYS, (char *) &t));
 }  }
   
 int play_msf (start_m, start_s, start_f, end_m, end_s, end_f)  int
   play_msf(start_m, start_s, start_f, end_m, end_s, end_f)
         int start_m;          int start_m;
         int start_s;          int start_s;
         int start_f;          int start_f;
Line 1029 
Line 1047 
         int end_s;          int end_s;
         int end_f;          int end_f;
 {  {
         struct ioc_play_msf     a;          struct ioc_play_msf a;
   
         a.start_m = start_m;          a.start_m = start_m;
         a.start_s = start_s;          a.start_s = start_s;
Line 1038 
Line 1056 
         a.end_s = end_s;          a.end_s = end_s;
         a.end_f = end_f;          a.end_f = end_f;
   
         return ioctl (fd, CDIOCPLAYMSF, (char *) &a);          return ioctl(fd, CDIOCPLAYMSF, (char *) &a);
 }  }
   
 int status (trk, min, sec, frame)  int status(trk, min, sec, frame)
         int *trk;          int *trk;
         int *min;          int *min;
         int *sec;          int *sec;
Line 1051 
Line 1069 
         struct cd_sub_channel_info data;          struct cd_sub_channel_info data;
         u_char mm, ss, ff;          u_char mm, ss, ff;
   
         bzero (&s, sizeof (s));          bzero(&s, sizeof (s));
         s.data = &data;          s.data = &data;
         s.data_len = sizeof (data);          s.data_len = sizeof (data);
         s.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;          s.address_format = msf ? CD_MSF_FORMAT : CD_LBA_FORMAT;
         s.data_format = CD_CURRENT_POSITION;          s.data_format = CD_CURRENT_POSITION;
   
         if (ioctl (fd, CDIOCREADSUBCHANNEL, (char *) &s) < 0)          if (ioctl(fd, CDIOCREADSUBCHANNEL, (char *) &s) < 0)
                 return -1;                  return -1;
   
         *trk = s.data->what.position.track_number;          *trk = s.data->what.position.track_number;
Line 1067 
Line 1085 
                 *frame = s.data->what.position.reladdr.msf.frame;                  *frame = s.data->what.position.reladdr.msf.frame;
         } else {          } else {
                 lba2msf(ntohl(s.data->what.position.reladdr.lba),                  lba2msf(ntohl(s.data->what.position.reladdr.lba),
                         &mm, &ss, &ff);                      &mm, &ss, &ff);
                 *min = mm;                  *min = mm;
                 *sec = ss;                  *sec = ss;
                 *frame = ff;                  *frame = ff;
Line 1076 
Line 1094 
         return s.data->header.audio_status;          return s.data->header.audio_status;
 }  }
   
 char *input (cmd)  char *
   input(cmd)
         int *cmd;          int *cmd;
 {  {
         static char buf[80];          static char buf[80];
Line 1084 
Line 1103 
   
         do {          do {
                 if (verbose)                  if (verbose)
                         fprintf (stderr, "%s> ", __progname);                          fprintf(stderr, "%s> ", __progname);
                 if (! fgets (buf, sizeof (buf), stdin)) {                  if (!fgets(buf, sizeof (buf), stdin)) {
                         *cmd = CMD_QUIT;                          *cmd = CMD_QUIT;
                         fprintf (stderr, "\r\n");                          fprintf(stderr, "\r\n");
                         return (0);                          return (0);
                 }                  }
                 p = parse (buf, cmd);                  p = parse(buf, cmd);
         } while (! p);          } while (!p);
         return (p);          return (p);
 }  }
   
 char *parse (buf, cmd)  char *
   parse(buf, cmd)
         char *buf;          char *buf;
         int *cmd;          int *cmd;
 {  {
Line 1103 
Line 1123 
         char *p;          char *p;
         int len;          int len;
   
         for (p=buf; isspace (*p); p++)          for (p=buf; isspace(*p); p++)
                 continue;                  continue;
   
         if (isdigit (*p) || (p[0] == '#' && isdigit (p[1]))) {          if (isdigit(*p) || (p[0] == '#' && isdigit(p[1]))) {
                 *cmd = CMD_PLAY;                  *cmd = CMD_PLAY;
                 return (p);                  return (p);
         }          }
   
         for (buf = p; *p && ! isspace (*p); p++)          for (buf = p; *p && ! isspace(*p); p++)
                 continue;                  continue;
   
         len = p - buf;          len = p - buf;
         if (! len)          if (! len)
                 return (0);                  return (0);
   
         if (*p) {                       /* It must be a spacing character! */          if (*p) {               /* It must be a spacing character! */
                 char *q;                  char *q;
   
                 *p++ = 0;                  *p++ = 0;
Line 1130 
Line 1150 
         *cmd = -1;          *cmd = -1;
         for (c=cmdtab; c->name; ++c) {          for (c=cmdtab; c->name; ++c) {
                 /* Is it an exact match? */                  /* Is it an exact match? */
                 if (! strcasecmp (buf, c->name)) {                  if (! strcasecmp(buf, c->name)) {
                         *cmd = c->command;                          *cmd = c->command;
                         break;                          break;
                 }                  }
   
                 /* Try short hand forms then... */                  /* Try short hand forms then... */
                 if (len >= c->min && ! strncasecmp (buf, c->name, len)) {                  if (len >= c->min && ! strncasecmp(buf, c->name, len)) {
                         if (*cmd != -1 && *cmd != c->command) {                          if (*cmd != -1 && *cmd != c->command) {
                                 fprintf (stderr, "Ambiguous command\n");                                  fprintf(stderr, "Ambiguous command\n");
                                 return (0);                                  return (0);
                         }                          }
                         *cmd = c->command;                          *cmd = c->command;
Line 1146 
Line 1166 
         }          }
   
         if (*cmd == -1) {          if (*cmd == -1) {
                 fprintf (stderr, "%s: Invalid command, enter ``help'' for commands.\n",                  fprintf(stderr, "%s: Invalid command, enter ``help'' for commands.\n",
                         __progname);                      __progname);
                 return (0);                  return (0);
         }          }
   
         while (isspace (*p))          while (isspace(*p))
                 p++;                  p++;
         return p;          return p;
 }  }
   
 int open_cd (dev)  int
   open_cd(dev)
         char *dev;          char *dev;
 {  {
         char *realdev;          char *realdev;
Line 1172 
Line 1193 
                                 /*  ENXIO has an overloaded meaning here.                                  /*  ENXIO has an overloaded meaning here.
                                  *  The original "Device not configured" should                                   *  The original "Device not configured" should
                                  *  be interpreted as "No disc in drive %s". */                                   *  be interpreted as "No disc in drive %s". */
                                 warnx ("No disc in drive %s.", realdev);                                  warnx("No disc in drive %s.", realdev);
                                 return (0);                                  return (0);
                         } else if (errno != EIO) {                          } else if (errno != EIO) {
                                 /*  EIO may simply mean the device is not ready                                  /*  EIO may simply mean the device is not ready
                                  *  yet which is common with CD changers. */                                   *  yet which is common with CD changers. */
                                 warn ("Can't open %s", realdev);                                  warn("Can't open %s", realdev);
                                 return (0);                                  return (0);
                         }                          }
                 }                  }
                 sleep (1);                  sleep(1);
         }          }
         if (fd < 0) {          if (fd < 0) {
                 warn ("Can't open %s", realdev);                  warn("Can't open %s", realdev);
                 return (0);                  return (0);
         }          }
         return (1);          return (1);

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.18