From nobody Fri Sep 11 05:04:23 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hh2X81BTDz6rbFG for ; Fri, 11 Sep 2026 05:04:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hh2X74Q32z4C9K for ; Fri, 11 Sep 2026 05:04:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789103063; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Uvu25u8PO+JzAB2JvWZO7d7aU5vA2wlfGWYV3y7/Oks=; b=qqrBpt4OWsoghpmnlhEzhlWe3jtry3Xx6ogHtu20MeLWsTtMQnqxBp11yAT8ZpOMxQcwPM dE+GWss+gb4ZXznwUwBQUsEmVHq/S0oXRIbFOViHom0WFJ+5SqChuTfN0cYUCnRijpcJXk K6qGj2AAl+/Tn3tRKzfuMQPsk4NTlQEuJe/I9FtFfxO8+Rv8JgAF1WsNSUmIseUFj+oHJC y0uIvhv5e0XRDy/5XVBgtx/67Z1PDW0esURca1Mx3p6VPV4+r+rq4c8+4uLT9amQhuXJtX weefc8DzeEUlogqCVUYaSfdVA2Kve1LOP2OJQZ4HmRkblwiXT4a0RVSAylYuKA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789103063; b=OrSetDwfAiajqKv2R7cXKVEq811tA/YMCSaCbqW0NUSZF+kveALrwUejQFXOgkafFZVHDe Zk1MnLocQR3vafILuWqbdoyCCYro+UJUIdcoCCfdpJL7uCkITmXIrjIyHIgykZzDfdvRDd /xgpsmVUunxe6NtIEkz9I6S9MhGSLy4rY0dV07k/G5sf44zXy3LHKP6LnCUBbo/zFoYgwl SAPSvc8RAvCKps9y+zi/c3Xj1qbeUuVBiAg9D0ghBe/WBdhuKVHP8aN1qVIGvqLnfe4yQH w2HTdoN7/QrEyT2X1LkyLgzznSVMDzYYovvOllknLlV93DMtB8xnP9suK6DQyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789103063; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Uvu25u8PO+JzAB2JvWZO7d7aU5vA2wlfGWYV3y7/Oks=; b=Rhf6Ek0/Ht2caNq4wptB4fla4Xzmn+TjvrEPMNNrki4ji5G7ewmSuM2GCrDOOzdBAkpNTZ pd0AKrGUr0nCgNyCdnvqHz4z1PxZ4suFhC2cze/WtD+UVcGYCjsgT4OLXd2acB2GU02UNr O06oG7y8WNHgFzUQ974BZYE6A50viJ6IbwHch7pmwuykis99oFyp0AKdegXBxDW6SlxFWe DeYWVkOimmYf0pq8rNvDbNgjvRtsreTQGqanQNReMhC66d9LeM7uJ68orOR6H81+I14T5b Mt7r0Qdiw8Kcc/EJg3gfjk7PcxyOmp+U6rLk7ZqrvxqGukpx5YMFTT5nd3UWBg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hh2X73W4pz10NP for ; Fri, 11 Sep 2026 05:04:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 39f76 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 11 Sep 2026 05:04:23 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 7208b3b845a6 - main - libsa: Add a generic URI-syntax devspec parser List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7208b3b845a6fca40099a4eab0d86afc2fb84aa7 Auto-Submitted: auto-generated Date: Fri, 11 Sep 2026 05:04:23 +0000 Message-Id: <6aa38bd7.39f76.36057f40@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=7208b3b845a6fca40099a4eab0d86afc2fb84aa7 commit 7208b3b845a6fca40099a4eab0d86afc2fb84aa7 Author: Warner Losh AuthorDate: 2026-09-11 04:13:37 +0000 Commit: Warner Losh CommitDate: 2026-09-11 04:15:28 +0000 libsa: Add a generic URI-syntax devspec parser Add parse_uri(), a helper for devices whose devspec can take a "[N]://host[:port][/path]" form in addition to the traditional "N:path" form. It returns EINVAL when devspec doesn't match that pattern, so a caller's own dv_parsedev can fall back to the traditional form. Un-static default_parsedev() so it can serve as that fallback. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D59422 --- stand/libsa/dev.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++- stand/libsa/stand.h | 2 ++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/stand/libsa/dev.c b/stand/libsa/dev.c index 1edc843d508c..fdaa9a84bcc1 100644 --- a/stand/libsa/dev.c +++ b/stand/libsa/dev.c @@ -64,7 +64,7 @@ devformat(struct devdesc *d) } /* NB: devspec points to the remainder of the device name after dv_name */ -static int +int default_parsedev(struct devdesc **dev, const char *devspec, const char **path) { @@ -102,6 +102,69 @@ fail: return (err); } +/* + * Helper for URI-syntax devices. NB: like default_parsedev(), devspec is + * the remainder after dv_name. Parses "[N]://host[:port][/path]"; EINVAL + * if devspec doesn't match that pattern. + */ +int +parse_uri(const char *devspec, int *unitp, char **hostp, int *portp, + const char **pathp) +{ + const char *cp, *p; + char *end; + int unit; + + cp = devspec; + unit = 0; + if (*cp != '\0' && *cp != ':') { + errno = 0; + unit = strtol(cp, &end, 0); + if (errno != 0 || end == cp) + return (EINVAL); + cp = end; + } + if (strncmp(cp, "://", 3) != 0) + return (EINVAL); + cp += 3; + + p = cp; + while (*p != '\0' && *p != '/' && *p != ':') + p++; + if (p == cp) + return (EINVAL); /* empty host */ + + *hostp = malloc(p - cp + 1); + if (*hostp == NULL) + return (ENOMEM); + memcpy(*hostp, cp, p - cp); + (*hostp)[p - cp] = '\0'; + + *portp = 0; + if (*p == ':') { + p++; + errno = 0; + *portp = strtol(p, &end, 10); + if (errno != 0 || end == p) { + free(*hostp); + *hostp = NULL; + return (EINVAL); + } + p = end; + } + + if (*p != '\0' && *p != '/') { + free(*hostp); + *hostp = NULL; + return (EINVAL); + } + + *unitp = unit; + if (pathp != NULL) + *pathp = p; + return (0); +} + /* NB: devspec points to the whole device spec, and possible trailing path */ int devparse(struct devdesc **dev, const char *devspec, const char **path) diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h index 6e363b145595..b024247fcafb 100644 --- a/stand/libsa/stand.h +++ b/stand/libsa/stand.h @@ -196,6 +196,8 @@ struct devdesc { char *devformat(struct devdesc *d); int devparse(struct devdesc **, const char *, const char **); +int default_parsedev(struct devdesc **, const char *, const char **); +int parse_uri(const char *, int *, char **, int *, const char **); int devinit(void); void dev_cleanup(void);