Index: head/lib/libpathconv/Makefile =================================================================== --- head/lib/libpathconv/Makefile (nonexistent) +++ head/lib/libpathconv/Makefile (revision 309035) @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=lib${LIB} +LIB= pathconv +SHLIB_MAJOR= 1 +MAN= rel2abs.3 abs2rel.3 +INCS= pathconv.h +SRCS= abs2rel.c rel2abs.c + + +#VERSION_DEF= ${.CURDIR}/../libc/Versions.def +#SYMBOL_MAPS= ${.CURDIR}/Symbol.map + +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + +.include Property changes on: head/lib/libpathconv/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/abs2rel.3 =================================================================== --- head/lib/libpathconv/abs2rel.3 (nonexistent) +++ head/lib/libpathconv/abs2rel.3 (revision 309035) @@ -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. +.\" +.\" $FreeBSD$ +.\" +.Dd Dec 15, 1997" +.Dt ABS2REL 3 +.Os +.Sh NAME +.Nm abs2rel +.Nd make a relative path name from an absolute path name +.Sh SYNOPSIS +.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 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. +.Sh EXAMPLE + 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 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. +.Sh "SEE ALSO" +.Xr rel2abs 3 +.Sh AUTHORS +Shigio Yamaguchi (shigio@tamacom.com) Property changes on: head/lib/libpathconv/abs2rel.3 ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/abs2rel.c =================================================================== --- head/lib/libpathconv/abs2rel.c (nonexistent) +++ head/lib/libpathconv/abs2rel.c (revision 309035) @@ -0,0 +1,111 @@ +/* + * 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. + * + * $FreeBSD$ + */ +#include +#include +#include +#include "pathconv.h" /* prototypes */ +/* + * abs2rel: convert an absolute path name into relative. + * + * i) path absolute path + * i) base base directory (must be absolute path) + * o) result result buffer + * i) size size of result buffer + * r) != NULL: relative path + * == NULL: error + */ +char * +abs2rel(const char *path, const char *base, char *result, const size_t size) +{ + const char *pp, *bp, *branch; + /* + * endp points the last position which is safe in the result buffer. + */ + const char *endp = result + size - 1; + char *rp; + + if (*path != '/') { + if (strlen(path) >= size) + goto erange; + strcpy(result, path); + goto finish; + } else if (*base != '/' || !size) { + errno = EINVAL; + return (NULL); + } else if (size == 1) + goto erange; + /* + * seek to branched point. + */ + branch = path; + for (pp = path, bp = base; *pp && *bp && *pp == *bp; pp++, bp++) + if (*pp == '/') + branch = pp; + if ((*pp == 0 || (*pp == '/' && *(pp + 1) == 0)) && + (*bp == 0 || (*bp == '/' && *(bp + 1) == 0))) { + rp = result; + *rp++ = '.'; + if (*pp == '/' || *(pp - 1) == '/') + *rp++ = '/'; + if (rp > endp) + goto erange; + *rp = 0; + goto finish; + } + if ((*pp == 0 && *bp == '/') || (*pp == '/' && *bp == 0)) + branch = pp; + /* + * up to root. + */ + rp = result; + for (bp = base + (branch - path); *bp; bp++) + if (*bp == '/' && *(bp + 1) != 0) { + if (rp + 3 > endp) + goto erange; + *rp++ = '.'; + *rp++ = '.'; + *rp++ = '/'; + } + if (rp > endp) + goto erange; + *rp = 0; + /* + * down to leaf. + */ + if (*branch) { + if (rp + strlen(branch + 1) > endp) + goto erange; + strcpy(rp, branch + 1); + } else + *--rp = 0; +finish: + return result; +erange: + errno = ERANGE; + return (NULL); +} Property changes on: head/lib/libpathconv/abs2rel.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/pathconv.h =================================================================== --- head/lib/libpathconv/pathconv.h (nonexistent) +++ head/lib/libpathconv/pathconv.h (revision 309035) @@ -0,0 +1,34 @@ +/* + * 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. + * + * $FreeBSD$ + */ +#ifndef _PATHCONV_H +#define _PATHCONV_H +char * rel2abs(const char *path, const char *base, char *result, const size_t size); +char * abs2rel(const char *path, const char *base, char *result, const size_t size); + +#endif /*_PATHCONV_H */ + Property changes on: head/lib/libpathconv/pathconv.h ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/rel2abs.3 =================================================================== --- head/lib/libpathconv/rel2abs.3 (nonexistent) +++ head/lib/libpathconv/rel2abs.3 (revision 309035) @@ -0,0 +1,98 @@ +.\" +.\" 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. +.\" +.\" $FreeBSD$ +.\" +.Dd Dec 3, 1997" +.Dt REL2ABS 3 +.Os +.Sh NAME +.Nm rel2abs +.Nd make an absolute path name from a relative path name +.Sh SYNOPSIS +.Ft "char *" +.Fn rel2abs "const char *path" "const char *base" "char *result" "size_t size" +.Sh DESCRIPTION +The +.Fn rel2abs +function makes an absolute path name from a relative 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 +character + +The resulting path name may include symbolic links. +.Fn abs2rel +doesn't check whether or not any path exists. +.Sh "RETURN VALUES" +The +.Fn rel2abs +function returns absolute path name on success. +If an error occurs, it returns +.Dv NULL . +.Sh ERRORS +The +.Fn rel2abs +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 +.Sh EXAMPLE + char result[MAXPATHLEN]; + char *path = rel2abs("../../src/sys", "/usr/local/lib", result, MAXPATHLEN); + +yields: + + path == "/usr/src/sys" + +Similarly, + + path1 = rel2abs("src/sys", "/usr", result, MAXPATHLEN); + path2 = rel2abs(".", "/usr/src/sys", result, MAXPATHLEN); + +yields: + + path1 == "/usr/src/sys" + path2 == "/usr/src/sys" +.Sh "SEE ALSO" +.Xr abs2rel 3 +.Sh AUTHORS +Shigio Yamaguchi (shigio@tamacom.com) Property changes on: head/lib/libpathconv/rel2abs.3 ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/rel2abs.c =================================================================== --- head/lib/libpathconv/rel2abs.c (nonexistent) +++ head/lib/libpathconv/rel2abs.c (revision 309035) @@ -0,0 +1,132 @@ +/* + * 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. + * + * $FreeBSD$ + */ +#include +#include +#include +#include "pathconv.h" /* prototypes */ +/* + * rel2abs: convert an relative path name into absolute. + * + * i) path relative path + * i) base base directory (must be absolute path) + * o) result result buffer + * i) size size of result buffer + * r) != NULL: absolute path + * == NULL: error + */ +char * +rel2abs(const char *path, const char *base, char *result, const size_t size) +{ + const char *pp, *bp; + /* + * endp points the last position which is safe in the result buffer. + */ + const char *endp = result + size - 1; + char *rp; + size_t length; + + if (*path == '/') { + if (strlen(path) >= size) + goto erange; + strcpy(result, path); + goto finish; + } else if (*base != '/' || !size) { + errno = EINVAL; + return (NULL); + } else if (size == 1) + goto erange; + + length = strlen(base); + + if (!strcmp(path, ".") || !strcmp(path, "./")) { + if (length >= size) + goto erange; + strcpy(result, base); + /* + * rp points the last char. + */ + rp = result + length - 1; + /* + * remove the last '/'. + */ + if (*rp == '/') { + if (length > 1) + *rp = 0; + } else + rp++; + /* rp point NULL char */ + if (*++path == '/') { + /* + * Append '/' to the tail of path name. + */ + *rp++ = '/'; + if (rp > endp) + goto erange; + *rp = 0; + } + goto finish; + } + bp = base + length; + if (*(bp - 1) == '/') + --bp; + /* + * up to root. + */ + for (pp = path; *pp && *pp == '.'; ) { + if (!strncmp(pp, "../", 3)) { + pp += 3; + while (bp > base && *--bp != '/') + ; + } else if (!strncmp(pp, "./", 2)) { + pp += 2; + } else if (!strncmp(pp, "..\0", 3)) { + pp += 2; + while (bp > base && *--bp != '/') + ; + } else + break; + } + /* + * down to leaf. + */ + length = bp - base; + if (length >= size) + goto erange; + strncpy(result, base, length); + rp = result + length; + if (*pp || *(pp - 1) == '/' || length == 0) + *rp++ = '/'; + if (rp + strlen(pp) > endp) + goto erange; + strcpy(rp, pp); +finish: + return result; +erange: + errno = ERANGE; + return (NULL); +} Property changes on: head/lib/libpathconv/rel2abs.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/tests/Makefile =================================================================== --- head/lib/libpathconv/tests/Makefile (nonexistent) +++ head/lib/libpathconv/tests/Makefile (revision 309035) @@ -0,0 +1,10 @@ +# $FreeBSD$ + +TAP_TESTS_C+= abs2rel +TAP_TESTS_C+= rel2abs + +#LIBADD+= pathconv +#LDADD+= -L .. -lpathconv +LDADD+= ../libpathconv.a + +.include Property changes on: head/lib/libpathconv/tests/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/tests/abs2rel.c =================================================================== --- head/lib/libpathconv/tests/abs2rel.c (nonexistent) +++ head/lib/libpathconv/tests/abs2rel.c (revision 309035) @@ -0,0 +1,60 @@ +/* + * 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. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include "../pathconv.h" + +int +main(int argc, char *argv[]) +{ + char result[MAXPATHLEN]; + char cwd[MAXPATHLEN]; + + if (argc < 2) { + fprintf(stderr, "usage: abs2rel path [base]\n"); + exit(1); + } + if (argc == 2) { + if (!getcwd(cwd, MAXPATHLEN)) { + fprintf(stderr, "cannot get current directory.\n"); + exit(1); + } + } else + strcpy(cwd, argv[2]); + + if (abs2rel(argv[1], cwd, result, MAXPATHLEN)) { + printf("%s\n", result); + } else + printf("ERROR\n"); + exit(0); +} Property changes on: head/lib/libpathconv/tests/abs2rel.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/tests/rel2abs.c =================================================================== --- head/lib/libpathconv/tests/rel2abs.c (nonexistent) +++ head/lib/libpathconv/tests/rel2abs.c (revision 309035) @@ -0,0 +1,59 @@ +/* + * 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. + * + * $FreeBSD$ + */ +#include +#include +#include +#include +#include +#include +#include "../pathconv.h" + +int +main(int argc, char *argv[]) +{ + char result[MAXPATHLEN]; + char cwd[MAXPATHLEN]; + + if (argc < 2) { + fprintf(stderr, "usage: rel2abs path [base]\n"); + exit(1); + } + if (argc == 2) { + if (!getcwd(cwd, MAXPATHLEN)) { + fprintf(stderr, "cannot get current directory.\n"); + exit(1); + } + } else + strcpy(cwd, argv[2]); + + if (rel2abs(argv[1], cwd, result, MAXPATHLEN)) { + printf("%s\n", result); + } else + printf("ERROR\n"); + exit(0); +} Property changes on: head/lib/libpathconv/tests/rel2abs.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/lib/libpathconv/tests/test.pl =================================================================== --- head/lib/libpathconv/tests/test.pl (nonexistent) +++ head/lib/libpathconv/tests/test.pl (revision 309035) @@ -0,0 +1,146 @@ +#!/usr/bin/perl +# +# 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. +# +# $FreeBSD$ +# + +# +# Test script for abs2rel(3) and rel2abs(3). +# +$logfile = 'err'; +# +# target base directory result +# -------------------------------------- +@abs2rel = ( + '. / .', + 'a/b/c / a/b/c', + 'a/b/c /a a/b/c', + '/a/b/c a ERROR', +); +@rel2abs = ( + '. / /', + './ / /', + '/a/b/c / /a/b/c', + '/a/b/c /a /a/b/c', + 'a/b/c a ERROR', + '.. /a /', + '../ /a /', + '../.. /a /', + '../../ /a /', + '../../.. /a /', + '../../../ /a /', + '../b /a /b', + '../b/ /a /b/', + '../../b /a /b', + '../../b/ /a /b/', + '../../../b /a /b', + '../../../b/ /a /b/', + '../b/c /a /b/c', + '../b/c/ /a /b/c/', + '../../b/c /a /b/c', + '../../b/c/ /a /b/c/', + '../../../b/c /a /b/c', + '../../../b/c/ /a /b/c/', +); +@common = ( + '/a/b/c /a/b/c .', + '/a/b/c /a/b/ c', + '/a/b/c /a/b c', + '/a/b/c /a/ b/c', + '/a/b/c /a b/c', + '/a/b/c / a/b/c', + '/a/b/c /a/b/c .', + '/a/b/c /a/b/c/ .', + '/a/b/c/ /a/b/c ./', + '/a/b/ /a/b/c ../', + '/a/b /a/b/c ..', + '/a/ /a/b/c ../../', + '/a /a/b/c ../..', + '/ /a/b/c ../../../', + '/a/b/c /a/b/z ../c', + '/a/b/c /a/y/z ../../b/c', + '/a/b/c /x/y/z ../../../a/b/c', +); +print "TEST start "; +open(LOG, ">$logfile") || die("cannot open log file '$logfile'.\n"); +$cnt = 0; +$progname = 'abs2rel'; +foreach (@abs2rel) { + @d = split; + chop($result = `./$progname $d[0] $d[1]`); + if ($d[2] eq $result) { + print '.'; + } else { + print 'X'; + print LOG "$progname $d[0] $d[1] -> $result (It should be '$d[2]')\n"; + $cnt++; + } +} +foreach (@common) { + @d = split; + chop($result = `./$progname $d[0] $d[1]`); + if ($d[2] eq $result) { + print '.'; + } else { + print 'X'; + print LOG "$progname $d[0] $d[1] -> $result (It should be '$d[2]')\n"; + $cnt++; + } +} +$progname = 'rel2abs'; +foreach (@rel2abs) { + @d = split; + chop($result = `./$progname $d[0] $d[1]`); + if ($d[2] eq $result) { + print '.'; + } else { + print 'X'; + print LOG "$progname $d[0] $d[1] -> $result (It should be '$d[2]')\n"; + $cnt++; + } +} +foreach (@common) { + @d = split; + chop($result = `./$progname $d[2] $d[1]`); + if ($d[0] eq $result) { + print '.'; + } else { + print 'X'; + print LOG "$progname $d[2] $d[1] -> $result (It should be '$d[0]')\n"; + $cnt++; + } +} +close(LOG); +if ($cnt == 0) { + print " COMPLETED.\n"; +} else { + print " $cnt errors detected.\n"; + open(LOG, $logfile) || die("log file not found.\n"); + while () { + print; + } + close(LOG); +} Property changes on: head/lib/libpathconv/tests/test.pl ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property