10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER START
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The contents of this file are subject to the terms of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Common Development and Distribution License (the "License").
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You may not use this file except in compliance with the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or http://www.opensolaris.org/os/licensing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See the License for the specific language governing permissions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and limitations under the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * When distributing Covered Code, include this CDDL HEADER in each
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER END
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <stdlib.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <string.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <vroot/vroot.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <vroot/args.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <string.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/param.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/file.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe short init;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pathpt vector;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe const char *env_var;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} vroot_patht;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_patht vroot;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_patht path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char full_path[MAXPATHLEN+1];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *vroot_start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *path_start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *filename_start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int scan_vroot_first;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int cpp_style_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} vroot_datat, *vroot_datapt;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic vroot_datat vroot_data= {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe { 0, NULL, "VIRTUAL_ROOT"},
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe { 0, NULL, "PATH"},
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "", NULL, NULL, NULL, 0, 1};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_dir_to_path(const char *path, register pathpt *pointer, register int position)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int size= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register char *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register pathcellpt p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pathpt new_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*pointer != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (p= &((*pointer)[0]); p->path != NULL; p++, size++);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (position < 0)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe position= size;}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (position < 0)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe position= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (position >= size) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_path= (pathpt)calloc((unsigned)(position+2), sizeof(pathcellt));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*pointer != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe memcpy((char *)new_path,(char *)(*pointer), size*sizeof(pathcellt));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free((char *)(*pointer));};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *pointer= new_path;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length= strlen(path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name= (char *)malloc((unsigned)(length+1));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(name, path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*pointer)[position].path != NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free((*pointer)[position].path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*pointer)[position].path= name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*pointer)[position].length= length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowepathpt
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweparse_path_string(register char *string, register int remove_slash)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register char *p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pathpt result= NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (string != NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; 1; string= p+1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p= strchr(string, ':')) *p= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((remove_slash == 1) && !strcmp(string, "/"))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe add_dir_to_path("", &result, -1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe add_dir_to_path(string, &result, -1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p) *p= ':';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else return(result);};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return((pathpt)NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweconst char *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweget_vroot_name(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return(vroot_data.vroot.env_var);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweconst char *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweget_path_name(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return(vroot_data.path.env_var);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweflush_path_cache(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.path.init= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweflush_vroot_cache(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.vroot.init= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowescan_path_first(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.scan_vroot_first= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowescan_vroot_first(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.scan_vroot_first= 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweset_path_style(int style)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.cpp_style_path= style;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowechar *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweget_vroot_path(register char **vroot, register char **path, register char **filename)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*vroot= vroot_data.vroot_start) == NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*vroot= vroot_data.path_start) == NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *vroot= vroot_data.filename_start;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (path != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*path= vroot_data.path_start) == NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *path= vroot_data.filename_start;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (filename != NULL)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *filename= vroot_data.filename_start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return(vroot_data.full_path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetranslate_with_thunk(register char *filename, int (*thunk) (char *), pathpt path_vector, pathpt vroot_vector, rwt rw)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register pathcellt *vp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pathcellt *pp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register pathcellt *pp1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register char *p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int flags[256];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* Setup path to use */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rw == rw_write)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pp1= NULL; /* Do not use path when writing */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (path_vector == VROOT_DEFAULT) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!vroot_data.path.init) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.path.init= 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.path.vector= parse_path_string(getenv(vroot_data.path.env_var), 0);};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe path_vector= vroot_data.path.vector;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pp1= path_vector == NULL ? NULL : &(path_vector)[0];};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* Setup vroot to use */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_vector == VROOT_DEFAULT) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!vroot_data.vroot.init) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.vroot.init= 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.vroot.vector= parse_path_string(getenv(vroot_data.vroot.env_var), 1);};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_vector= vroot_data.vroot.vector;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vp= vroot_vector == NULL ? NULL : &(vroot_vector)[0];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* Setup to remember pieces */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.vroot_start= NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.path_start= NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.filename_start= NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int flen = strlen(filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(flen >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch ((vp ?1:0) + (pp1 ? 2:0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 0: /* No path. No vroot. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe use_name:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.full_path, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vroot_data.filename_start= vroot_data.full_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)(*thunk)(vroot_data.full_path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 1: /* No path. Vroot */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (filename[0] != '/') goto use_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; vp->path != NULL; vp++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if((1 + flen + vp->length) >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p= vroot_data.full_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.vroot_start= p, vp->path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p+= vp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.filename_start= p, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*thunk)(vroot_data.full_path)) return;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.full_path, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 2: /* Path. No vroot. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_data.cpp_style_path) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (filename[0] == '/') goto use_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (strchr(filename, '/') != NULL) goto use_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; pp1->path != NULL; pp1++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p= vroot_data.full_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if((1 + flen + pp1->length) >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_data.cpp_style_path) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p, pp1->path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p+= pp1->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pp1->length != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pp1->path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p+= pp1->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.filename_start= p, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*thunk)(vroot_data.full_path)) return;};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.full_path, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 3: { /* Path. Vroot. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int *rel_path, path_len= 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_data.scan_vroot_first == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (pp= pp1; pp->path != NULL; pp++) path_len++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rel_path= flags;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (path_len-= 2; path_len >= 0; path_len--) rel_path[path_len]= 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; vp->path != NULL; vp++)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (pp= pp1, path_len= 0; pp->path != NULL; pp++, path_len++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rel_path[path_len] == 1) continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pp->path[0] != '/') rel_path[path_len]= 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p= vroot_data.full_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((filename[0] == '/') || (pp->path[0] == '/')) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(vp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.vroot_start= p, vp->path); p+= vp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += vp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_data.cpp_style_path) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (filename[0] != '/') {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(1 + len + pp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p, pp->path); p+= pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += 1 + pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (strchr(filename, '/') == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pp->length != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(1 + len + pp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pp->path);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p+= pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += 1 + pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.filename_start= p, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*thunk)(vroot_data.full_path)) return;};}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe else { pathcellt *vp1= vp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (pp= pp1, path_len= 0; pp->path != NULL; pp++, path_len++)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (vp= vp1; vp->path != NULL; vp++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p= vroot_data.full_path;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((filename[0] == '/') || (pp->path[0] == '/')) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(vp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.vroot_start= p, vp->path); p+= vp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += vp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vroot_data.cpp_style_path) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (filename[0] != '/') {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(1 + len + pp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p, pp->path); p+= pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += 1 + pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (strchr(filename, '/') == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(1 + len + pp->length >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errno = ENAMETOOLONG;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.path_start= p, pp->path); p+= pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++= '/';
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len += 1 + pp->length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.filename_start= p, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*thunk)(vroot_data.full_path)) return;};};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void)strcpy(vroot_data.full_path, filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;};};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}