xref: /freebsd/lib/libpathconv/abs2rel.3 (revision 02e9120893770924227138ba49df1edb3896112a)
1.\"
2.\" Copyright (c) 1997 Shigio Yamaguchi. All rights reserved.
3.\" Copyright (c) 1999 Tama Communications Corporation. All rights reserved.
4.\"
5.\" Redistribution and use in source and binary forms, with or without
6.\" modification, are permitted provided that the following conditions
7.\" are met:
8.\" 1. Redistributions of source code must retain the above copyright
9.\"    notice, this list of conditions and the following disclaimer.
10.\" 2. Redistributions in binary form must reproduce the above copyright
11.\"    notice, this list of conditions and the following disclaimer in the
12.\"    documentation and/or other materials provided with the distribution.
13.\"
14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24.\" SUCH DAMAGE.
25.\"
26.Dd August 7, 2022
27.Dt ABS2REL 3
28.Os
29.Sh NAME
30.Nm abs2rel
31.Nd make a relative path name from an absolute path name
32.Sh SYNOPSIS
33.Ft "char *"
34.Fn abs2rel "const char *path" "const char *base" "char *result" "size_t size"
35.Sh DESCRIPTION
36The
37.Fn abs2rel
38function makes a relative path name from an absolute path name
39.Fa path
40based on a directory
41.Fa base
42and copies the resulting path name into the memory referenced by
43.Fa result .
44The
45.Fa result
46argument must refer to a buffer capable of storing at least
47.Fa size
48characters.
49
50The resulting path name may include symbolic links.
51The
52.Fn abs2rel
53function doesn't check whether or not any path exists.
54.Sh "RETURN VALUES"
55The
56.Fn abs2rel
57function returns relative path name on success.
58If an error occurs,
59it returns
60.Dv NULL .
61.Sh EXAMPLES
62    char result[MAXPATHLEN];
63    char *path = abs2rel("/usr/src/sys", "/usr/local/lib", result, MAXPATHLEN);
64
65yields:
66
67    path == "../../src/sys"
68
69Similarly,
70
71    path1 = abs2rel("/usr/src/sys", "/usr", result, MAXPATHLEN);
72    path2 = abs2rel("/usr/src/sys", "/usr/src/sys", result, MAXPATHLEN);
73
74yields:
75
76    path1 == "src/sys"
77    path2 == "."
78.Sh ERRORS
79The
80.Fn abs2rel
81function may fail and set the external variable
82.Va errno
83to indicate the error.
84.Bl -tag -width Er
85.It Bq Er EINVAL
86The
87.Fa base
88directory isn't an absolute path name or the
89.Fa size
90argument is zero.
91.It Bq Er ERANGE
92The
93.Fa size
94argument is greater than zero but smaller than the length of the pathname plus 1.
95
96.Sh SEE ALSO
97.Xr rel2abs 3
98.Sh AUTHORS
99.An Shigio Yamaguchi (shigio@tamacom.com)
100.Sh BUGS
101If the
102.Fa base
103directory includes symbolic links,
104the
105.Fn abs2rel
106function produces the wrong path.
107For example, if '/sys' is a symbolic link to '/usr/src/sys',
108
109    char *path = abs2rel("/usr/local/lib", "/sys", result, MAXPATHLEN);
110
111yields:
112
113    path == "../usr/local/lib"         /* It's wrong!! */
114
115You should convert the base directory into a real path in advance.
116.Pp
117
118    path = abs2rel("/sys/kern", realpath("/sys", resolvedname), result, MAXPATHLEN);
119
120yields:
121
122    path == "../../../sys/kern"        /* It's correct but ... */
123
124That is correct, but a little redundant.
125If you wish get the simple answer 'kern', do the following.
126
127    path = abs2rel(realpath("/sys/kern", r1), realpath("/sys", r2),
128								result, MAXPATHLEN);
129
130The
131.Fn realpath
132function assures correct result, but don't forget that
133.Fn realpath
134requires that all but the last component of the path exist.
135