+
+void store_filename(char *buf, ident id)
+{
+ switch (id_kind(id)) {
+ case RAW:
+ sprintf(buf, "#<raw device>");
+ break;
+ case IFO:
+ if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.IFO");
+ else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.IFO", id_title(id));
+ break;
+ case BUP:
+ if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.BUP");
+ else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.BUP", id_title(id));
+ break;
+ case VOB:
+ if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.VOB");
+ else
+ sprintf(buf, "/VIDEO_TS/VTS_%02u_%u.VOB", id_title(id), id_part(id));
+ break;
+ default:
+ abort();
+ }
+}
+
+static char *copy_string(char *p, const char *q)
+{
+ while (*q) *p++ = *q++;
+ *p = 0; return (p);
+}
+
+static char *copy_hex(char *p, const unsigned char *q, size_t sz)
+{
+ while (sz) {
+ sprintf(p, "%02x", *q);
+ p += 2; q++; sz--;
+ }
+ return (p);
+}
+
+int dvd_id(char *p, dvd_reader_t *dvd, unsigned f, const char *file)
+{
+ char volid[33];
+ unsigned char volsetid[16], discid[16];
+ int rc;
+ size_t n;
+
+ rc = DVDUDFVolumeInfo(dvd,
+ volid, sizeof(volid),
+ volsetid, sizeof(volsetid));
+ if (!rc) {
+ p = copy_string(p, volid);
+ *p++ = '-';
+ for (n = sizeof(volsetid); n && !volsetid[n - 1]; n--);
+ p = copy_hex(p, volsetid, n);
+ } else if (f&DIF_MUSTVOLINF) {
+ if (file) moan("failed to read volume info for `%s'", file);
+ else moan("failed to read volume info");
+ return (-1);
+ } else
+ p = copy_string(p, "<error reading volume info>");
+
+ *p++ = ':';
+ rc = DVDDiscID(dvd, discid);
+ if (!rc)
+ p = copy_hex(p, discid, sizeof(discid));
+ else if (f&DIF_MUSTIFOHASH) {
+ if (file) moan("failed to determine disc id of `%s'", file);
+ else moan("failed to determine disc id");
+ return (-1);
+ } else
+ p = copy_string(p, "<error reading disc-id>");
+
+ return (0);
+}
+
+/*----- That's all, folks -------------------------------------------------*/