2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
2N/A/* All Rights Reserved */
2N/A
2N/A
2N/A#include <string.h>
2N/A
2N/A#define isdot(x) ((x[0] == '.') && (!x[1] || (x[1] == '/')))
2N/A#define isdotdot(x) ((x[0] == '.') && (x[1] == '.') && \
2N/A (!x[2] || (x[2] == '/')))
2N/A
2N/Avoid
2N/Acanonize(char *file)
2N/A{
2N/A char *pt, *last;
2N/A int level;
2N/A
2N/A /* remove references such as "./" and "../" and "//" */
2N/A for (pt = file; *pt; /* void */) {
2N/A if (isdot(pt))
2N/A (void) strcpy(pt, pt[1] ? pt+2 : pt+1);
2N/A else if (isdotdot(pt)) {
2N/A level = 0;
2N/A last = pt;
2N/A do {
2N/A level++;
2N/A last += 2;
2N/A if (*last)
2N/A last++;
2N/A } while (isdotdot(last));
2N/A --pt; /* point to previous '/' */
2N/A while (level--) {
2N/A if (pt <= file)
2N/A return;
2N/A while ((*--pt != '/') && (pt > file))
2N/A ;
2N/A }
2N/A if (*pt == '/')
2N/A pt++;
2N/A (void) strcpy(pt, last);
2N/A } else {
2N/A while (*pt && (*pt != '/'))
2N/A pt++;
2N/A if (*pt == '/') {
2N/A while (pt[1] == '/')
2N/A (void) strcpy(pt, pt+1);
2N/A pt++;
2N/A }
2N/A }
2N/A }
2N/A if ((--pt > file) && (*pt == '/'))
2N/A *pt = '\0';
2N/A}
2N/A
2N/Avoid
2N/Acanonize_slashes(char *file)
2N/A{
2N/A char *pt;
2N/A
2N/A /* remove references such as "//" */
2N/A for (pt = file; *pt; /* void */) {
2N/A while (*pt && (*pt != '/'))
2N/A pt++;
2N/A if (*pt == '/') {
2N/A while (pt[1] == '/')
2N/A (void) strcpy(pt, pt+1);
2N/A pt++;
2N/A }
2N/A }
2N/A if ((--pt > file) && (*pt == '/'))
2N/A *pt = '\0';
2N/A}