I'm using this patch for cdcontrol(1):

        cdid    Print the xmcd's CD id.



--- cdcontrol.c.orig    Sun Aug 29 18:40:16 1999
+++ cdcontrol.c Wed Oct  6 12:01:35 1999
@@ -33,6 +33,7 @@
 #include <sys/file.h>
 #include <sys/cdio.h>
 #include <sys/ioctl.h>
+#include <sys/types.h>
 
 #define VERSION "2.0"
 
@@ -65,6 +66,7 @@
 #define CMD_RESET       12
 #define CMD_SET         13
 #define CMD_STATUS      14
+#define CMD_CDID        15
 #define STATUS_AUDIO    0x1
 #define STATUS_MEDIA    0x2
 #define STATUS_VOLUME   0x4
@@ -93,6 +95,7 @@
 { CMD_STATUS,   "status",       1, "[audio | media | volume]" },
 { CMD_STOP,     "stop",         3, "" },
 { CMD_VOLUME,   "volume",       1, "<l> <r> | left | right | mute | mono | stereo" },
+{ CMD_CDID,     "cdid",         2, "" },
 { 0, }
 };
 
@@ -112,6 +115,7 @@
 int             open_cd __P((void));
 int             play __P((char *arg));
 int             info __P((char *arg));
+int             cdid __P((void));
 int             pstatus __P((char *arg));
 char            *input __P((int *));
 void            prtrack __P((struct cd_toc_entry *e, int lastflag));
@@ -252,6 +256,12 @@
 
                return info (arg);
 
+       case CMD_CDID:
+               if (fd < 0 && ! open_cd ())
+                       return (0);
+
+               return cdid ();
+
        case CMD_STATUS:
                if (fd < 0 && ! open_cd ())
                        return (0);
@@ -739,6 +749,92 @@
                printf ("No volume level info available\n");
        }
        return(0);
+}
+
+/*
+ * dbprog_sum
+ *     Convert an integer to its text string representation, and
+ *     compute its checksum.  Used by dbprog_discid to derive the
+ *     disc ID.
+ *
+ * Args:
+ *     n - The integer value.
+ *
+ * Return:
+ *     The integer checksum.
+ */
+static int
+dbprog_sum(int n)
+{
+       char    buf[12],
+               *p;
+       int     ret = 0;
+
+       /* For backward compatibility this algorithm must not change */
+       sprintf(buf, "%u", n);
+       for (p = buf; *p != '\0'; p++)
+               ret += (*p - '0');
+
+       return(ret);
+}
+
+
+/*
+ * dbprog_discid
+ *     Compute a magic disc ID based on the number of tracks,
+ *     the length of each track, and a checksum of the string
+ *     that represents the offset of each track.
+ *
+ * Args:
+ *     s - Pointer to the curstat_t structure.
+ *
+ * Return:
+ *     The integer disc ID.
+ */
+static u_int
+dbprog_discid()
+{
+       struct  ioc_toc_header h;
+       int     rc;
+       int     i, ntr,
+               t = 0,
+               n = 0;
+
+       rc = ioctl (fd, CDIOREADTOCHEADER, &h);
+       if (rc < 0)
+               return 0;
+       ntr = h.ending_track - h.starting_track + 1;
+       i = msf;
+       msf = 1;
+       rc = read_toc_entrys ((ntr + 1) * sizeof (struct cd_toc_entry));
+       msf = i;
+       if (rc < 0)
+               return 0;
+       /* For backward compatibility this algorithm must not change */
+       for (i = 0; i < ntr; i++) {
+#define TC_MM(a) toc_buffer[a].addr.msf.minute
+#define TC_SS(a) toc_buffer[a].addr.msf.second
+               n += dbprog_sum((TC_MM(i) * 60) + TC_SS(i));
+
+               t += ((TC_MM(i+1) * 60) + TC_SS(i+1)) -
+                    ((TC_MM(i) * 60) + TC_SS(i));
+       }
+
+       return((n % 0xff) << 24 | t << 8 | ntr);
+}
+
+int cdid ()
+{
+       u_int   id;
+
+       id = dbprog_discid();
+       if (id)
+       {
+               if (verbose)
+                       printf ("CDID=");
+               printf ("%08x\n",id);
+       }
+       return id ? 0 : 1;
 }
 
 int info (char *arg)
--- cdcontrol.1.orig    Sun Aug 29 18:40:15 1999
+++ cdcontrol.1 Wed Oct  6 12:04:42 1999
@@ -129,6 +129,9 @@
 .It Cm info
 Print the table of contents.
 
+.It Cm cdid
+Print the xmcd's CD id.
+
 .It Cm status 
 .Op Ar audio | media | volume
 


--
Sergey Shkonda           <[EMAIL PROTECTED]>


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to