1 /* $NetBSD: getdiskrawname.c,v 1.5 2014/09/17 23:54:42 christos Exp $ */
4 * Copyright (c) 2012 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
31 #include <sys/cdefs.h>
32 __RCSID("$NetBSD: getdiskrawname.c,v 1.5 2014/09/17 23:54:42 christos Exp $");
44 resolve_link(char *buf
, size_t bufsiz
, const char *name
)
50 dlen
= readlink(name
, buf
, bufsiz
- 1);
57 dp
= strrchr(name
, '/');
60 if (nlen
+ 1 > bufsiz
)
62 if (nlen
+ dlen
+ 1 > bufsiz
)
65 memmove(buf
+ nlen
, buf
, (size_t)dlen
+ 1);
66 memcpy(buf
, name
, nlen
);
74 getdiskrawname(char *buf
, size_t bufsiz
, const char *name
)
80 if ((name
= resolve_link(dest
, sizeof(dest
), name
)) == NULL
) {
85 dp
= strrchr(name
, '/');
87 if (stat(name
, &st
) == -1)
90 if (!S_ISBLK(st
.st_mode
)) {
96 (void)snprintf(buf
, bufsiz
, "%.*s/r%s", (int)(dp
- name
), name
, dp
+ 1);
98 (void)snprintf(buf
, bufsiz
, "r%s", name
);
104 getdiskcookedname(char *buf
, size_t bufsiz
, const char *name
)
110 if ((name
= resolve_link(dest
, sizeof(dest
), name
)) == NULL
) {
115 dp
= strrchr(name
, '/');
117 if ((dp
!= NULL
&& dp
[1] != 'r') || (dp
== NULL
&& name
[0] != 'r')) {
122 if (stat(name
, &st
) == -1)
125 if (!S_ISCHR(st
.st_mode
)) {
131 (void)snprintf(buf
, bufsiz
, "%.*s/%s", (int)(dp
- name
), name
, dp
+ 2);
133 (void)snprintf(buf
, bufsiz
, "%s", name
+ 1);