mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Notable changes:
.github/workflows/ci.yml:
- Run 'bin/package test' on the github runner so we test iffe too.
src/cmd/ksh93/sh/subshell.c:
- sh_assignok was usually called like 'np = sh_assignok(np,0)'. But
the function never changes np, it just returns the np value
passed to it, so the assignment is pointless and that function
can be changed to a void.
src/cmd/ksh93/sh/fault.c: sh_fault():
- Remove check for sh.subshell after sh_isstate(SH_INTERACTIVE). As
of 48ba6964, it is never set in subshells.
229 lines
7.8 KiB
C
229 lines
7.8 KiB
C
/***********************************************************************
|
|
* *
|
|
* This software is part of the ast package *
|
|
* Copyright (c) 1982-2012 AT&T Intellectual Property *
|
|
* Copyright (c) 2020-2022 Contributors to ksh 93u+m *
|
|
* and is licensed under the *
|
|
* Eclipse Public License, Version 1.0 *
|
|
* by AT&T Intellectual Property *
|
|
* *
|
|
* A copy of the License is available at *
|
|
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
* *
|
|
* Information and Software Systems Research *
|
|
* AT&T Research *
|
|
* Florham Park NJ *
|
|
* *
|
|
* David Korn <dgk@research.att.com> *
|
|
* *
|
|
***********************************************************************/
|
|
/*
|
|
* David Korn
|
|
* AT&T Labs
|
|
*
|
|
* Shell interface private definitions
|
|
*
|
|
*/
|
|
#ifndef defs_h_defined
|
|
#define defs_h_defined
|
|
|
|
/* In case multibyte support was disabled for ksh only (SHOPT_MULTIBYTE==0) and not for libast */
|
|
#if !SHOPT_MULTIBYTE && !AST_NOMULTIBYTE
|
|
# undef AST_NOMULTIBYTE
|
|
# define AST_NOMULTIBYTE 1
|
|
#endif
|
|
|
|
#include <ast.h>
|
|
#if !defined(AST_VERSION) || AST_VERSION < 20220208
|
|
#error libast version 20220208 or later is required
|
|
#endif
|
|
#if !_lib_fork
|
|
#error In 2021, ksh joined the 21st century and started requiring fork(2).
|
|
#endif
|
|
|
|
#include <sfio.h>
|
|
#include <error.h>
|
|
#include "FEATURE/externs"
|
|
#include "FEATURE/options"
|
|
#include <cdt.h>
|
|
#include "argnod.h"
|
|
#include "name.h"
|
|
#include <ctype.h>
|
|
|
|
#ifndef pointerof
|
|
#define pointerof(x) ((void*)((char*)0+(x)))
|
|
#endif
|
|
|
|
#define Empty ((char*)(e_sptbnl+3))
|
|
#define AltEmpty ((char*)(e_dot+1)) /* alternative pointer to empty string */
|
|
|
|
#define env_change() (++ast.env_serial)
|
|
|
|
extern char* sh_getenv(const char*);
|
|
extern char* sh_setenviron(const char*);
|
|
|
|
#ifndef SH_wait_f_defined
|
|
typedef int (*Shwait_f)(int, long, int);
|
|
# define SH_wait_f_defined
|
|
#endif
|
|
|
|
#include <shell.h>
|
|
|
|
#include "shtable.h"
|
|
#include "regress.h"
|
|
|
|
/* error exits from various parts of shell */
|
|
#define NIL(type) ((type)0)
|
|
|
|
#define exitset() (sh.savexit=sh.exitval)
|
|
|
|
#ifndef SH_DICT
|
|
#define SH_DICT (void*)e_dict
|
|
#endif
|
|
|
|
#ifndef SH_CMDLIB_DIR
|
|
#define SH_CMDLIB_DIR "/opt/ast/bin"
|
|
#endif
|
|
|
|
#define SH_ID "ksh" /* ksh ID */
|
|
#define SH_STD "sh" /* standard sh ID */
|
|
|
|
/* defines for sh_type() */
|
|
|
|
#define SH_TYPE_SH 001
|
|
#define SH_TYPE_KSH 002
|
|
#define SH_TYPE_POSIX 004
|
|
#define SH_TYPE_LOGIN 010
|
|
#define SH_TYPE_RESTRICTED 040
|
|
|
|
#ifndef PIPE_BUF
|
|
# define PIPE_BUF 512
|
|
#endif
|
|
|
|
#define MATCH_MAX 64
|
|
|
|
#define SH_READEVAL 0x4000 /* for sh_eval */
|
|
#define SH_FUNEVAL 0x10000 /* for sh_eval for function load */
|
|
|
|
extern char **sh_argbuild(int*,const struct comnod*,int);
|
|
extern struct dolnod *sh_argfree(struct dolnod*,int);
|
|
extern struct dolnod *sh_argnew(char*[],struct dolnod**);
|
|
extern void *sh_argopen(void);
|
|
extern struct argnod *sh_argprocsub(struct argnod*);
|
|
extern void sh_argreset(struct dolnod*,struct dolnod*);
|
|
extern void sh_assignok(Namval_t*,int);
|
|
extern struct dolnod *sh_arguse(void);
|
|
extern char *sh_checkid(char*,char*);
|
|
extern void sh_chktrap(void);
|
|
extern int sh_debug(const char*,const char*,const char*,char *const[],int);
|
|
extern char **sh_envgen(void);
|
|
extern void sh_envnolocal(Namval_t*,void*);
|
|
extern Sfdouble_t sh_arith(const char*);
|
|
extern void *sh_arithcomp(char*);
|
|
extern pid_t sh_fork(int,int*);
|
|
extern pid_t _sh_fork(pid_t, int ,int*);
|
|
extern void sh_invalidate_ifs(void);
|
|
extern char *sh_mactrim(char*,int);
|
|
extern int sh_macexpand(struct argnod*,struct argnod**,int);
|
|
extern int sh_macfun(const char*,int);
|
|
extern void sh_machere(Sfio_t*, Sfio_t*, char*);
|
|
extern void *sh_macopen(void);
|
|
extern char *sh_macpat(struct argnod*,int);
|
|
extern Sfdouble_t sh_mathfun(void*, int, Sfdouble_t*);
|
|
extern int sh_outtype(Sfio_t*);
|
|
extern char *sh_mactry(char*);
|
|
extern int sh_mathstd(const char*);
|
|
extern void sh_printopts(Shopt_t,int,Shopt_t*);
|
|
extern int sh_readline(char**,volatile int,int,ssize_t,long);
|
|
extern Sfio_t *sh_sfeval(char*[]);
|
|
extern void sh_setmatch(const char*,int,int,int[],int);
|
|
extern void sh_scope(struct argnod*, int);
|
|
extern Namval_t *sh_scoped(Namval_t*);
|
|
extern Dt_t *sh_subtracktree(int);
|
|
extern Dt_t *sh_subfuntree(int);
|
|
extern void sh_subjobcheck(pid_t);
|
|
extern int sh_subsavefd(int);
|
|
extern void sh_subtmpfile(void);
|
|
extern char *sh_substitute(const char*,const char*,char*);
|
|
extern const char *_sh_translate(const char*);
|
|
extern int sh_trace(char*[],int);
|
|
extern void sh_trim(char*);
|
|
extern int sh_type(const char*);
|
|
extern void sh_unscope(void);
|
|
#if SHOPT_NAMESPACE
|
|
extern Namval_t *sh_fsearch(const char *,int);
|
|
#endif /* SHOPT_NAMESPACE */
|
|
|
|
/* malloc related wrappers */
|
|
extern void *sh_malloc(size_t size);
|
|
extern void *sh_realloc(void *ptr, size_t size);
|
|
extern void *sh_calloc(size_t nmemb, size_t size);
|
|
extern char *sh_strdup(const char *s);
|
|
extern void *sh_memdup(const void *s, size_t n);
|
|
extern char *sh_getcwd(void);
|
|
#define new_of(type,x) ((type*)sh_malloc((unsigned)sizeof(type)+(x)))
|
|
#define sh_newof(p,t,n,x) ((p)?(t*)sh_realloc((char*)(p),sizeof(t)*(n)+(x)):(t*)sh_calloc(1,sizeof(t)*(n)+(x)))
|
|
|
|
#define URI_RFC3986_UNRESERVED "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
|
|
|
|
#ifndef ERROR_dictionary
|
|
# define ERROR_dictionary(s) (s)
|
|
#endif
|
|
#define sh_translate(s) _sh_translate(ERROR_dictionary(s))
|
|
|
|
#define WBITS (sizeof(long)*8)
|
|
#define WMASK (0xff)
|
|
|
|
#define is_option(s,x) ((s)->v[((x)&WMASK)/WBITS] & (1L << ((x) % WBITS)))
|
|
#define on_option(s,x) ((s)->v[((x)&WMASK)/WBITS] |= (1L << ((x) % WBITS)))
|
|
#define off_option(s,x) ((s)->v[((x)&WMASK)/WBITS] &= ~(1L << ((x) % WBITS)))
|
|
#define sh_isoption(x) is_option(&sh.options,x)
|
|
#define sh_onoption(x) on_option(&sh.options,x)
|
|
#define sh_offoption(x) off_option(&sh.options,x)
|
|
|
|
|
|
#define sh_state(x) ( 1<<(x))
|
|
#define sh_isstate(x) (sh.st.states&sh_state(x))
|
|
#define sh_onstate(x) (sh.st.states |= sh_state(x))
|
|
#define sh_offstate(x) (sh.st.states &= ~sh_state(x))
|
|
#define sh_getstate() (sh.st.states)
|
|
#define sh_setstate(x) (sh.st.states = (x))
|
|
|
|
#define sh_sigcheck() do { if(sh.trapnote & SH_SIGSET) sh_exit(SH_EXITSIG); } while(0)
|
|
|
|
extern int32_t sh_mailchk;
|
|
extern const char e_dict[]; /* error message catalog */
|
|
extern const char e_sptbnl[]; /* default IFS: " \t\n" */
|
|
extern const char e_dot[]; /* default path & name of dot command: "." */
|
|
|
|
/* sh_printopts() mode flags -- set --[no]option by default */
|
|
|
|
#define PRINT_VERBOSE 0x01 /* option on|off list */
|
|
#define PRINT_ALL 0x02 /* list unset options too */
|
|
#define PRINT_NO_HEADER 0x04 /* omit listing header */
|
|
#define PRINT_TABLE 0x10 /* table of all options */
|
|
|
|
#if SHOPT_STATS
|
|
/* performance statistics */
|
|
# define STAT_ARGHITS 0
|
|
# define STAT_ARGEXPAND 1
|
|
# define STAT_COMSUB 2
|
|
# define STAT_FORKS 3
|
|
# define STAT_FUNCT 4
|
|
# define STAT_GLOBS 5
|
|
# define STAT_READS 6
|
|
# define STAT_NVHITS 7
|
|
# define STAT_NVOPEN 8
|
|
# define STAT_PATHS 9
|
|
# define STAT_SVFUNCT 10
|
|
# define STAT_SCMDS 11
|
|
# define STAT_SPAWN 12
|
|
# define STAT_SUBSHELL 13
|
|
extern const Shtable_t shtab_stats[];
|
|
# define sh_stats(x) (sh.stats[(x)]++)
|
|
#else
|
|
# define sh_stats(x)
|
|
#endif /* SHOPT_STATS */
|
|
|
|
#endif /* !defs_h_defined */
|