version 1.17, 2001/08/14 00:01:56 |
version 1.18, 2001/10/28 03:57:59 |
|
|
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; |
|
|
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': |
|
|
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) { |
|
|
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; |
{ |
{ |
|
|
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); |
|
|
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__) |
|
|
|
|
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 ] ] |
* |
* |
|
|
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; |
|
|
&& ((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); |
} |
} |
|
|
|
|
&& ((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) { |
|
|
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; |
|
|
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"); |
|
|
} 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; |
|
|
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; |
{ |
{ |
|
|
|
|
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; |
|
|
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; |
{ |
{ |
|
|
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; |
{ |
{ |
|
|
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; |
|
|
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; |
|
|
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; |
|
|
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; |
|
|
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; |
|
|
*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; |
|
|
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]; |
|
|
|
|
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; |
{ |
{ |
|
|
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; |
|
|
*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; |
|
|
} |
} |
|
|
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; |
|
|
/* 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); |