1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                  David Korn <dgk@research.att.com>                   *
18 *                                                                      *
19 ***********************************************************************/
20 #pragma prototyped
21 #ifndef PATH_OFFSET
22 
23 /*
24  *	UNIX shell path handling interface
25  *	Written by David Korn
26  *	These are the definitions for the lexical analyzer
27  */
28 
29 #include	"FEATURE/options"
30 #include	<nval.h>
31 #include	"defs.h"
32 
33 #if !defined(SHOPT_SPAWN)
34 #   if _UWIN || _use_spawnveg || !_lib_fork
35 #	define  SHOPT_SPAWN  1
36 #   endif
37 #endif /* !SHOPT_SPAWN */
38 
39 #define PATH_PATH		0001
40 #define PATH_FPATH		0002
41 #define PATH_CDPATH		0004
42 #define PATH_BFPATH		0010
43 #define PATH_SKIP		0020
44 #define PATH_BUILTIN_LIB	0040
45 #define PATH_STD_DIR		0100	/* directory is on  $(getconf PATH) */
46 
47 #define PATH_OFFSET	2		/* path offset for path_join */
48 #define MAXDEPTH	(sizeof(char*)==2?64:1024) /* maximum recursion depth*/
49 
50 /*
51  * path component structure for path searching
52  */
53 typedef struct pathcomp
54 {
55 	struct pathcomp *next;
56 	int		refcount;
57 	dev_t		dev;
58 	ino_t		ino;
59 	time_t		mtime;
60 	char		*name;
61 	char		*lib;
62 	char		*bbuf;
63 	char		*blib;
64 	unsigned short	len;
65 	unsigned short	flags;
66 	Shell_t		*shp;
67 } Pathcomp_t;
68 
69 #ifndef ARG_RAW
70     struct argnod;
71 #endif /* !ARG_RAW */
72 
73 /* pathname handling routines */
74 extern void		path_newdir(Shell_t*,Pathcomp_t*);
75 extern Pathcomp_t	*path_dirfind(Pathcomp_t*,const char*,int);
76 extern Pathcomp_t	*path_unsetfpath(Shell_t*);
77 extern Pathcomp_t	*path_addpath(Shell_t*,Pathcomp_t*,const char*,int);
78 extern Pathcomp_t	*path_dup(Pathcomp_t*);
79 extern void		path_delete(Pathcomp_t*);
80 extern void 		path_alias(Namval_t*,Pathcomp_t*);
81 extern Pathcomp_t 	*path_absolute(Shell_t*, const char*, Pathcomp_t*);
82 extern char 		*path_basename(const char*);
83 extern char 		*path_fullname(Shell_t*,const char*);
84 extern int 		path_expand(Shell_t*,const char*, struct argnod**);
85 extern void 		path_exec(Shell_t*,const char*,char*[],struct argnod*);
86 extern pid_t		path_spawn(Shell_t*,const char*,char*[],char*[],Pathcomp_t*,int);
87 #if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell)
88 #   define extern __EXPORT__
89 #endif
90 extern int		path_open(Shell_t*,const char*,Pathcomp_t*);
91 extern Pathcomp_t 	*path_get(Shell_t*,const char*);
92 #undef extern
93 extern char 		*path_pwd(Shell_t*,int);
94 extern Pathcomp_t	*path_nextcomp(Shell_t*,Pathcomp_t*,const char*,Pathcomp_t*);
95 extern int		path_search(Shell_t*,const char*,Pathcomp_t**,int);
96 extern char		*path_relative(Shell_t*,const char*);
97 extern int		path_complete(Shell_t*,const char*, const char*,struct argnod**);
98 #if SHOPT_BRACEPAT
99     extern int 		path_generate(Shell_t*,struct argnod*,struct argnod**);
100 #endif /* SHOPT_BRACEPAT */
101     extern int		path_xattr(Shell_t*, const char*, char*);
102 
103 /* builtin/plugin routines */
104 extern int		sh_addlib(Shell_t*,void*,char*,Pathcomp_t*);
105 extern Shbltin_f	sh_getlib(Shell_t*,char*,Pathcomp_t*);
106 
107 /* constant strings needed for whence */
108 extern const char e_timeformat[];
109 extern const char e_badtformat[];
110 extern const char e_dot[];
111 extern const char e_funload[];
112 extern const char e_pfsh[];
113 extern const char e_pwd[];
114 extern const char e_logout[];
115 extern const char e_alphanum[];
116 extern const char e_mailmsg[];
117 extern const char e_suidprofile[];
118 extern const char e_sysprofile[];
119 extern const char e_traceprompt[];
120 extern const char e_crondir[];
121 #if SHOPT_SUID_EXEC
122     extern const char	e_suidexec[];
123 #endif /* SHOPT_SUID_EXEC */
124 extern const char is_alias[];
125 extern const char is_builtin[];
126 extern const char is_spcbuiltin[];
127 extern const char is_builtver[];
128 extern const char is_reserved[];
129 extern const char is_talias[];
130 extern const char is_xalias[];
131 extern const char is_function[];
132 extern const char is_ufunction[];
133 #ifdef SHELLMAGIC
134     extern const char e_prohibited[];
135 #endif /* SHELLMAGIC */
136 
137 #if SHOPT_ACCT
138 #   include	"FEATURE/acct"
139 #   ifdef	_sys_acct
140 	extern void sh_accinit(void);
141 	extern void sh_accbegin(const char*);
142 	extern void sh_accend(void);
143 	extern void sh_accsusp(void);
144 #   else
145 #	undef	SHOPT_ACCT
146 #   endif	/* _sys_acct */
147 #endif /* SHOPT_ACCT */
148 
149 #endif /*! PATH_OFFSET */
150