/* Code to get discid for a cddb query. */ /* Based on code found in: To: code-review@azure.humbug.org.au Subject: CDDB database reader From: Byron Ellacott Date: Fri, 5 Jun 1998 17:32:40 +1000 */ /* Stripped net code, 'cause I only care about the discid */ #include #include #include #include #include #include #include #include #include #include /* #include */ #ifdef __NetBSD__ #include #include #endif struct toc { int min, sec, frame; } cdtoc[100]; static int sock; int read_toc(void) { int drive = open("/dev/cd0d", O_RDONLY | O_NONBLOCK); /* struct cdrom_tochdr tochdr; struct cdrom_tocentry tocentry; */ #ifdef __NetBSD__ struct ioc_toc_header tochdr; struct ioc_read_toc_entry tocentry; #endif int i; ioctl(drive, CDIOREADTOCHEADER, &tochdr); for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { tocentry.starting_track = i; tocentry.address_format = CD_MSF_FORMAT; tocentry.data_len = 1; ioctl(drive, CDIOREADTOCENTRYS, &tocentry); cdtoc[i-1].min = tocentry.data->addr.msf.minute; cdtoc[i-1].sec = tocentry.data->addr.msf.second; cdtoc[i-1].frame = tocentry.data->addr.msf.frame; cdtoc[i-1].frame += cdtoc[i-1].min*60*75; cdtoc[i-1].frame += cdtoc[i-1].sec*75; } tocentry.starting_track = 0xAA; tocentry.address_format = CD_MSF_FORMAT; tocentry.data_len = 1; ioctl(drive, CDIOREADTOCENTRYS, &tocentry); cdtoc[tochdr.starting_track].min = tocentry.data->addr.msf.minute; cdtoc[tochdr.starting_track].sec = tocentry.data->addr.msf.second; cdtoc[tochdr.starting_track].frame = tocentry.data->addr.msf.frame; cdtoc[tochdr.starting_track].frame += cdtoc[i-1].min*60*75; cdtoc[tochdr.starting_track].frame += cdtoc[i-1].sec*75; close(drive); return tochdr.starting_track; } unsigned int cddb_sum(int n) { unsigned int ret; ret = 0; while (n > 0) { ret += (n % 10); n /= 10; } return ret; } unsigned long cddb_discid(int tot_trks) { unsigned int i, t = 0, n = 0; i = 0; while (i < tot_trks) { n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec); i++; } t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) - ((cdtoc[0].min * 60) + cdtoc[0].sec); return ((n % 0xff) << 24 | t << 8 | tot_trks); } void main(void) { unsigned long discid; int tracks, i; tracks = read_toc(); discid = cddb_discid(tracks); printf("%08x %d", discid, tracks); for (i = 0; i < tracks; i++) printf(" %d", cdtoc[i].frame); printf(" %d\n", (cdtoc[tracks].frame-cdtoc[0].frame)/75); printf("\n"); exit(0); }