diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
| commit | ac5e55f5f2af5b92794c2aded46c6bae85b5f5ed (patch) | |
| tree | 9367490586c84cba28652e443e3166d66c33b0d9 /static/freebsd/man3/abs2rel.3 | |
| parent | 253e67c8b3a72b3a4757fdbc5845297628db0a4a (diff) | |
docs: Added All FreeBSD Manuals
Diffstat (limited to 'static/freebsd/man3/abs2rel.3')
| -rw-r--r-- | static/freebsd/man3/abs2rel.3 | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/static/freebsd/man3/abs2rel.3 b/static/freebsd/man3/abs2rel.3 new file mode 100644 index 00000000..d8e39ef3 --- /dev/null +++ b/static/freebsd/man3/abs2rel.3 @@ -0,0 +1,136 @@ +.\" +.\" Copyright (c) 1997 Shigio Yamaguchi. All rights reserved. +.\" Copyright (c) 1999 Tama Communications Corporation. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd December 13, 2025 +.Dt ABS2REL 3 +.Os +.Sh NAME +.Nm abs2rel +.Nd make a relative path name from an absolute path name +.Sh SYNOPSIS +.Lb libpathconv +.Ft "char *" +.Fn abs2rel "const char *path" "const char *base" "char *result" "size_t size" +.Sh DESCRIPTION +The +.Fn abs2rel +function makes a relative path name from an absolute path name +.Fa path +based on a directory +.Fa base +and copies the resulting path name into the memory referenced by +.Fa result . +The +.Fa result +argument must refer to a buffer capable of storing at least +.Fa size +characters. + +The resulting path name may include symbolic links. +The +.Fn abs2rel +function doesn't check whether or not any path exists. +.Sh "RETURN VALUES" +The +.Fn abs2rel +function returns relative path name on success. +If an error occurs, +it returns +.Dv NULL . +.Sh EXAMPLES + char result[MAXPATHLEN]; + char *path = abs2rel("/usr/src/sys", "/usr/local/lib", result, MAXPATHLEN); + +yields: + + path == "../../src/sys" + +Similarly, + + path1 = abs2rel("/usr/src/sys", "/usr", result, MAXPATHLEN); + path2 = abs2rel("/usr/src/sys", "/usr/src/sys", result, MAXPATHLEN); + +yields: + + path1 == "src/sys" + path2 == "." +.Sh ERRORS +The +.Fn abs2rel +function may fail and set the external variable +.Va errno +to indicate the error. +.Bl -tag -width Er +.It Bq Er EINVAL +The +.Fa base +directory isn't an absolute path name or the +.Fa size +argument is zero. +.It Bq Er ERANGE +The +.Fa size +argument is greater than zero but smaller than the length of the pathname plus 1. + +.El +.Sh SEE ALSO +.Xr rel2abs 3 +.Sh AUTHORS +.An Shigio Yamaguchi (shigio@tamacom.com) +.Sh BUGS +If the +.Fa base +directory includes symbolic links, +the +.Fn abs2rel +function produces the wrong path. +For example, if '/sys' is a symbolic link to '/usr/src/sys', + + char *path = abs2rel("/usr/local/lib", "/sys", result, MAXPATHLEN); + +yields: + + path == "../usr/local/lib" /* It's wrong!! */ + +You should convert the base directory into a real path in advance. +.Pp + + path = abs2rel("/sys/kern", realpath("/sys", resolvedname), result, MAXPATHLEN); + +yields: + + path == "../../../sys/kern" /* It's correct but ... */ + +That is correct, but a little redundant. +If you wish get the simple answer 'kern', do the following. + + path = abs2rel(realpath("/sys/kern", r1), realpath("/sys", r2), + result, MAXPATHLEN); + +The +.Fn realpath +function assures correct result, but don't forget that +.Fn realpath +requires that all but the last component of the path exist. |
