From owner-freebsd-hackers@FreeBSD.ORG Wed Jan 28 17:35:17 2009 Return-Path: Delivered-To: hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A41421065747 for ; Wed, 28 Jan 2009 17:35:17 +0000 (UTC) (envelope-from keramida@freebsd.org) Received: from igloo.linux.gr (igloo.linux.gr [62.1.205.36]) by mx1.freebsd.org (Postfix) with ESMTP id 0C3A98FC19 for ; Wed, 28 Jan 2009 17:35:16 +0000 (UTC) (envelope-from keramida@freebsd.org) Received: from kobe.laptop (adsl21-232.kln.forthnet.gr [77.49.148.232]) (authenticated bits=128) by igloo.linux.gr (8.14.3/8.14.3/Debian-5) with ESMTP id n0SHYxFh013896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 28 Jan 2009 19:35:04 +0200 Received: from kobe.laptop (kobe.laptop [127.0.0.1]) by kobe.laptop (8.14.3/8.14.3) with ESMTP id n0SHYwAe005992; Wed, 28 Jan 2009 19:34:59 +0200 (EET) (envelope-from keramida@freebsd.org) Received: (from keramida@localhost) by kobe.laptop (8.14.3/8.14.3/Submit) id n0SHYwMr005991; Wed, 28 Jan 2009 19:34:58 +0200 (EET) (envelope-from keramida@freebsd.org) From: Giorgos Keramidas To: "M. Warner Losh" References: <20090128.092046.84362525.imp@bsdimp.com> <87mydbiecp.fsf@kobe.laptop> <87d4e7e4y0.fsf@kobe.laptop> <20090128.101900.1355775961.imp@bsdimp.com> Date: Wed, 28 Jan 2009 19:34:58 +0200 In-Reply-To: <20090128.101900.1355775961.imp@bsdimp.com> (M. Warner Losh's message of "Wed, 28 Jan 2009 10:19:00 -0700 (MST)") Message-ID: <87zlhb49ml.fsf@kobe.laptop> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-MailScanner-ID: n0SHYxFh013896 X-Hellug-MailScanner: Found to be clean X-Hellug-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=-4.457, required 5, autolearn=not spam, ALL_TRUSTED -1.80, AWL -0.06, BAYES_00 -2.60) X-Hellug-MailScanner-From: keramida@freebsd.org X-Spam-Status: No Cc: hackers@freebsd.org Subject: Re: Code review request: cdcontrol status label additon X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Jan 2009 17:35:18 -0000 On Wed, 28 Jan 2009 10:19:00 -0700 (MST), "M. Warner Losh" wrote: > : lseek(3,0x8000,SEEK_SET) = 32768 (0x8000) > : read(3,0xbfbfe3a3,2048) ERR#5 'Input/output error' > > OK. That's definitely not page aligned. Slightly modified to force the alignment. Thanks for the tip about the address, which I failed to notice in truss output :) %%% diff -r 0c625c73ecc0 usr.sbin/cdcontrol/cdcontrol.1 --- a/usr.sbin/cdcontrol/cdcontrol.1 Wed Jan 28 18:38:39 2009 +0200 +++ b/usr.sbin/cdcontrol/cdcontrol.1 Wed Jan 28 19:34:15 2009 +0200 @@ -156,12 +156,14 @@ Play the right subtrack on both left and right channels. .It Ic info Print the table of contents. -.It Ic status Op Cm audio | media | volume +.It Ic status Op Cm audio | label | media | volume Print the information about the disc: .Pp .Bl -tag -width ".Cm volume" -compact .It Cm audio the current playing status and position +.It Cm label +the current ISO 9660 volume label, if present .It Cm media the current media catalog status .It Cm volume diff -r 0c625c73ecc0 usr.sbin/cdcontrol/cdcontrol.c --- a/usr.sbin/cdcontrol/cdcontrol.c Wed Jan 28 18:38:39 2009 +0200 +++ b/usr.sbin/cdcontrol/cdcontrol.c Wed Jan 28 19:34:15 2009 +0200 @@ -86,6 +86,7 @@ #define STATUS_AUDIO 0x1 #define STATUS_MEDIA 0x2 #define STATUS_VOLUME 0x4 +#define STATUS_LABEL 0x8 struct cmdtab { int command; @@ -801,6 +802,8 @@ what |= STATUS_MEDIA; else if (!strncasecmp(p, "volume", strlen(p))) what |= STATUS_VOLUME; + else if (!strncasecmp(p, "label", strlen(p))) + what |= STATUS_LABEL; else { warnx("invalid command arguments"); return 0; @@ -851,6 +854,32 @@ else printf ("No volume level info available\n"); } + if (what & STATUS_LABEL) { +#define ISO9660_MAGIC "\x01" "CD001" "\x01\x00" +#define ISO9660_OFFSET 0x8000 +#define VOLUME_LEN 32 +#define CD_SECTOR_LEN 2048 +#define LABEL_NAME_OFF 0x28 +#define LABEL_NAME_LEN 32 + uint32_t buffer[CD_SECTOR_LEN / sizeof(uint32_t)]; + char *sp, *ep; + + lseek(fd, ISO9660_OFFSET, SEEK_SET); + rc = read (fd, buffer, CD_SECTOR_LEN); + if (rc == CD_SECTOR_LEN && + memcmp(buffer, ISO9660_MAGIC, sizeof(ISO9660_MAGIC) - 1) == 0) { + sp = (void *)buffer + LABEL_NAME_OFF; + ep = sp + LABEL_NAME_LEN - 1; + while (*ep == ' ' && ep >= sp) + *ep-- = '\0'; + if (verbose) + printf("ISO 9660 Label is: %s\n", sp); + else + printf("%s\n", sp); + } + else + printf("No ISO 9660 label found\n"); + } return(0); } %%%