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 *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Shell initialization
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stak.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ccode.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <pwd.h>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <tmx.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "variables.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "path.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "fault.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "name.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "edit.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "jobs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "io.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "shlex.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "builtins.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/time"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/dynamic"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "FEATURE/externs"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "lexstates.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "version.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinchar e_version[] = "\n@(#)$Id: Version "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_AUDIT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ATTRS 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "A"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_BASH
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ATTRS 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "B"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if SHOPT_BGX
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define ATTRS 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "J"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_ACCT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ATTRS 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "L"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ATTRS 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "M"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_PFSH && _hdr_exec_attr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ATTRS 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "P"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if SHOPT_REGRESS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define ATTRS 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "R"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if ATTRS
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin " "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SH_RELEASE " $\0\n";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_BASH
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin extern void bash_init(Shell_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RANDMASK 0x7fff
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifndef ARG_MAX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define ARG_MAX (1*1024*1024)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifndef CHILD_MAX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define CHILD_MAX (1*1024)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef CLK_TCK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define CLK_TCK 60
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* CLK_TCK */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef environ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char **environ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef getconf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define getconf(x) strtol(astconf(x,NiL,NiL),NiL,0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct seconds
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namfun_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shell_t *sh;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct rand
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namfun_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int32_t rand_last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct ifs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namfun_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *ifsnp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct match
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namfun_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *rval;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int vsize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int nmatch;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int lastsub;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int match[2*(MATCH_MAX+1)];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _init_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shell_t *sh;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namfun_t VPATH_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ifs IFS_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t PATH_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t FPATH_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t CDPATH_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t SHELL_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t ENV_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t VISUAL_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t EDITOR_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t HISTFILE_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t HISTSIZE_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t OPTINDEX_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct seconds SECONDS_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct rand RAND_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LINENO_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t L_ARG_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t SH_VERSION_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct match SH_MATCH_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LC_TYPE_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LC_NUM_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LC_COLL_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LC_MSG_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LC_ALL_init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t LANG_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_locale */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Init_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int nbltins;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void env_init(Shell_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Init_t *nv_init(Shell_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Dt_t *inittree(Shell_t*,const struct shtable2*);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic int shlvl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EXE "?(.exe)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EXE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int rand_shift;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Invalidate all path name bindings
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void rehash(register Namval_t *np,void *data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(data);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(np,NV_NOALIAS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * out of memory routine for stak routines
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char *nospace(int unused)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(unused);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(3),e_nospace);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(NIL(char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Trap for VISUAL and EDITOR variables */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_ed(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char *cp, *name=nv_name(np);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register int newopt=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(*name=='E' && nv_getval(sh_scoped(shp,VISINOD)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(cp=val) && (*name=='E' || !(cp=nv_getval(sh_scoped(shp,EDITNOD)))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* turn on vi or emacs option if editor name is either*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = path_basename(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strmatch(cp,"*[Vv][Ii]*"))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz newopt=SH_VI;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(strmatch(cp,"*gmacs*"))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz newopt=SH_GMACS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(strmatch(cp,"*macs*"))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz newopt=SH_EMACS;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(newopt)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_offoption(SH_VI);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_offoption(SH_EMACS);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_offoption(SH_GMACS);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_onoption(newopt);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* Trap for HISTFILE and HISTSIZE variables */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_history(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin void *histopen = shp->hist_ptr;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char *cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val && histopen)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(np==HISTFILE && (cp=nv_getval(np)) && strcmp(val,cp)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(np==HISTSIZE && sh_arith(val)==nv_getnum(HISTSIZE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin hist_close(shp->hist_ptr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np, val, flags, fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(histopen)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_histinit(shp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin hist_close(histopen);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Trap for OPTINDEX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_optindex(Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.opterror = shp->st.optchar = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np,fp,NV_POP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfdouble_t nget_optindex(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((Sfdouble_t)*np->nvalue.lp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namfun_t *clone_optindex(Namval_t* np, Namval_t *mp, int flags, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *dp = (Namfun_t*)malloc(sizeof(Namfun_t));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)dp,(void*)fp,sizeof(Namfun_t));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.lp = np->nvalue.lp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->nofree = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(dp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Trap for restricted variables FPATH, PATH, SHELL, ENV */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_restricted(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int path_scoped = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pathcomp_t *pp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *name = nv_name(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(flags&NV_RDONLY) && sh_isoption(SH_RESTRICTED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_restricted,nv_name(np));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(np==PATHNOD || (path_scoped=(strcmp(name,PATHNOD->nvname)==0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_scan(shp->track_tree,rehash,(void*)0,NV_TAGGED,NV_TAGGED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(path_scoped && !val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = PATHNOD->nvalue.cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val && !(flags&NV_RDONLY) && np->nvalue.cp && strcmp(val,np->nvalue.cp)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np==FPATHNOD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->pathlist = (void*)path_unsetfpath((Pathcomp_t*)shp->pathlist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->universe = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->pathlist)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = np->nvalue.cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(np==PATHNOD || path_scoped)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp = (void*)path_addpath((Pathcomp_t*)shp->pathlist,val,PATH_PATH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(val && np==FPATHNOD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp = (void*)path_addpath((Pathcomp_t*)shp->pathlist,val,PATH_FPATH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->pathlist = (void*)pp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp->shp = shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val && (flags&NV_NOSCOPE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *mp = dtsearch(shp->var_tree,np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp && (val=nv_getval(mp)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(mp,val,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsfprintf(sfstderr,"%d: name=%s val=%s\n",getpid(),name,val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpath_dump((Pathcomp_t*)shp->pathlist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_cdpath(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Pathcomp_t *pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!shp->cdpathlist)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = np->nvalue.cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp = (void*)path_addpath((Pathcomp_t*)shp->cdpathlist,val,PATH_CDPATH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->cdpathlist = (void*)pp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp->shp = shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This function needs to be modified to handle international
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * error message translations
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if ERROR_VERSION >= 20000101L
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char* msg_translate(const char* catalog, const char* message)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(catalog);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((char*)message);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char* msg_translate(const char* message, int type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(type);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((char*)message);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /* Trap for LC_ALL, LC_CTYPE, LC_MESSAGES, LC_COLLATE and LANG */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void put_lang(Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int type;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *name = nv_name(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name==(LCALLNOD)->nvname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = LC_ALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(name==(LCTYPENOD)->nvname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = LC_CTYPE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(name==(LCMSGNOD)->nvname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = LC_MESSAGES;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(name==(LCCOLLNOD)->nvname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = LC_COLLATE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(name==(LCNUMNOD)->nvname)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = LC_NUMERIC;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#ifdef LC_LANG
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if(name==(LANGNOD)->nvname)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz type = LC_LANG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define LC_LANG LC_ALL
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if(name==(LANGNOD)->nvname && (!(cp=nv_getval(LCALLNOD)) || !*cp))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz type = LC_LANG;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type= -1;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(!sh_isstate(SH_INIT) && (type>=0 || type==LC_ALL || type==LC_LANG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner struct lconv* lc;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner char* r;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#ifdef AST_LC_setenv
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner ast.locale.set |= AST_LC_setenv;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#endif
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner r = setlocale(type,val?val:"");
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#ifdef AST_LC_setenv
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner ast.locale.set ^= AST_LC_setenv;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#endif
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(!r && val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!sh_isstate(SH_INIT) || shp->login_sh==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,0,e_badlocale,val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner shp->decomma = (lc=localeconv()) && lc->decimal_point && *lc->decimal_point==',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner nv_putv(np, val, flags, fp);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(CC_NATIVE!=CC_ASCII && (type==LC_ALL || type==LC_LANG || type==LC_CTYPE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_lexstates[ST_BEGIN]!=sh_lexrstates[ST_BEGIN])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((void*)sh_lexstates[ST_BEGIN]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ast.locale.set&(1<<AST_LC_CTYPE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *state[4];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_BEGIN] = state[0] = (char*)malloc(4*(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(state[0],sh_lexrstates[ST_BEGIN],(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_NAME] = state[1] = state[0] + (1<<CHAR_BIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(state[1],sh_lexrstates[ST_NAME],(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_DOL] = state[2] = state[1] + (1<<CHAR_BIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(state[2],sh_lexrstates[ST_DOL],(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_BRACE] = state[3] = state[2] + (1<<CHAR_BIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(state[3],sh_lexrstates[ST_BRACE],(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(c=0; c<(1<<CHAR_BIT); c++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(state[0][c]!=S_REG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(state[2][c]!=S_ERR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isblank(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[0][c]=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[1][c]=S_BREAK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[2][c]=S_BREAK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!isalpha(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[0][c]=S_NAME;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(state[1][c]==S_REG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[1][c]=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[2][c]=S_ALP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(state[3][c]==S_ERR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state[3][c]=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_BEGIN]=(char*)sh_lexrstates[ST_BEGIN];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_NAME]=(char*)sh_lexrstates[ST_NAME];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_DOL]=(char*)sh_lexrstates[ST_DOL];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[ST_BRACE]=(char*)sh_lexrstates[ST_BRACE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if ERROR_VERSION < 20000101L
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(type==LC_ALL || type==LC_MESSAGES)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.translate = msg_translate;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_locale */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Trap for IFS assignment and invalidates state table */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_ifs(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ifs *ip = (struct ifs*)fp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Shell_t *shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->ifsnp = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!val)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fp = nv_stack(np, NIL(Namfun_t*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(fp && !fp->nofree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free((void*)fp);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val != np->nvalue.cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!val && !(flags&NV_CLONE) && (fp=np->nvfun) && !fp->disc && (shp=(Shell_t*)(fp->last)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_stack(np,&((Init_t*)shp->init_context)->IFS_init.hdr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This is the lookup function for IFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * It keeps the sh.ifstable up to date
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_ifs(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ifs *ip = (struct ifs*)fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp, *value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c,n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value = nv_getv(np,fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(np!=ip->ifsnp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->ifsnp = np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset(shp->ifstable,0,(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp=value)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(n=mbsize(cp),c= *(unsigned char*)cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(c= *(unsigned char*)cp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n>1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp += (n-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable[c] = S_MBYTE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = S_DELIM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c== *cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(c=='\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(isspace(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = S_SPACE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable[c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable[' '] = shp->ifstable['\t'] = S_SPACE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable['\n'] = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * these functions are used to get and set the SECONDS variable
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef timeofday
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define dtime(tp) ((double)((tp)->tv_sec)+1e-6*((double)((tp)->tv_usec)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define tms timeval
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define dtime(tp) (((double)times(tp))/sh.lim.clk_tck)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define timeofday(a)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_seconds(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double d;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct tms tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fp = nv_stack(np, NIL(Namfun_t*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(fp && !fp->nofree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free((void*)fp);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_putv(np, val, flags, fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!np->nvalue.dp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_setsize(np,3);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np,NV_DOUBLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvalue.dp = new_of(double,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np, val, flags, fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = *np->nvalue.dp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeofday(&tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *np->nvalue.dp = dtime(&tp)-d;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_seconds(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int places = nv_size(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct tms tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double d, offset = (np->nvalue.dp?*np->nvalue.dp:0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeofday(&tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = dtime(&tp)- offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(shp->strbuf,"%.*f",places,d);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(sfstruse(shp->strbuf));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfdouble_t nget_seconds(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct tms tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double offset = (np->nvalue.dp?*np->nvalue.dp:0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeofday(&tp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(dtime(&tp)- offset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * These three functions are used to get and set the RANDOM variable
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_rand(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct rand *rp = (struct rand*)fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fp = nv_stack(np, NIL(Namfun_t*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(fp && !fp->nofree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free((void*)fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_unset(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&NV_INTEGER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = *(double*)val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = sh_arith(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin srand((int)(n&RANDMASK));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp->rand_last = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!np->nvalue.lp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvalue.lp = &rp->rand_last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * get random number in range of 0 - 2**15
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * never pick same number twice in a row
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfdouble_t nget_rand(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long cur, last= *np->nvalue.lp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = (rand()>>rand_shift)&RANDMASK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cur==last);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *np->nvalue.lp = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((Sfdouble_t)cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_rand(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long n = nget_rand(np,fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(fmtbase(n, 10, 0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * These three routines are for LINENO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfdouble_t nget_lineno(Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double d=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.line >0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = error_info.line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(error_info.context && error_info.context->line>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = error_info.context->line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(d);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_lineno(Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fp = nv_stack(np, NIL(Namfun_t*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(fp && !fp->nofree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free((void*)fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_unset(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&NV_INTEGER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = *(double*)val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = sh_arith(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.firstline += nget_lineno(np,fp)+1-n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_lineno(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long n = nget_lineno(np,fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(fmtbase(n, 10, 0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_lastarg(Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Shell_t *shp = nv_shell(np);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char *cp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int pid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(sh_isstate(SH_INIT) && (cp=shp->lastarg) && *cp=='*' && (pid=strtol(cp+1,&cp,10)) && *cp=='*')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_putval(np,(pid==getppid()?cp+1:0),0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(shp->lastarg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void put_lastarg(Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = nv_shell(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&NV_INTEGER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(shp->strbuf,"%.*g",12,*((double*)val));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin val = sfstruse(shp->strbuf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(val)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz val = strdup(val);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lastarg && !nv_isattr(np,NV_NOFREE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)shp->lastarg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_offattr(np,NV_NOFREE);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->lastarg = (char*)val;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_offattr(np,NV_EXPORT);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz np->nvenv = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int hasgetdisc(register Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(fp && !fp->disc->getnum && !fp->disc->getval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = fp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(fp!=0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * store the most recent value for use in .sh.match
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid sh_setmatch(const char *v, int vsize, int nmatch, int match[])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct match *mp = (struct match*)(SH_MATCHNOD->nvfun);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i,n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp->nmatch = nmatch)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(mp->match,match,nmatch*2*sizeof(match[0]));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n=match[0],i=1; i < 2*nmatch; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp->match[i] < n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = mp->match[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(vsize=0,i=0; i < 2*nmatch; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((mp->match[i] -= n) > vsize)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vsize = mp->match[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v += n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vsize >= mp->vsize)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp->vsize)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->val = (char*)realloc(mp->val,vsize+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->val = (char*)malloc(vsize+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->vsize = vsize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(mp->val,v,vsize);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->val[vsize] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(SH_MATCHNOD, NIL(char*), (nmatch-1)|ARRAY_FILL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->lastsub = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define array_scan(np) ((nv_arrayptr(np)->nelem&ARRAY_SCAN))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* get_match(register Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct match *mp = (struct match*)fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sub,n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sub = nv_aindex(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sub>=mp->nmatch)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sub==mp->lastsub)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(mp->rval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp->rval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((void*)mp->rval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->rval = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = mp->match[2*sub+1]-mp->match[2*sub];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n<=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return("");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = mp->val+mp->match[2*sub];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mp->val[mp->match[2*sub+1]]==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->rval = (char*)malloc(n+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->lastsub = sub;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(mp->rval,val,n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->rval[n] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(mp->rval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t SH_MATCH_disc = { sizeof(struct match), 0, get_match };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char* get_version(register Namval_t* np, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nv_getv(np,fp));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Sfdouble_t nget_version(register Namval_t* np, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char *cp = e_version + strlen(e_version)-10;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Sflong_t t = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NOT_USED(fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (c = *cp++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (c >= '0' && c <= '9')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t *= 10;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t += c - '0';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return((Sfdouble_t)t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t SH_VERSION_disc = { 0, 0, get_version, nget_version };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set or unset the mappings given a colon separated list of directories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void vpath_set(char *str, int mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *lastp, *oldp=str, *newp=strchr(oldp,':');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh.lim.fs3d)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(newp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *newp++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(lastp=strchr(newp,':'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *lastp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mount((mode?newp:""),oldp,FS3D_VIEW,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin newp[-1] = ':';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oldp = newp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin newp=lastp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* catch vpath assignments */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void put_vpath(register Namval_t* np,const char *val,int flags,Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp = nv_getval(np))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vpath_set(cp,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vpath_set((char*)val,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putv(np,val,flags,fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static const Namdisc_t VPATH_disc = { 0, put_vpath };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static Namfun_t VPATH_init = { &VPATH_disc, 1 };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Namdisc_t IFS_disc = { sizeof(struct ifs), put_ifs, get_ifs };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinconst Namdisc_t RESTRICTED_disc = { sizeof(Namfun_t), put_restricted };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t CDPATH_disc = { sizeof(Namfun_t), put_cdpath };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t EDITOR_disc = { sizeof(Namfun_t), put_ed };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t HISTFILE_disc = { sizeof(Namfun_t), put_history };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t OPTINDEX_disc = { sizeof(Namfun_t), put_optindex, 0, nget_optindex, 0, 0, clone_optindex };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Namdisc_t SECONDS_disc = { sizeof(struct seconds), put_seconds, get_seconds, nget_seconds };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const Namdisc_t RAND_disc = { sizeof(struct rand), put_rand, get_rand, nget_rand };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t LINENO_disc = { sizeof(Namfun_t), put_lineno, get_lineno, nget_lineno };
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t L_ARG_disc = { sizeof(Namfun_t), put_lastarg, get_lastarg };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_NAMESPACE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char* get_nspace(Namval_t* np, Namfun_t *fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh.namespace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(nv_name(sh.namespace));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((char*)np->nvalue.cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static const Namdisc_t NSPACE_disc = { 0, 0, get_nspace };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static Namfun_t NSPACE_init = { &NSPACE_disc, 1};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_NAMESPACE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin static const Namdisc_t LC_disc = { sizeof(Namfun_t), put_lang };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_locale */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This function will get called whenever a configuration parameter changes
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int newconf(const char *name, const char *path, const char *value)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *arg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setenviron(value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(strcmp(name,"UNIVERSE")==0 && strcmp(astconf(name,0,0),value))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh.universe = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set directory in new universe */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(arg = path_pwd(0))=='/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin chdir(arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* clear out old tracked alias */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(nv_getval(PATHNOD));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(PATHNOD,stakseek(0),NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if (CC_NATIVE != CC_ASCII)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void a2e(char *d, const char *s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const unsigned char *t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = CCMAP(CC_ASCII, CC_NATIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i<(1<<CHAR_BIT); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d[t[i]] = s[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void init_ebcdic(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp = (char*)malloc(ST_NONE*(1<<CHAR_BIT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=0; i < ST_NONE; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin a2e(cp,sh_lexrstates[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_lexstates[i] = cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp += (1<<CHAR_BIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return SH_TYPE_* bitmask for path
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 0 for "not a shell"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_type(register const char *path)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = (const char*)strrchr(path, '/'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*path == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_LOGIN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = path;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_LOGIN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(t & (SH_TYPE_KSH|SH_TYPE_BASH)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == 'k')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_KSH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_BASH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == 'b' && *(s+1) == 'a')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_BASH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(t & (SH_TYPE_PROFILE|SH_TYPE_RESTRICTED)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_PFSH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == 'p' && *(s+1) == 'f')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_PROFILE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == 'r')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t |= SH_TYPE_RESTRICTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s++ == 's' && (*s == 'h' || *s == 'u'))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t |= SH_TYPE_SH;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((t & SH_TYPE_KSH) && *s == '9' && *(s+1) == '3')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == '.' && *(s+1) == 'e' && *(s+2) == 'x' && *(s+3) == 'e')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s += 4;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!isalnum(*s))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return t & ~(SH_TYPE_BASH|SH_TYPE_KSH|SH_TYPE_PROFILE|SH_TYPE_RESTRICTED);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char *get_mode(Namval_t* np, Namfun_t* nfp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mode_t mode = nv_getn(np,nfp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(fmtperm(mode));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_mode(Namval_t* np, const char* val, int flag, Namfun_t* nfp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mode_t mode;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *last;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(flag&NV_INTEGER)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(flag&NV_LONG)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mode = *(Sfdouble_t*)val;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mode = *(double*)val;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mode = strperm(val, &last,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(*last)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np,(char*)&mode,NV_INTEGER,nfp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np,val,flag,nfp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t modedisc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin put_mode,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin get_mode,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize the shell
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinShell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = &sh;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int type;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner long v;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char *login_files[3];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz memfatal();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strlen(e_version);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(e_version[n-1]=='$' && e_version[n-2]==' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e_version[n-2]=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if (CC_NATIVE == CC_ASCII)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(sh_lexstates,sh_lexrstates,ST_NONE*sizeof(char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin init_ebcdic();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin umask(shp->mask=umask(0));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->mac_context = sh_macopen(shp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->arg_context = sh_argopen(shp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lex_context = (void*)sh_lexopen(0,shp,1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->ed_context = (void*)ed_open(shp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->strbuf = sfstropen();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->stk = stkstd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfsetbuf(shp->strbuf,(char*)0,64);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_INIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.exit = sh_exit;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = path_basename(argv[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if ERROR_VERSION >= 20000102L
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.catalog = e_dict;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if SHOPT_REGRESS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Opt_t* nopt;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Opt_t* oopt;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char* a;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char** av = argv;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char* regress[3];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_regress_init(shp);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz regress[0] = "__regress__";
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz regress[2] = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /* NOTE: only shp is used by __regress__ at this point */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->bltindata.shp = shp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while ((a = *++av) && a[0] == '-' && (a[1] == 'I' || a[1] == '-' && a[2] == 'r'))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (a[1] == 'I')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (a[2])
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz regress[1] = a + 2;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (!(regress[1] = *++av))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (strncmp(a+2, "regress", 7))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (a[9] == '=')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz regress[1] = a + 10;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (!(regress[1] = *++av))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nopt = optctx(0, 0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz oopt = optctx(nopt, 0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz b___regress__(2, regress, &shp->bltindata);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz optctx(oopt, nopt);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->cpipe[0] = -1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->coutpipe = -1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->userid=getuid();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->euserid=geteuid();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->groupid=getgid();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->egroupid=getegid();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(n=0;n < 10; n++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* don't use lower bits when rand() generates large numbers */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(rand() > RANDMASK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rand_shift = 3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.clk_tck = getconf("CLK_TCK");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.arg_max = getconf("ARG_MAX");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.open_max = getconf("OPEN_MAX");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.child_max = getconf("CHILD_MAX");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.ngroups_max = getconf("NGROUPS_MAX");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.posix_version = getconf("VERSION");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.posix_jobcontrol = getconf("JOB_CONTROL");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lim.arg_max <=0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.arg_max = ARG_MAX;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lim.child_max <=0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.child_max = CHILD_MAX;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if((v = getconf("PID_MAX")) > 0 && shp->lim.child_max > v)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner shp->lim.child_max = v;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lim.open_max <0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.open_max = OPEN_MAX;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lim.open_max > (SHRT_MAX-2))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.open_max = SHRT_MAX-2;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->lim.clk_tck <=0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.clk_tck = CLK_TCK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fs3d(FS3D_TEST))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->lim.fs3d = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_ioinit(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* initialize signal handling */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_siginit(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakinstall(NIL(Stak_t*),nospace);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set up memory for name-value pairs */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->init_context = nv_init(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* read the environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(argc>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = sh_type(*argv);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(type&SH_TYPE_LOGIN)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->login_sh = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin env_init(shp);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!ENVNOD->nvalue.cp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(shp->strbuf,"%s/.kshrc",nv_getval(HOME));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_putval(ENVNOD,sfstruse(shp->strbuf),NV_RDONLY);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *SHLVL->nvalue.ip +=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_SPAWN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * try to find the pathname for this interpreter
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * try using environment variable _ or argv[0]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char *cp=nv_getval(L_ARGNOD);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buff[PATH_MAX+1];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shpath = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if _AST_VERSION >= 20090202L
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if((n = pathprog(NiL, buff, sizeof(buff))) > 0 && n <= sizeof(buff))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->shpath = strdup(buff);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(shp->strbuf,"/proc/%d/exe",getpid());
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n=readlink(sfstruse(shp->strbuf),buff,sizeof(buff)-1))>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff[n] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shpath = strdup(buff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if((cp && (sh_type(cp)&SH_TYPE_SH)) || (argc>0 && strchr(cp= *argv,'/')))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp=='/')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shpath = strdup(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(cp = nv_getval(PWDNOD))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int offset = staktell();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc('/');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(argv[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(stakptr(offset),PATH_DOTDOT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shpath = strdup(stakptr(offset));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(offset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(IFSNOD,(char*)e_sptbnl,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_FS_3D
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(VPATHNOD, &VPATH_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_FS_3D */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin astconfdisc(newconf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_TIMEOUT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.tmout = SHOPT_TIMEOUT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_TIMEOUT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* initialize jobs table */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin job_clear();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(argc>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for restricted shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(type&SH_TYPE_RESTRICTED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_RESTRICTED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_PFSH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for profile shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(type&SH_TYPE_PROFILE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_PFSH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_BASH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for invocation as bash */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(type&SH_TYPE_BASH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->userinit = userinit = bash_init;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_BASH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_PREINIT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*userinit)(shp, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_PREINIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* look for options */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* shp->st.dolc is $# */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((shp->st.dolc = sh_argopts(-argc,argv,shp)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->exitval = 2;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_done(shp,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.disc = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.dolv=argv+(argc-1)-shp->st.dolc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.dolv[0] = argv[0];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->st.dolc < 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_SFLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_SFLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.dolc--;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.dolv++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name = shp->st.dolv[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name[1]==':' && (name[2]=='/' || name[2]=='\\'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_pathposix
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((n = pathposix(name, NIL(char*), 0)) > 0 && (p = (char*)malloc(++n)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathposix(name, p, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name[1] = name[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name[0] = name[2] = '/';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _WINIX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_PFSH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (sh_isoption(SH_PFSH))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct passwd *pw = getpwuid(shp->userid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pw)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->user = strdup(pw->pw_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set[ug]id scripts require the -p flag */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->userid!=shp->euserid || shp->groupid!=shp->egroupid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#ifdef SHOPT_P_SUID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* require sh -p to run setuid and/or setgid */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!sh_isoption(SH_PRIVILEGED) && shp->userid >= SHOPT_P_SUID)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin setuid(shp->euserid=shp->userid);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin setgid(shp->egroupid=shp->groupid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_P_SUID */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_onoption(SH_PRIVILEGED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SHELLMAGIC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* careful of #! setuid scripts with name beginning with - */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->login_sh && argv[1] && strcmp(argv[0],argv[1])==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_prohibited);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*SHELLMAGIC*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_PRIVILEGED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* shname for $0 in profiles and . scripts */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strmatch(argv[1],e_devfdNN))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shname = strdup(argv[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shname = strdup(shp->st.dolv[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return here for shell script execution
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * but not for parenthesis subshells
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error_info.id = strdup(shp->st.dolv[0]); /* error_info.id is $0 */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->jmpbuffer = (void*)&shp->checkbase;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_pushcontext(&shp->checkbase,SH_JMPSCRIPT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->st.self = &shp->global;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->topscope = (Shscope_t*)shp->st.self;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin login_files[0] = (char*)e_profile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin login_files[1] = ".profile";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->login_files = login_files;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.version = SH_VERSION;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.shp = shp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.shrun = sh_run;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.shtrap = sh_trap;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.shexit = sh_exit;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltindata.shbltin = sh_addbuiltin;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if _AST_VERSION >= 20080617L
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner shp->bltindata.shgetenv = sh_getenv;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner shp->bltindata.shsetenv = sh_setenviron;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin astintercept(&shp->bltindata,1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define NV_MKINTTYPE(x,y,z) nv_mkinttype(#x,sizeof(x),(x)-1<0,(y),(Namdisc_t*)z);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(pid_t,"process id",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(gid_t,"group id",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(uid_t,"user id",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(size_t,(const char*)0,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(ssize_t,(const char*)0,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(off_t,"offset in bytes",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(ino_t,"\ai-\anode number",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(mode_t,(const char*)0,&modedisc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(dev_t,"device id",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(nlink_t,"hard link count",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(blkcnt_t,"block count",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin NV_MKINTTYPE(time_t,"seconds since the epoch",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_mkstat();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->userinit=userinit)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*userinit)(shp, 0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinShell_t *sh_getinterp(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(&sh);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * reinitialize before executing a script
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_reinit(char *argv[])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = &sh;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shopt_t opt;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np,*npnext;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Dt_t *dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(np=dtfirst(shp->fun_tree);np;np=npnext)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((dp=shp->fun_tree)->walk)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp = dp->walk;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin npnext = (Namval_t*)dtnext(shp->fun_tree,np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np>= shp->bltin_cmds && np < &shp->bltin_cmds[nbltins])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(is_abuiltin(np) && nv_isattr(np,NV_EXPORT))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(*np->nvname=='/')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(np,dp,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dtclose(shp->alias_tree);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->alias_tree = inittree(shp,shtab_aliases);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->last_root = shp->var_tree;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->namespace = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->inuse_bits = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->userinit)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*shp->userinit)(shp, 1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->heredocs)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfclose(shp->heredocs);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->heredocs = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* remove locals */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_INIT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_scan(shp->var_tree,sh_envnolocal,(void*)0,NV_EXPORT,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_scan(shp->var_tree,sh_envnolocal,(void*)0,NV_ARRAY,NV_ARRAY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INIT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memset(shp->st.trapcom,0,(shp->st.trapmax+1)*sizeof(char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memset((void*)&opt,0,sizeof(opt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_TRACKALL))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on_option(&opt,SH_TRACKALL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_EMACS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on_option(&opt,SH_EMACS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_GMACS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on_option(&opt,SH_GMACS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_VI))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on_option(&opt,SH_VI);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_VIRAW))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on_option(&opt,SH_VIRAW);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->options = opt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set up new args */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(argv)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->arglist = sh_argcreate(argv);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(shp->arglist)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_argreset(shp,shp->arglist,NIL(struct dolnod*));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->envlist=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->curenv = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->shname = error_info.id = strdup(shp->st.dolv[0]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_FORKED);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->fn_depth = shp->dot_depth = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_sigreset(0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!(SHLVL->nvalue.ip))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shlvl = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz SHLVL->nvalue.ip = &shlvl;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_onattr(SHLVL,NV_INTEGER|NV_EXPORT|NV_NOFREE);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *SHLVL->nvalue.ip +=1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->st.filename = strdup(shp->lastarg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set when creating a local variable of this name
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinNamfun_t *nv_cover(register Namval_t *np)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(np==IFSNOD || np==PATHNOD || np==SHELLNOD || np==FPATHNOD || np==CDPNOD || np==SECONDS || np==ENVNOD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(np->nvfun);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(np==LCALLNOD || np==LCTYPENOD || np==LCMSGNOD || np==LCCOLLNOD || np==LCNUMNOD || np==LANGNOD)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(np->nvfun);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char *shdiscnames[] = { "tilde", 0};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef SHOPT_STATS
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstruct Stats
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t hdr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *sh;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *nodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int numnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int current;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *next_stat(register Namval_t* np, Dt_t *root,Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct Stats *sp = (struct Stats*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!root)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->current = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(++sp->current>=sp->numnodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nv_namptr(sp->nodes,sp->current));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *create_stat(Namval_t *np,const char *name,int flag,Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct Stats *sp = (struct Stats*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char *cp=name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i=0,n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = sp->sh;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(SH_STATS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((i=*cp++) && i != '=' && i != '+' && i!='[');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = (cp-1) -name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < sp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(sp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n==0||memcmp(name,nq->nvname,n)==0) && nq->nvname[n]==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto found;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfound:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->last = (char*)&name[n];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->last_table = SH_STATS;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_notelem,n,name,nv_name(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nq);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t stat_disc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, 0, 0, 0, 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin create_stat,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin next_stat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char *name_stat(Namval_t *np, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = sh_getinterp();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(shp->strbuf,".sh.stats.%s",np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(sfstruse(shp->strbuf));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t stat_child_disc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,0,0,0,0,0,0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name_stat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namfun_t stat_child_fun =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &stat_child_disc, 1, 0, sizeof(Namfun_t)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void stat_init(Shell_t *shp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int i,nstat = STAT_SUBSHELL+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct Stats *sp = newof(0,struct Stats,1,nstat*NV_MINSZ);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->numnodes = nstat;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->nodes = (char*)(sp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->stats = (int*)calloc(sizeof(int*),nstat);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->sh = shp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < nstat; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nv_namptr(sp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvfun = &stat_child_fun;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvname = (char*)shtab_stats[i].sh_name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np,NV_RDONLY|NV_MINIMAL|NV_NOFREE|NV_INTEGER);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(np,10);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.ip = &shp->stats[i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->hdr.dsize = sizeof(struct Stats) + nstat*(sizeof(int)+NV_MINSZ);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->hdr.disc = &stat_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(SH_STATS,&sp->hdr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp->hdr.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setvtree(SH_STATS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define stat_init(x)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /* SHOPT_STATS */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Initialize the shell name and alias table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Init_t *nv_init(Shell_t *shp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Init_t *ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double d=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = newof(0,Init_t,1,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->nvfun.last = (char*)shp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->nvfun.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->sh = shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->var_base = shp->var_tree = inittree(shp,shtab_variables);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SHLVL->nvalue.ip = &shlvl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->IFS_init.hdr.disc = &IFS_disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->IFS_init.hdr.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->PATH_init.disc = &RESTRICTED_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->PATH_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->FPATH_init.disc = &RESTRICTED_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->FPATH_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->CDPATH_init.disc = &CDPATH_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->CDPATH_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->SHELL_init.disc = &RESTRICTED_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->SHELL_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->ENV_init.disc = &RESTRICTED_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->ENV_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->VISUAL_init.disc = &EDITOR_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->VISUAL_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->EDITOR_init.disc = &EDITOR_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->EDITOR_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->HISTFILE_init.disc = &HISTFILE_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->HISTFILE_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->HISTSIZE_init.disc = &HISTFILE_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->HISTSIZE_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->OPTINDEX_init.disc = &OPTINDEX_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->OPTINDEX_init.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->SECONDS_init.hdr.disc = &SECONDS_disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->SECONDS_init.hdr.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->RAND_init.hdr.disc = &RAND_disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->RAND_init.hdr.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->SH_MATCH_init.hdr.disc = &SH_MATCH_disc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip->SH_MATCH_init.hdr.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->SH_VERSION_init.disc = &SH_VERSION_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->SH_VERSION_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LINENO_init.disc = &LINENO_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LINENO_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->L_ARG_init.disc = &L_ARG_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->L_ARG_init.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_TYPE_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_TYPE_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_NUM_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_NUM_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_COLL_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_COLL_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_MSG_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_MSG_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_ALL_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LC_ALL_init.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LANG_init.disc = &LC_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ip->LANG_init.nofree = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_locale */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(IFSNOD, &ip->IFS_init.hdr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(PATHNOD, &ip->PATH_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(FPATHNOD, &ip->FPATH_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(CDPNOD, &ip->CDPATH_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(SHELLNOD, &ip->SHELL_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(ENVNOD, &ip->ENV_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(VISINOD, &ip->VISUAL_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(EDITNOD, &ip->EDITOR_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(HISTFILE, &ip->HISTFILE_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(HISTSIZE, &ip->HISTSIZE_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(OPTINDNOD, &ip->OPTINDEX_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(SECONDS, &ip->SECONDS_init.hdr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(L_ARGNOD, &ip->L_ARG_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(SECONDS, (char*)&d, NV_DOUBLE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(RANDNOD, &ip->RAND_init.hdr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = (shp->pid&RANDMASK);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(RANDNOD, (char*)&d, NV_DOUBLE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LINENO, &ip->LINENO_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putsub(SH_MATCHNOD,(char*)0,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(SH_MATCHNOD,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(SH_MATCHNOD, &ip->SH_MATCH_init.hdr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(SH_VERSIONNOD, &ip->SH_VERSION_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_locale
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LCTYPENOD, &ip->LC_TYPE_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LCALLNOD, &ip->LC_ALL_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LCMSGNOD, &ip->LC_MSG_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LCCOLLNOD, &ip->LC_COLL_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LCNUMNOD, &ip->LC_NUM_init);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_stack(LANGNOD, &ip->LANG_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_locale */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (PPIDNOD)->nvalue.lp = (&shp->ppid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (TMOUTNOD)->nvalue.lp = (&shp->st.tmout);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (MCHKNOD)->nvalue.lp = (&sh_mailchk);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (OPTINDNOD)->nvalue.lp = (&shp->st.optindex);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set up the seconds clock */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->alias_tree = inittree(shp,shtab_aliases);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->track_tree = dtopen(&_Nvdisc,Dtset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->bltin_tree = inittree(shp,(const struct shtable2*)shtab_builtins);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->fun_tree = dtopen(&_Nvdisc,Dtoset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dtview(shp->fun_tree,shp->bltin_tree);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_NAMESPACE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(np = nv_mount(DOTSHNOD, "global", shp->var_tree))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(np,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = nv_search("namespace",nv_dict(DOTSHNOD),NV_ADD);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(np,".sh.global",NV_RDONLY|NV_NOFREE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_stack(np, &NSPACE_init);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_NAMESPACE */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nv_mount(DOTSHNOD, "type", shp->typedict=dtopen(&_Nvdisc,Dtoset));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_adddisc(DOTSHNOD, shdiscnames, (Namval_t**)0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SH_LINENO->nvalue.ip = &shp->st.lineno;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin VERSIONNOD->nvalue.nrp = newof(0,struct Namref,1,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin VERSIONNOD->nvalue.nrp->np = SH_VERSIONNOD;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin VERSIONNOD->nvalue.nrp->root = nv_dict(DOTSHNOD);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin VERSIONNOD->nvalue.nrp->table = DOTSHNOD;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(VERSIONNOD,NV_RDONLY|NV_REF);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stat_init(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(ip);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize name-value pairs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Dt_t *inittree(Shell_t *shp,const struct shtable2 *name_vals)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Namval_t *np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const struct shtable2 *tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Dt_t *treep;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Dt_t *base_treep, *dict;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tp=name_vals;*tp->sh_name;tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = (Namval_t*)calloc(n,sizeof(Namval_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!shp->bltin_nodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->bltin_nodes = np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->bltin_nnodes = n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(name_vals==(const struct shtable2*)shtab_builtins)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->bltin_cmds = np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nbltins = n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin base_treep = treep = dtopen(&_Nvdisc,Dtoset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin treep->user = (void*)shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tp=name_vals;*tp->sh_name;tp++,np++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((np->nvname = strrchr(tp->sh_name,'.')) && np->nvname!=((char*)tp->sh_name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvname++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvname = (char*)tp->sh_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin treep = base_treep;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvenv = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name_vals==(const struct shtable2*)shtab_builtins)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvalue.bfp = ((struct shtable3*)tp)->sh_value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name_vals == shtab_variables)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvfun = &sh.nvfun;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvalue.cp = (char*)tp->sh_value;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_setattr(np,tp->sh_number);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_istable(np))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_mount(np,(const char*)0,dict=dtopen(&_Nvdisc,Dtoset));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isattr(np,NV_INTEGER))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_setsize(np,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_setsize(np,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dtinsert(treep,np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_istable(np))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin treep = dict;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(treep);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * read in the process environment and set up name-value pairs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * skip over items that are not name-value pairs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void env_init(Shell_t *shp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Namval_t *np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char **ep=environ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *next=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _ENV_H
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->env = env_open(environ,3);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin env_delete(shp->env,"_");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp= *ep++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin next = cp+4;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(np,NV_IMPORT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np->nvenv = cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_close(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else /* swap with front */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep[-1] = environ[shp->nenv];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin environ[shp->nenv++] = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp=next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(next = strchr(++cp,'='))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *next = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = nv_search(cp+2,shp->var_tree,NV_ADD);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int flag = *(unsigned char*)cp-' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int size = *(unsigned char*)(cp+1)-' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((flag&NV_INTEGER) && size==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for floating*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *ep,*val = nv_getval(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strtol(val,&ep,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*ep=='.' || *ep=='e' || *ep=='E')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *lp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag |= NV_DOUBLE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*ep=='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strtol(ep+1,&lp,10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*lp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep = lp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*ep && *ep!='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flag |= NV_EXPNOTE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = ep-val;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = strlen(ep);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner cp += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _ENV_H
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin env_delete(shp->env,e_envmarker);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_offattr(PWDNOD,NV_TAGGED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_pwd(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_RESTRICTED); /* restricted shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * terminate shell and free up the space
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_term(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfdisc(sfstdin,SF_POPDISC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((char*)sh.outbuff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakset(NIL(char*),0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* function versions of these */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DISABLE /* proto workaround */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunsigned long sh_isoption DISABLE (int opt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sh_isoption(opt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunsigned long sh_onoption DISABLE (int opt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sh_onoption(opt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunsigned long sh_offoption DISABLE (int opt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sh_offoption(opt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid sh_sigcheck DISABLE (void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_sigcheck();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinDt_t* sh_bltin_tree DISABLE (void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(sh.bltin_tree);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}