da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cd [-LP] [dirname]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cd [-LP] [old] [new]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pwd [-LP]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * research!dgk
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stak.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <error.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "variables.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "path.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "name.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "builtins.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Invalidate path name bindings to relative paths
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void rehash(register Namval_t *np,void *data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pathcomp_t *pp = (Pathcomp_t*)np->nvalue.cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pp && *pp->name!='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_unset(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_cd(int argc, char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *dir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pathcomp_t *cdpath = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char *dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int saverrno=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int rval,flag=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *oldpwd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *opwdnod, *pwdnod;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_RESTRICTED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_restricted+4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((rval = optget(argv,sh_optcd))) switch(rval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'L':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'P':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argc -= opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = argv[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors>0 || argc >2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldpwd = (char*)shp->pwd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opwdnod = (shp->subshell?sh_assignok(OLDPWDNOD,1):OLDPWDNOD);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pwdnod = (shp->subshell?sh_assignok(PWDNOD,1):PWDNOD);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(argc==2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = sh_substitute(oldpwd,dir,argv[1]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(!dir || *dir==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = nv_getval(HOME);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(*dir == '-' && dir[1]==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = nv_getval(opwdnod);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!dir || *dir==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),argc==2?e_subst+4:e_direct);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dir != '/' && (dir[1]!=':'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dir != '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _WINIX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(cdpath = (Pathcomp_t*)shp->cdpathlist) && (dp=(CDPNOD)->nvalue.cp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cdpath=path_addpath((Pathcomp_t*)0,dp,PATH_CDPATH))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->cdpathlist = (void*)cdpath;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cdpath->shp = shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!oldpwd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldpwd = path_pwd(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dir=='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* test for pathname . ./ .. or ../ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(dp=dir+1) == '.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dp==0 || *dp=='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cdpath = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rval = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp = cdpath?cdpath->name:"";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cdpath = path_nextcomp(cdpath,dir,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*stakptr(PATH_OFFSET+1)==':' && isalpha(*stakptr(PATH_OFFSET)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *stakptr(PATH_OFFSET+1) = *stakptr(PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *stakptr(PATH_OFFSET)='/';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _WINIX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*stakptr(PATH_OFFSET)!='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *last=(char*)stakfreeze(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(oldpwd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* don't add '/' of oldpwd is / itself */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*oldpwd!='/' || oldpwd[1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc('/');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(last+PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(PATH_MAX+PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(cp = pathcanon(stakptr(PATH_OFFSET),PATH_DOTDOT)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* eliminate trailing '/' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(*--cp == '/' && cp>stakptr(PATH_OFFSET))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *cp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(cp=stakptr(PATH_OFFSET))=='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!pathcanon(cp,PATH_DOTDOT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((rval=chdir(path_relative(stakptr(PATH_OFFSET)))) >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto success;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(errno!=ENOENT && saverrno==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin saverrno=errno;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cdpath);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(rval<0 && *dir=='/' && *(path_relative(stakptr(PATH_OFFSET)))!='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rval = chdir(dir);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* use absolute chdir() if relative chdir() fails */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(rval<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(saverrno)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = saverrno;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),"%s:",dir);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsuccess:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(dir == nv_getval(opwdnod) || argc==2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp = dir; /* print out directory for cd - */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = stakptr(PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(dir=pathcanon(dir,PATH_PHYSICAL)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = stakptr(PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),"%s:",dir);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(dir-stakptr(0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = (char*)stakfreeze(1)+PATH_OFFSET;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dp && (*dp!='.'||dp[1]) && strchr(dir,'/'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,dir,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*dir != '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(opwdnod,oldpwd,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(oldpwd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(oldpwd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag = strlen(dir);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* delete trailing '/' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(--flag>0 && dir[flag]=='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir[flag] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(pwdnod,dir,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(pwdnod,NV_NOFREE|NV_EXPORT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->pwd = pwdnod->nvalue.cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_scan(shp->track_tree,rehash,(void*)0,NV_TAGGED,NV_TAGGED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_newdir(shp->pathlist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_newdir(shp->cdpathlist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_pwd(int argc, char *argv[],void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n, flag = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#if SHOPT_FS_3D
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner NOT_USED(extra);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(argc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((n = optget(argv,sh_optpwd))) switch(n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'L':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'P':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(cp = path_pwd(0)) != '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1), e_pwd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->lim.fs3d && (flag = mount(e_dot,NIL(char*),FS3D_GET|FS3D_VIEW,0))>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = (char*)stakseek(++flag+PATH_MAX);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mount(e_dot,cp,FS3D_GET|FS3D_VIEW|FS3D_SIZE(flag),0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = strcpy(stakseek(strlen(cp)+PATH_MAX),cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(cp,PATH_PHYSICAL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sfstdout,cp,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin