From owner-svn-src-user@FreeBSD.ORG Wed Jun 27 11:34:57 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 3B6EF106566C; Wed, 27 Jun 2012 11:34:57 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0C5C98FC16; Wed, 27 Jun 2012 11:34:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q5RBYutw007905; Wed, 27 Jun 2012 11:34:56 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5RBYuIx007902; Wed, 27 Jun 2012 11:34:56 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201206271134.q5RBYuIx007902@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Wed, 27 Jun 2012 11:34:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r237641 - user/ae/bootcode/sys/boot/common X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Jun 2012 11:34:57 -0000 Author: ae Date: Wed Jun 27 11:34:56 2012 New Revision: 237641 URL: http://svn.freebsd.org/changeset/base/237641 Log: Add disk_parsedev() function. Modified: user/ae/bootcode/sys/boot/common/disk.c user/ae/bootcode/sys/boot/common/disk.h Modified: user/ae/bootcode/sys/boot/common/disk.c ============================================================================== --- user/ae/bootcode/sys/boot/common/disk.c Wed Jun 27 11:08:03 2012 (r237640) +++ user/ae/bootcode/sys/boot/common/disk.c Wed Jun 27 11:34:56 2012 (r237641) @@ -242,3 +242,55 @@ disk_fmtdev(struct disk_devdesc *dev) strcat(cp, ":"); return (buf); } + +int +disk_parsedev(struct disk_devdesc *dev, const char *devspec, const char **path) +{ + int unit, slice, partition; + const char *np; + char *cp; + + np = devspec; + unit = slice = partition = -1; + if (*np != '\0' && *np != ':') { + unit = strtol(np, &cp, 10); + if (cp == np) + return (EUNIT); +#ifdef LOADER_GPT_SUPPORT + if (*cp == 'p') { + np = cp + 1; + slice = strtol(np, &cp, 10); + if (np == cp) + return (ESLICE); + /* we don't support nested partitions on GPT */ + if (*cp != '\0' && *cp != ':') + return (EINVAL); + partition = 255; + } else +#endif +#ifdef LOADER_MBR_SUPPORT + if (*cp == 's') { + np = cp + 1; + slice = strtol(np, &cp, 10); + if (np == cp) + return (ESLICE); + } +#endif + if (*cp != '\0' && *cp != ':') { + partition = *cp - 'a'; + if (partition < 0) + return (EPART); + cp++; + } + } else + return (EINVAL); + + if (*cp != '\0' && *cp != ':') + return (EINVAL); + dev->d_unit = unit; + dev->d_slice = slice; + dev->d_partition = partition; + if (path != NULL) + *path = (*cp == '\0') ? cp: cp + 1; + return (0); +} Modified: user/ae/bootcode/sys/boot/common/disk.h ============================================================================== --- user/ae/bootcode/sys/boot/common/disk.h Wed Jun 27 11:08:03 2012 (r237640) +++ user/ae/bootcode/sys/boot/common/disk.h Wed Jun 27 11:34:56 2012 (r237641) @@ -100,4 +100,6 @@ extern int disk_close(struct disk_devdes */ extern void disk_print(struct disk_devdesc *dev, char *prefix, int verbose); extern char* disk_fmtdev(struct disk_devdesc *dev); +extern int disk_parsedev(struct disk_devdesc *dev, const char *devspec, + const char **path);