xref: /freebsd/contrib/tcsh/tc.os.c (revision c80476e4c3e6730697b9424f88dfa74d1907cabd)
1c80476e4SDavid E. O'Brien /* $Header: /src/pub/tcsh/tc.os.c,v 3.50 1998/10/25 15:10:35 christos Exp $ */
2c80476e4SDavid E. O'Brien /*
3c80476e4SDavid E. O'Brien  * tc.os.c: OS Dependent builtin functions
4c80476e4SDavid E. O'Brien  */
5c80476e4SDavid E. O'Brien /*-
6c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
7c80476e4SDavid E. O'Brien  * All rights reserved.
8c80476e4SDavid E. O'Brien  *
9c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
10c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
11c80476e4SDavid E. O'Brien  * are met:
12c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
13c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
14c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
15c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
16c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
17c80476e4SDavid E. O'Brien  * 3. All advertising materials mentioning features or use of this software
18c80476e4SDavid E. O'Brien  *    must display the following acknowledgement:
19c80476e4SDavid E. O'Brien  *	This product includes software developed by the University of
20c80476e4SDavid E. O'Brien  *	California, Berkeley and its contributors.
21c80476e4SDavid E. O'Brien  * 4. Neither the name of the University nor the names of its contributors
22c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
23c80476e4SDavid E. O'Brien  *    without specific prior written permission.
24c80476e4SDavid E. O'Brien  *
25c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
36c80476e4SDavid E. O'Brien  */
37c80476e4SDavid E. O'Brien #include "sh.h"
38c80476e4SDavid E. O'Brien 
39c80476e4SDavid E. O'Brien RCSID("$Id: tc.os.c,v 3.50 1998/10/25 15:10:35 christos Exp $")
40c80476e4SDavid E. O'Brien 
41c80476e4SDavid E. O'Brien #include "tw.h"
42c80476e4SDavid E. O'Brien #include "ed.h"
43c80476e4SDavid E. O'Brien #include "ed.defns.h"		/* for the function names */
44c80476e4SDavid E. O'Brien #include "sh.decls.h"
45c80476e4SDavid E. O'Brien 
46c80476e4SDavid E. O'Brien #ifdef _UWIN
47c80476e4SDavid E. O'Brien #define TIOCGPGRP TIOCGETPGRP
48c80476e4SDavid E. O'Brien #define TIOCSPGRP TIOCSETPGRP
49c80476e4SDavid E. O'Brien #endif
50c80476e4SDavid E. O'Brien 
51c80476e4SDavid E. O'Brien /***
52c80476e4SDavid E. O'Brien  *** MACH
53c80476e4SDavid E. O'Brien  ***/
54c80476e4SDavid E. O'Brien 
55c80476e4SDavid E. O'Brien #ifdef MACH
56c80476e4SDavid E. O'Brien /* dosetpath -- setpath built-in command
57c80476e4SDavid E. O'Brien  *
58c80476e4SDavid E. O'Brien  **********************************************************************
59c80476e4SDavid E. O'Brien  * HISTORY
60c80476e4SDavid E. O'Brien  * 08-May-88  Richard Draves (rpd) at Carnegie-Mellon University
61c80476e4SDavid E. O'Brien  *	Major changes to remove artificial limits on sizes and numbers
62c80476e4SDavid E. O'Brien  *	of paths.
63c80476e4SDavid E. O'Brien  *
64c80476e4SDavid E. O'Brien  **********************************************************************
65c80476e4SDavid E. O'Brien  */
66c80476e4SDavid E. O'Brien 
67c80476e4SDavid E. O'Brien #ifdef MACH
68c80476e4SDavid E. O'Brien static Char STRCPATH[] = {'C', 'P', 'A', 'T', 'H', '\0'};
69c80476e4SDavid E. O'Brien static Char STRLPATH[] = {'L', 'P', 'A', 'T', 'H', '\0'};
70c80476e4SDavid E. O'Brien static Char STRMPATH[] = {'M', 'P', 'A', 'T', 'H', '\0'};
71c80476e4SDavid E. O'Brien # if EPATH
72c80476e4SDavid E. O'Brien static Char STREPATH[] = {'E', 'P', 'A', 'T', 'H', '\0'};
73c80476e4SDavid E. O'Brien # endif
74c80476e4SDavid E. O'Brien #endif /* MACH */
75c80476e4SDavid E. O'Brien static Char *syspaths[] = {STRKPATH, STRCPATH, STRLPATH, STRMPATH,
76c80476e4SDavid E. O'Brien 
77c80476e4SDavid E. O'Brien #if EPATH
78c80476e4SDavid E. O'Brien 	STREPATH,
79c80476e4SDavid E. O'Brien #endif
80c80476e4SDavid E. O'Brien 	 0};
81c80476e4SDavid E. O'Brien #define LOCALSYSPATH	"/usr/local"
82c80476e4SDavid E. O'Brien 
83c80476e4SDavid E. O'Brien /*ARGSUSED*/
84c80476e4SDavid E. O'Brien void
85c80476e4SDavid E. O'Brien dosetpath(arglist, c)
86c80476e4SDavid E. O'Brien     Char  **arglist;
87c80476e4SDavid E. O'Brien     struct command *c;
88c80476e4SDavid E. O'Brien {
89c80476e4SDavid E. O'Brien     extern char *getenv();
90c80476e4SDavid E. O'Brien     sigmask_t omask;
91c80476e4SDavid E. O'Brien     Char  **pathvars, **cmdargs;
92c80476e4SDavid E. O'Brien     char  **spaths, **cpaths, **cmds;
93c80476e4SDavid E. O'Brien     char   *tcp;
94c80476e4SDavid E. O'Brien     unsigned int npaths, ncmds;
95c80476e4SDavid E. O'Brien     int     i, sysflag;
96c80476e4SDavid E. O'Brien 
97c80476e4SDavid E. O'Brien     omask = sigsetmask(sigmask(SIGINT));
98c80476e4SDavid E. O'Brien 
99c80476e4SDavid E. O'Brien     /*
100c80476e4SDavid E. O'Brien      * setpath(3) uses stdio and we want 0, 1, 2 to work...
101c80476e4SDavid E. O'Brien      */
102c80476e4SDavid E. O'Brien     if (!didfds) {
103c80476e4SDavid E. O'Brien 	(void) dcopy(SHIN, 0);
104c80476e4SDavid E. O'Brien 	(void) dcopy(SHOUT, 1);
105c80476e4SDavid E. O'Brien 	(void) dcopy(SHDIAG, 2);
106c80476e4SDavid E. O'Brien 	didfds = 1;
107c80476e4SDavid E. O'Brien     }
108c80476e4SDavid E. O'Brien 
109c80476e4SDavid E. O'Brien     for (i = 1; arglist[i] && (arglist[i][0] != '-'); i++);
110c80476e4SDavid E. O'Brien     npaths = i - 1;
111c80476e4SDavid E. O'Brien 
112c80476e4SDavid E. O'Brien     cmdargs = &arglist[i];
113c80476e4SDavid E. O'Brien     for (; arglist[i]; i++);
114c80476e4SDavid E. O'Brien     ncmds = i - npaths - 1;
115c80476e4SDavid E. O'Brien 
116c80476e4SDavid E. O'Brien     if (npaths) {
117c80476e4SDavid E. O'Brien 	sysflag = 0;
118c80476e4SDavid E. O'Brien 	pathvars = &arglist[1];
119c80476e4SDavid E. O'Brien     }
120c80476e4SDavid E. O'Brien     else {
121c80476e4SDavid E. O'Brien 	sysflag = 1;
122c80476e4SDavid E. O'Brien 	npaths = (sizeof syspaths / sizeof *syspaths) - 1;
123c80476e4SDavid E. O'Brien 	pathvars = syspaths;
124c80476e4SDavid E. O'Brien     }
125c80476e4SDavid E. O'Brien 
126c80476e4SDavid E. O'Brien     /* note that npaths != 0 */
127c80476e4SDavid E. O'Brien 
128c80476e4SDavid E. O'Brien     spaths = (char **) xmalloc((size_t) npaths * sizeof *spaths);
129c80476e4SDavid E. O'Brien     setzero((char *) spaths, npaths * sizeof *spaths);
130c80476e4SDavid E. O'Brien     cpaths = (char **) xmalloc((size_t) (npaths + 1) * sizeof *cpaths);
131c80476e4SDavid E. O'Brien     setzero((char *) cpaths, (npaths + 1) * sizeof *cpaths);
132c80476e4SDavid E. O'Brien     cmds = (char **) xmalloc((size_t) (ncmds + 1) * sizeof *cmds);
133c80476e4SDavid E. O'Brien     setzero((char *) cmds, (ncmds + 1) * sizeof *cmds);
134c80476e4SDavid E. O'Brien     for (i = 0; i < npaths; i++) {
135c80476e4SDavid E. O'Brien 	char   *val = getenv(short2str(pathvars[i]));
136c80476e4SDavid E. O'Brien 
137c80476e4SDavid E. O'Brien 	if (val == NULL)
138c80476e4SDavid E. O'Brien 	    val = "";
139c80476e4SDavid E. O'Brien 
140c80476e4SDavid E. O'Brien 	spaths[i] = (char *) xmalloc((size_t) (Strlen(pathvars[i]) +
141c80476e4SDavid E. O'Brien 				      strlen(val) + 2) * sizeof **spaths);
142c80476e4SDavid E. O'Brien 	(void) strcpy(spaths[i], short2str(pathvars[i]));
143c80476e4SDavid E. O'Brien 	(void) strcat(spaths[i], "=");
144c80476e4SDavid E. O'Brien 	(void) strcat(spaths[i], val);
145c80476e4SDavid E. O'Brien 	cpaths[i] = spaths[i];
146c80476e4SDavid E. O'Brien     }
147c80476e4SDavid E. O'Brien 
148c80476e4SDavid E. O'Brien     for (i = 0; i < ncmds; i++) {
149c80476e4SDavid E. O'Brien 	Char   *val = globone(cmdargs[i], G_ERROR);
150c80476e4SDavid E. O'Brien 
151c80476e4SDavid E. O'Brien 	if (val == NULL)
152c80476e4SDavid E. O'Brien 	    goto abortpath;
153c80476e4SDavid E. O'Brien 	cmds[i] = (char *) xmalloc((size_t) Strlen(val) + 1);
154c80476e4SDavid E. O'Brien 	(void) strcpy(cmds[i], short2str(val));
155c80476e4SDavid E. O'Brien     }
156c80476e4SDavid E. O'Brien 
157c80476e4SDavid E. O'Brien 
158c80476e4SDavid E. O'Brien     if (setpath(cpaths, cmds, LOCALSYSPATH, sysflag, 1) < 0) {
159c80476e4SDavid E. O'Brien abortpath:
160c80476e4SDavid E. O'Brien 	if (spaths) {
161c80476e4SDavid E. O'Brien 	    for (i = 0; i < npaths; i++)
162c80476e4SDavid E. O'Brien 		if (spaths[i])
163c80476e4SDavid E. O'Brien 		    xfree((ptr_t) spaths[i]);
164c80476e4SDavid E. O'Brien 	    xfree((ptr_t) spaths);
165c80476e4SDavid E. O'Brien 	}
166c80476e4SDavid E. O'Brien 	if (cpaths)
167c80476e4SDavid E. O'Brien 	    xfree((ptr_t) cpaths);
168c80476e4SDavid E. O'Brien 	if (cmds) {
169c80476e4SDavid E. O'Brien 	    for (i = 0; i < ncmds; i++)
170c80476e4SDavid E. O'Brien 		if (cmds[i])
171c80476e4SDavid E. O'Brien 		    xfree((ptr_t) cmds[i]);
172c80476e4SDavid E. O'Brien 	    xfree((ptr_t) cmds);
173c80476e4SDavid E. O'Brien 	}
174c80476e4SDavid E. O'Brien 
175c80476e4SDavid E. O'Brien 	(void) sigsetmask(omask);
176c80476e4SDavid E. O'Brien 	donefds();
177c80476e4SDavid E. O'Brien 	return;
178c80476e4SDavid E. O'Brien     }
179c80476e4SDavid E. O'Brien 
180c80476e4SDavid E. O'Brien     for (i = 0; i < npaths; i++) {
181c80476e4SDavid E. O'Brien 	Char	*val, *name;
182c80476e4SDavid E. O'Brien 
183c80476e4SDavid E. O'Brien 	name = str2short(cpaths[i]);
184c80476e4SDavid E. O'Brien 	for (val = str2short(cpaths[i]); val && *val && *val != '='; val++);
185c80476e4SDavid E. O'Brien 	if (val && *val == '=') {
186c80476e4SDavid E. O'Brien 	    *val++ = '\0';
187c80476e4SDavid E. O'Brien 
188c80476e4SDavid E. O'Brien 	    tsetenv(name, val);
189c80476e4SDavid E. O'Brien 	    if (Strcmp(name, STRKPATH) == 0) {
190c80476e4SDavid E. O'Brien 		importpath(val);
191c80476e4SDavid E. O'Brien 		if (havhash)
192c80476e4SDavid E. O'Brien 		    dohash(NULL, NULL);
193c80476e4SDavid E. O'Brien 	    }
194c80476e4SDavid E. O'Brien 	    *--val = '=';
195c80476e4SDavid E. O'Brien 	}
196c80476e4SDavid E. O'Brien     }
197c80476e4SDavid E. O'Brien     (void) sigsetmask(omask);
198c80476e4SDavid E. O'Brien     donefds();
199c80476e4SDavid E. O'Brien }
200c80476e4SDavid E. O'Brien #endif /* MACH */
201c80476e4SDavid E. O'Brien 
202c80476e4SDavid E. O'Brien /***
203c80476e4SDavid E. O'Brien  *** AIX
204c80476e4SDavid E. O'Brien  ***/
205c80476e4SDavid E. O'Brien #ifdef TCF
206c80476e4SDavid E. O'Brien /* ARGSUSED */
207c80476e4SDavid E. O'Brien void
208c80476e4SDavid E. O'Brien dogetxvers(v, c)
209c80476e4SDavid E. O'Brien     Char  **v;
210c80476e4SDavid E. O'Brien     struct command *c;
211c80476e4SDavid E. O'Brien {
212c80476e4SDavid E. O'Brien     char    xvers[MAXPATHLEN];
213c80476e4SDavid E. O'Brien 
214c80476e4SDavid E. O'Brien     if (getxvers(xvers, MAXPATHLEN) == -1)
215c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, "getxvers", strerror(errno));
216c80476e4SDavid E. O'Brien     xprintf("%s\n", xvers);
217c80476e4SDavid E. O'Brien     flush();
218c80476e4SDavid E. O'Brien }
219c80476e4SDavid E. O'Brien 
220c80476e4SDavid E. O'Brien /*ARGSUSED*/
221c80476e4SDavid E. O'Brien void
222c80476e4SDavid E. O'Brien dosetxvers(v, c)
223c80476e4SDavid E. O'Brien     Char  **v;
224c80476e4SDavid E. O'Brien     struct command *c;
225c80476e4SDavid E. O'Brien {
226c80476e4SDavid E. O'Brien     char   *xvers;
227c80476e4SDavid E. O'Brien 
228c80476e4SDavid E. O'Brien     ++v;
229c80476e4SDavid E. O'Brien     if (!*v || *v[0] == '\0')
230c80476e4SDavid E. O'Brien 	xvers = "";
231c80476e4SDavid E. O'Brien     else
232c80476e4SDavid E. O'Brien 	xvers = short2str(*v);
233c80476e4SDavid E. O'Brien     if (setxvers(xvers) == -1)
234c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, "setxvers", strerror(errno));
235c80476e4SDavid E. O'Brien }
236c80476e4SDavid E. O'Brien 
237c80476e4SDavid E. O'Brien #include <sf.h>
238c80476e4SDavid E. O'Brien #ifdef _AIXPS2
239c80476e4SDavid E. O'Brien # define XC_PDP11	0x01
240c80476e4SDavid E. O'Brien # define XC_23		0x02
241c80476e4SDavid E. O'Brien # define XC_Z8K		0x03
242c80476e4SDavid E. O'Brien # define XC_8086	0x04
243c80476e4SDavid E. O'Brien # define XC_68K		0x05
244c80476e4SDavid E. O'Brien # define XC_Z80		0x06
245c80476e4SDavid E. O'Brien # define XC_VAX		0x07
246c80476e4SDavid E. O'Brien # define XC_16032	0x08
247c80476e4SDavid E. O'Brien # define XC_286		0x09
248c80476e4SDavid E. O'Brien # define XC_386		0x0a
249c80476e4SDavid E. O'Brien # define XC_S370	0x0b
250c80476e4SDavid E. O'Brien #else
251c80476e4SDavid E. O'Brien # include <sys/x.out.h>
252c80476e4SDavid E. O'Brien #endif /* _AIXPS2 */
253c80476e4SDavid E. O'Brien 
254c80476e4SDavid E. O'Brien static struct xc_cpu_t {
255c80476e4SDavid E. O'Brien     short   xc_id;
256c80476e4SDavid E. O'Brien     char   *xc_name;
257c80476e4SDavid E. O'Brien }       xcpu[] =
258c80476e4SDavid E. O'Brien {
259c80476e4SDavid E. O'Brien     { XC_PDP11,	"pdp11"   },
260c80476e4SDavid E. O'Brien     { XC_23,	"i370"    },
261c80476e4SDavid E. O'Brien     { XC_Z8K,	"z8000"   },
262c80476e4SDavid E. O'Brien     { XC_8086,	"i86"	  },
263c80476e4SDavid E. O'Brien     { XC_68K,	"mc68000" },
264c80476e4SDavid E. O'Brien     { XC_Z80,	"x80"	  },
265c80476e4SDavid E. O'Brien     { XC_VAX,	"vax"	  },
266c80476e4SDavid E. O'Brien     { XC_16032,	"ns16032" },
267c80476e4SDavid E. O'Brien     { XC_286,	"i286"	  },
268c80476e4SDavid E. O'Brien     { XC_386,	"i386"	  },
269c80476e4SDavid E. O'Brien     { XC_S370,	"xa370"	  },
270c80476e4SDavid E. O'Brien     { 0,	NULL      }
271c80476e4SDavid E. O'Brien };
272c80476e4SDavid E. O'Brien 
273c80476e4SDavid E. O'Brien /*
274c80476e4SDavid E. O'Brien  * our local hack table, stolen from x.out.h
275c80476e4SDavid E. O'Brien  */
276c80476e4SDavid E. O'Brien static char *
277c80476e4SDavid E. O'Brien getxcode(xcid)
278c80476e4SDavid E. O'Brien     short   xcid;
279c80476e4SDavid E. O'Brien {
280c80476e4SDavid E. O'Brien     int     i;
281c80476e4SDavid E. O'Brien 
282c80476e4SDavid E. O'Brien     for (i = 0; xcpu[i].xc_name != NULL; i++)
283c80476e4SDavid E. O'Brien 	if (xcpu[i].xc_id == xcid)
284c80476e4SDavid E. O'Brien 	    return (xcpu[i].xc_name);
285c80476e4SDavid E. O'Brien     return (NULL);
286c80476e4SDavid E. O'Brien }
287c80476e4SDavid E. O'Brien 
288c80476e4SDavid E. O'Brien static short
289c80476e4SDavid E. O'Brien getxid(xcname)
290c80476e4SDavid E. O'Brien     char   *xcname;
291c80476e4SDavid E. O'Brien {
292c80476e4SDavid E. O'Brien     int     i;
293c80476e4SDavid E. O'Brien 
294c80476e4SDavid E. O'Brien     for (i = 0; xcpu[i].xc_name != NULL; i++)
295c80476e4SDavid E. O'Brien 	if (strcmp(xcpu[i].xc_name, xcname) == 0)
296c80476e4SDavid E. O'Brien 	    return (xcpu[i].xc_id);
297c80476e4SDavid E. O'Brien     return ((short) -1);
298c80476e4SDavid E. O'Brien }
299c80476e4SDavid E. O'Brien 
300c80476e4SDavid E. O'Brien 
301c80476e4SDavid E. O'Brien /*ARGSUSED*/
302c80476e4SDavid E. O'Brien void
303c80476e4SDavid E. O'Brien dogetspath(v, c)
304c80476e4SDavid E. O'Brien     Char  **v;
305c80476e4SDavid E. O'Brien     struct command *c;
306c80476e4SDavid E. O'Brien {
307c80476e4SDavid E. O'Brien     int     i, j;
308c80476e4SDavid E. O'Brien     sitepath_t p[MAXSITE];
309c80476e4SDavid E. O'Brien     struct sf *st;
310c80476e4SDavid E. O'Brien     static char *local = "LOCAL ";
311c80476e4SDavid E. O'Brien 
312c80476e4SDavid E. O'Brien     if ((j = getspath(p, MAXSITE)) == -1)
313c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, "getspath", strerror(errno));
314c80476e4SDavid E. O'Brien     for (i = 0; i < j && (p[i] & SPATH_CPU) != NOSITE; i++) {
315c80476e4SDavid E. O'Brien 	if (p[i] & SPATH_CPU) {
316c80476e4SDavid E. O'Brien 	    if ((p[i] & SPATH_MASK) == NULLSITE)
317c80476e4SDavid E. O'Brien 		xprintf(local);
318c80476e4SDavid E. O'Brien 	    else if ((st = sfxcode((short) (p[i] & SPATH_MASK))) != NULL)
319c80476e4SDavid E. O'Brien 		xprintf("%s ", st->sf_ctype);
320c80476e4SDavid E. O'Brien 	    else {
321c80476e4SDavid E. O'Brien 		char   *xc = getxcode(p[i] & SPATH_MASK);
322c80476e4SDavid E. O'Brien 
323c80476e4SDavid E. O'Brien 		if (xc != NULL)
324c80476e4SDavid E. O'Brien 		    xprintf("%s ", xc);
325c80476e4SDavid E. O'Brien 		else
326c80476e4SDavid E. O'Brien 		    xprintf("*cpu %d* ", (int) (p[i] & SPATH_MASK));
327c80476e4SDavid E. O'Brien 		/*
328c80476e4SDavid E. O'Brien 		 * BUG in the aix code... needs that cause if
329c80476e4SDavid E. O'Brien 		 * sfxcode fails once it fails for ever
330c80476e4SDavid E. O'Brien 		 */
331c80476e4SDavid E. O'Brien 		endsf();
332c80476e4SDavid E. O'Brien 	    }
333c80476e4SDavid E. O'Brien 	}
334c80476e4SDavid E. O'Brien 	else {
335c80476e4SDavid E. O'Brien 	    if (p[i] == NULLSITE)
336c80476e4SDavid E. O'Brien 		xprintf(local);
337c80476e4SDavid E. O'Brien 	    else if ((st = sfnum(p[i])) != NULL)
338c80476e4SDavid E. O'Brien 		xprintf("%s ", st->sf_sname);
339c80476e4SDavid E. O'Brien 	    else
340c80476e4SDavid E. O'Brien 		xprintf("*site %d* ", (int) (p[i] & SPATH_MASK));
341c80476e4SDavid E. O'Brien 	}
342c80476e4SDavid E. O'Brien     }
343c80476e4SDavid E. O'Brien     xputchar('\n');
344c80476e4SDavid E. O'Brien     flush();
345c80476e4SDavid E. O'Brien }
346c80476e4SDavid E. O'Brien 
347c80476e4SDavid E. O'Brien /*ARGSUSED*/
348c80476e4SDavid E. O'Brien void
349c80476e4SDavid E. O'Brien dosetspath(v, c)
350c80476e4SDavid E. O'Brien     Char  **v;
351c80476e4SDavid E. O'Brien     struct command *c;
352c80476e4SDavid E. O'Brien {
353c80476e4SDavid E. O'Brien     int     i;
354c80476e4SDavid E. O'Brien     short   j;
355c80476e4SDavid E. O'Brien     char   *s;
356c80476e4SDavid E. O'Brien     sitepath_t p[MAXSITE];
357c80476e4SDavid E. O'Brien     struct sf *st;
358c80476e4SDavid E. O'Brien 
359c80476e4SDavid E. O'Brien     /*
360c80476e4SDavid E. O'Brien      * sfname() on AIX G9.9 at least, mallocs too pointers p, q
361c80476e4SDavid E. O'Brien      * then does the equivalent of while (*p++ == *q++) continue;
362c80476e4SDavid E. O'Brien      * and then tries to free(p,q) them! Congrats to the wizard who
363c80476e4SDavid E. O'Brien      * wrote that one. I bet he tested it really well too.
364c80476e4SDavid E. O'Brien      * Sooo, we set dont_free :-)
365c80476e4SDavid E. O'Brien      */
366c80476e4SDavid E. O'Brien     dont_free = 1;
367c80476e4SDavid E. O'Brien     for (i = 0, v++; *v && *v[0] != '\0'; v++, i++) {
368c80476e4SDavid E. O'Brien 	s = short2str(*v);
369c80476e4SDavid E. O'Brien 	if (Isdigit(*s))
370c80476e4SDavid E. O'Brien 	    p[i] = atoi(s);
371c80476e4SDavid E. O'Brien 	else if (strcmp(s, "LOCAL") == 0)
372c80476e4SDavid E. O'Brien 	    p[i] = NULLSITE;
373c80476e4SDavid E. O'Brien 	else if ((st = sfctype(s)) != NULL)
374c80476e4SDavid E. O'Brien 	    p[i] = SPATH_CPU | st->sf_ccode;
375c80476e4SDavid E. O'Brien 	else if ((j = getxid(s)) != -1)
376c80476e4SDavid E. O'Brien 	    p[i] = SPATH_CPU | j;
377c80476e4SDavid E. O'Brien 	else if ((st = sfname(s)) != NULL)
378c80476e4SDavid E. O'Brien 	    p[i] = st->sf_id;
379c80476e4SDavid E. O'Brien 	else {
380c80476e4SDavid E. O'Brien 	    setname(s);
381c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 1, "Bad cpu/site name"));
382c80476e4SDavid E. O'Brien 	}
383c80476e4SDavid E. O'Brien 	if (i == MAXSITE - 1)
384c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 2, "Site path too long"));
385c80476e4SDavid E. O'Brien     }
386c80476e4SDavid E. O'Brien     if (setspath(p, i) == -1)
387c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, "setspath", strerror(errno));
388c80476e4SDavid E. O'Brien     dont_free = 0;
389c80476e4SDavid E. O'Brien }
390c80476e4SDavid E. O'Brien 
391c80476e4SDavid E. O'Brien /* sitename():
392c80476e4SDavid E. O'Brien  *	Return the site name where the process is running
393c80476e4SDavid E. O'Brien  */
394c80476e4SDavid E. O'Brien char   *
395c80476e4SDavid E. O'Brien sitename(pid)
396c80476e4SDavid E. O'Brien     pid_t   pid;
397c80476e4SDavid E. O'Brien {
398c80476e4SDavid E. O'Brien     siteno_t ss;
399c80476e4SDavid E. O'Brien     struct sf *st;
400c80476e4SDavid E. O'Brien 
401c80476e4SDavid E. O'Brien     if ((ss = site(pid)) == -1 || (st = sfnum(ss)) == NULL)
402c80476e4SDavid E. O'Brien 	return CGETS(23, 3, "unknown");
403c80476e4SDavid E. O'Brien     else
404c80476e4SDavid E. O'Brien 	return st->sf_sname;
405c80476e4SDavid E. O'Brien }
406c80476e4SDavid E. O'Brien 
407c80476e4SDavid E. O'Brien static int
408c80476e4SDavid E. O'Brien migratepid(pid, new_site)
409c80476e4SDavid E. O'Brien     pid_t   pid;
410c80476e4SDavid E. O'Brien     siteno_t new_site;
411c80476e4SDavid E. O'Brien {
412c80476e4SDavid E. O'Brien     struct sf *st;
413c80476e4SDavid E. O'Brien     int     need_local;
414c80476e4SDavid E. O'Brien 
415c80476e4SDavid E. O'Brien     need_local = (pid == 0) || (pid == getpid());
416c80476e4SDavid E. O'Brien 
417c80476e4SDavid E. O'Brien     if (kill3((pid_t) pid, SIGMIGRATE, new_site) < 0) {
418c80476e4SDavid E. O'Brien 	xprintf("%d: %s\n", pid, strerror(errno));
419c80476e4SDavid E. O'Brien 	return (-1);
420c80476e4SDavid E. O'Brien     }
421c80476e4SDavid E. O'Brien 
422c80476e4SDavid E. O'Brien     if (need_local) {
423c80476e4SDavid E. O'Brien 	if ((new_site = site(0)) == -1) {
424c80476e4SDavid E. O'Brien 	    xprintf(CGETS(23, 4, "site: %s\n"), strerror(errno));
425c80476e4SDavid E. O'Brien 	    return (-1);
426c80476e4SDavid E. O'Brien 	}
427c80476e4SDavid E. O'Brien 	if ((st = sfnum(new_site)) == NULL) {
428c80476e4SDavid E. O'Brien 	    xprintf(CGETS(23, 5, "%d: Site not found\n"), new_site);
429c80476e4SDavid E. O'Brien 	    return (-1);
430c80476e4SDavid E. O'Brien 	}
431c80476e4SDavid E. O'Brien 	if (setlocal(st->sf_local, strlen(st->sf_local)) == -1) {
432c80476e4SDavid E. O'Brien 	    xprintf(CGETS(23, 6, "setlocal: %s: %s\n"),
433c80476e4SDavid E. O'Brien 			  st->sf_local, strerror(errno));
434c80476e4SDavid E. O'Brien 	    return (-1);
435c80476e4SDavid E. O'Brien 	}
436c80476e4SDavid E. O'Brien     }
437c80476e4SDavid E. O'Brien     return (0);
438c80476e4SDavid E. O'Brien }
439c80476e4SDavid E. O'Brien 
440c80476e4SDavid E. O'Brien /*ARGSUSED*/
441c80476e4SDavid E. O'Brien void
442c80476e4SDavid E. O'Brien domigrate(v, c)
443c80476e4SDavid E. O'Brien     Char  **v;
444c80476e4SDavid E. O'Brien     struct command *c;
445c80476e4SDavid E. O'Brien {
446c80476e4SDavid E. O'Brien     struct sf *st;
447c80476e4SDavid E. O'Brien     char   *s;
448c80476e4SDavid E. O'Brien     Char   *cp;
449c80476e4SDavid E. O'Brien     struct process *pp;
450c80476e4SDavid E. O'Brien     int    err1 = 0;
451c80476e4SDavid E. O'Brien     int    pid = 0;
452c80476e4SDavid E. O'Brien     siteno_t new_site = 0;
453c80476e4SDavid E. O'Brien     sigmask_t omask;
454c80476e4SDavid E. O'Brien 
455c80476e4SDavid E. O'Brien #ifdef BSDSIGS
456c80476e4SDavid E. O'Brien     omask = sigmask(SIGCHLD);
457c80476e4SDavid E. O'Brien     if (setintr)
458c80476e4SDavid E. O'Brien 	omask |= sigmask(SIGINT);
459c80476e4SDavid E. O'Brien     omask = sigblock(omask) & ~omask;
460c80476e4SDavid E. O'Brien #else
461c80476e4SDavid E. O'Brien     if (setintr)
462c80476e4SDavid E. O'Brien 	(void) sighold(SIGINT);
463c80476e4SDavid E. O'Brien     (void) sighold(SIGCHLD);
464c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
465c80476e4SDavid E. O'Brien 
466c80476e4SDavid E. O'Brien     ++v;
467c80476e4SDavid E. O'Brien     if (*v[0] == '-') {
468c80476e4SDavid E. O'Brien 	/*
469c80476e4SDavid E. O'Brien 	 * Do the -site.
470c80476e4SDavid E. O'Brien 	 */
471c80476e4SDavid E. O'Brien 	s = short2str(&v[0][1]);
472c80476e4SDavid E. O'Brien 	/*
473c80476e4SDavid E. O'Brien 	 * see comment in setspath()
474c80476e4SDavid E. O'Brien 	 */
475c80476e4SDavid E. O'Brien 	dont_free = 1;
476c80476e4SDavid E. O'Brien 	if ((st = sfname(s)) == NULL) {
477c80476e4SDavid E. O'Brien 	    setname(s);
478c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 7, "Site not found"));
479c80476e4SDavid E. O'Brien 	}
480c80476e4SDavid E. O'Brien 	dont_free = 0;
481c80476e4SDavid E. O'Brien 	new_site = st->sf_id;
482c80476e4SDavid E. O'Brien 	++v;
483c80476e4SDavid E. O'Brien     }
484c80476e4SDavid E. O'Brien 
485c80476e4SDavid E. O'Brien     if (!*v || *v[0] == '\0') {
486c80476e4SDavid E. O'Brien 	if (migratepid(0, new_site) == -1)
487c80476e4SDavid E. O'Brien 	    err1++;
488c80476e4SDavid E. O'Brien     }
489c80476e4SDavid E. O'Brien     else {
490c80476e4SDavid E. O'Brien 	gflag = 0, tglob(v);
491c80476e4SDavid E. O'Brien 	if (gflag) {
492c80476e4SDavid E. O'Brien 	    v = globall(v);
493c80476e4SDavid E. O'Brien 	    if (v == 0)
494c80476e4SDavid E. O'Brien 		stderror(ERR_NAME | ERR_NOMATCH);
495c80476e4SDavid E. O'Brien 	}
496c80476e4SDavid E. O'Brien 	else {
497c80476e4SDavid E. O'Brien 	    v = gargv = saveblk(v);
498c80476e4SDavid E. O'Brien 	    trim(v);
499c80476e4SDavid E. O'Brien 	}
500c80476e4SDavid E. O'Brien 
501c80476e4SDavid E. O'Brien 	while (v && (cp = *v)) {
502c80476e4SDavid E. O'Brien 	    if (*cp == '%') {
503c80476e4SDavid E. O'Brien 		pp = pfind(cp);
504c80476e4SDavid E. O'Brien 		if (kill3((pid_t) - pp->p_jobid, SIGMIGRATE, new_site) < 0) {
505c80476e4SDavid E. O'Brien 		    xprintf("%S: %s\n", cp, strerror(errno));
506c80476e4SDavid E. O'Brien 		    err1++;
507c80476e4SDavid E. O'Brien 		}
508c80476e4SDavid E. O'Brien 	    }
509c80476e4SDavid E. O'Brien 	    else if (!(Isdigit(*cp) || *cp == '-'))
510c80476e4SDavid E. O'Brien 		stderror(ERR_NAME | ERR_JOBARGS);
511c80476e4SDavid E. O'Brien 	    else {
512c80476e4SDavid E. O'Brien 		pid = atoi(short2str(cp));
513c80476e4SDavid E. O'Brien 		if (migratepid(pid, new_site) == -1)
514c80476e4SDavid E. O'Brien 		    err1++;
515c80476e4SDavid E. O'Brien 	    }
516c80476e4SDavid E. O'Brien 	    v++;
517c80476e4SDavid E. O'Brien 	}
518c80476e4SDavid E. O'Brien 	if (gargv)
519c80476e4SDavid E. O'Brien 	    blkfree(gargv), gargv = 0;
520c80476e4SDavid E. O'Brien     }
521c80476e4SDavid E. O'Brien 
522c80476e4SDavid E. O'Brien done:
523c80476e4SDavid E. O'Brien #ifdef BSDSIGS
524c80476e4SDavid E. O'Brien     (void) sigsetmask(omask);
525c80476e4SDavid E. O'Brien #else
526c80476e4SDavid E. O'Brien     (void) sigrelse(SIGCHLD);
527c80476e4SDavid E. O'Brien     if (setintr)
528c80476e4SDavid E. O'Brien 	(void) sigrelse(SIGINT);
529c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
530c80476e4SDavid E. O'Brien     if (err1)
531c80476e4SDavid E. O'Brien 	stderror(ERR_SILENT);
532c80476e4SDavid E. O'Brien }
533c80476e4SDavid E. O'Brien 
534c80476e4SDavid E. O'Brien #endif /* TCF */
535c80476e4SDavid E. O'Brien 
536c80476e4SDavid E. O'Brien /***
537c80476e4SDavid E. O'Brien  *** CRAY ddmode <velo@sesun3.epfl.ch> (Martin Ouwehand EPFL-SIC/SE)
538c80476e4SDavid E. O'Brien  ***/
539c80476e4SDavid E. O'Brien #if defined(_CRAY) && !defined(_CRAYMPP)
540c80476e4SDavid E. O'Brien void
541c80476e4SDavid E. O'Brien dodmmode(v, c)
542c80476e4SDavid E. O'Brien     Char  **v;
543c80476e4SDavid E. O'Brien     struct command *c;
544c80476e4SDavid E. O'Brien {
545c80476e4SDavid E. O'Brien     Char *cp = v[1];
546c80476e4SDavid E. O'Brien 
547c80476e4SDavid E. O'Brien     USE(c);
548c80476e4SDavid E. O'Brien 
549c80476e4SDavid E. O'Brien     if ( !cp ) {
550c80476e4SDavid E. O'Brien 	int mode;
551c80476e4SDavid E. O'Brien 
552c80476e4SDavid E. O'Brien 	mode = dmmode(0);
553c80476e4SDavid E. O'Brien 	dmmode(mode);
554c80476e4SDavid E. O'Brien 	xprintf("%d\n",mode);
555c80476e4SDavid E. O'Brien     }
556c80476e4SDavid E. O'Brien     else {
557c80476e4SDavid E. O'Brien 	if (cp[1] != '\0')
558c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING,
559c80476e4SDavid E. O'Brien 		     CGETS(23, 30, "Too many arguments"));
560c80476e4SDavid E. O'Brien 	else
561c80476e4SDavid E. O'Brien 	    switch(*cp) {
562c80476e4SDavid E. O'Brien 	    case '0':
563c80476e4SDavid E. O'Brien 		dmmode(0);
564c80476e4SDavid E. O'Brien 		break;
565c80476e4SDavid E. O'Brien 	    case '1':
566c80476e4SDavid E. O'Brien 		dmmode(1);
567c80476e4SDavid E. O'Brien 		break;
568c80476e4SDavid E. O'Brien 	    default:
569c80476e4SDavid E. O'Brien 		stderror(ERR_NAME | ERR_STRING,
570c80476e4SDavid E. O'Brien 			 CGETS(23, 31, "Invalid argument"));
571c80476e4SDavid E. O'Brien 	    }
572c80476e4SDavid E. O'Brien     }
573c80476e4SDavid E. O'Brien }
574c80476e4SDavid E. O'Brien #endif /* _CRAY && !_CRAYMPP */
575c80476e4SDavid E. O'Brien 
576c80476e4SDavid E. O'Brien 
577c80476e4SDavid E. O'Brien /***
578c80476e4SDavid E. O'Brien  *** CONVEX Warps.
579c80476e4SDavid E. O'Brien  ***/
580c80476e4SDavid E. O'Brien 
581c80476e4SDavid E. O'Brien #ifdef WARP
582c80476e4SDavid E. O'Brien /*
583c80476e4SDavid E. O'Brien  * handle the funky warping of symlinks
584c80476e4SDavid E. O'Brien  */
585c80476e4SDavid E. O'Brien #include <warpdb.h>
586c80476e4SDavid E. O'Brien #include <sys/warp.h>
587c80476e4SDavid E. O'Brien 
588c80476e4SDavid E. O'Brien static jmp_buf sigsys_buf;
589c80476e4SDavid E. O'Brien 
590c80476e4SDavid E. O'Brien static  sigret_t
591c80476e4SDavid E. O'Brien catch_sigsys()
592c80476e4SDavid E. O'Brien {
593c80476e4SDavid E. O'Brien     longjmp(sigsys_buf, 1);
594c80476e4SDavid E. O'Brien }
595c80476e4SDavid E. O'Brien 
596c80476e4SDavid E. O'Brien 
597c80476e4SDavid E. O'Brien /*ARGSUSED*/
598c80476e4SDavid E. O'Brien void
599c80476e4SDavid E. O'Brien dowarp(v, c)
600c80476e4SDavid E. O'Brien     Char  **v;
601c80476e4SDavid E. O'Brien     struct command *c;
602c80476e4SDavid E. O'Brien {
603c80476e4SDavid E. O'Brien     int     warp, oldwarp;
604c80476e4SDavid E. O'Brien     struct warpent *we;
605c80476e4SDavid E. O'Brien     void    (*old_sigsys_handler) () = 0;
606c80476e4SDavid E. O'Brien     char   *newwarp;
607c80476e4SDavid E. O'Brien 
608c80476e4SDavid E. O'Brien     if (setjmp(sigsys_buf)) {
609c80476e4SDavid E. O'Brien 	signal(SIGSYS, old_sigsys_handler);
610c80476e4SDavid E. O'Brien 	stderror(ERR_NAME | ERR_STRING,
611c80476e4SDavid E. O'Brien 		 CGETS(23, 8, "You're trapped in a universe you never made"));
612c80476e4SDavid E. O'Brien 	return;
613c80476e4SDavid E. O'Brien     }
614c80476e4SDavid E. O'Brien     old_sigsys_handler = signal(SIGSYS, catch_sigsys);
615c80476e4SDavid E. O'Brien 
616c80476e4SDavid E. O'Brien     warp = getwarp();
617c80476e4SDavid E. O'Brien 
618c80476e4SDavid E. O'Brien     v++;
619c80476e4SDavid E. O'Brien     if (*v == 0) {		/* display warp value */
620c80476e4SDavid E. O'Brien 	if (warp < 0)
621c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 9, "Getwarp failed"));
622c80476e4SDavid E. O'Brien 	we = getwarpbyvalue(warp);
623c80476e4SDavid E. O'Brien 	if (we)
624c80476e4SDavid E. O'Brien 	    printf("%s\n", we->w_name);
625c80476e4SDavid E. O'Brien 	else
626c80476e4SDavid E. O'Brien 	    printf("%d\n", warp);
627c80476e4SDavid E. O'Brien     }
628c80476e4SDavid E. O'Brien     else {			/* set warp value */
629c80476e4SDavid E. O'Brien 	oldwarp = warp;
630c80476e4SDavid E. O'Brien 	newwarp = short2str(*v);
631c80476e4SDavid E. O'Brien 	if (Isdigit(*v[0]))
632c80476e4SDavid E. O'Brien 	    warp = atoi(newwarp);
633c80476e4SDavid E. O'Brien 	else {
634c80476e4SDavid E. O'Brien 	    we = getwarpbyname(newwarp);
635c80476e4SDavid E. O'Brien 	    if (we)
636c80476e4SDavid E. O'Brien 		warp = we->w_value;
637c80476e4SDavid E. O'Brien 	    else
638c80476e4SDavid E. O'Brien 		warp = -1;
639c80476e4SDavid E. O'Brien 	}
640c80476e4SDavid E. O'Brien 	if ((warp < 0) || (warp >= WARP_MAXLINK))
641c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 10, "Invalid warp"));
642c80476e4SDavid E. O'Brien 	if ((setwarp(warp) < 0) || (getwarp() != warp)) {
643c80476e4SDavid E. O'Brien 	    (void) setwarp(oldwarp);
644c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 11, "Setwarp failed"));
645c80476e4SDavid E. O'Brien 	}
646c80476e4SDavid E. O'Brien     }
647c80476e4SDavid E. O'Brien     signal(SIGSYS, old_sigsys_handler);
648c80476e4SDavid E. O'Brien     return;
649c80476e4SDavid E. O'Brien }
650c80476e4SDavid E. O'Brien #endif /* WARP */
651c80476e4SDavid E. O'Brien 
652c80476e4SDavid E. O'Brien /***
653c80476e4SDavid E. O'Brien  *** Masscomp or HCX
654c80476e4SDavid E. O'Brien  ***/
655c80476e4SDavid E. O'Brien /* Added, DAS DEC-90. */
656c80476e4SDavid E. O'Brien #if defined(masscomp) || defined(_CX_UX)
657c80476e4SDavid E. O'Brien /*ARGSUSED*/
658c80476e4SDavid E. O'Brien void
659c80476e4SDavid E. O'Brien douniverse(v, c)
660c80476e4SDavid E. O'Brien     register Char **v;
661c80476e4SDavid E. O'Brien     struct command *c;
662c80476e4SDavid E. O'Brien {
663c80476e4SDavid E. O'Brien     register Char *cp = v[1];
664c80476e4SDavid E. O'Brien     register Char *cp2;		/* dunno how many elements v comes in with */
665c80476e4SDavid E. O'Brien     char    ubuf[100];
666c80476e4SDavid E. O'Brien #ifdef BSDSIGS
667c80476e4SDavid E. O'Brien     register sigmask_t omask = 0;
668c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
669c80476e4SDavid E. O'Brien 
670c80476e4SDavid E. O'Brien     if (cp == 0) {
671c80476e4SDavid E. O'Brien 	(void) getuniverse(ubuf);
672c80476e4SDavid E. O'Brien 	xprintf("%s\n", ubuf);
673c80476e4SDavid E. O'Brien     }
674c80476e4SDavid E. O'Brien     else {
675c80476e4SDavid E. O'Brien 	cp2 = v[2];
676c80476e4SDavid E. O'Brien 	if (cp2 == 0) {
677c80476e4SDavid E. O'Brien 	    if (*cp == '\0' || setuniverse(short2str(cp)) != 0)
678c80476e4SDavid E. O'Brien 		stderror(ERR_NAME | ERR_STRING, CGETS(23, 12, "Illegal universe"));
679c80476e4SDavid E. O'Brien 	    }
680c80476e4SDavid E. O'Brien 	else {
681c80476e4SDavid E. O'Brien 	    (void) getuniverse(ubuf);
682c80476e4SDavid E. O'Brien 	    if (*cp == '\0' || setuniverse(short2str(cp)) != 0)
683c80476e4SDavid E. O'Brien 	stderror(ERR_NAME | ERR_STRING, CGETS(23, 12, "Illegal universe"));
684c80476e4SDavid E. O'Brien 	    if (setintr)
685c80476e4SDavid E. O'Brien #ifdef BSDSIGS
686c80476e4SDavid E. O'Brien 		omask = sigblock(sigmask(SIGINT)) & ~sigmask(SIGINT);
687c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
688c80476e4SDavid E. O'Brien 		(void) sighold(SIGINT);
689c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
690c80476e4SDavid E. O'Brien 	    lshift(v, 2);
691c80476e4SDavid E. O'Brien 	    if (setintr)
692c80476e4SDavid E. O'Brien #ifdef BSDSIGS
693c80476e4SDavid E. O'Brien 		(void) sigsetmask(omask);
694c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
695c80476e4SDavid E. O'Brien 		(void) sigrelse (SIGINT);
696c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
697c80476e4SDavid E. O'Brien 	    reexecute(c);
698c80476e4SDavid E. O'Brien 	    (void) setuniverse(ubuf);
699c80476e4SDavid E. O'Brien 	}
700c80476e4SDavid E. O'Brien     }
701c80476e4SDavid E. O'Brien }
702c80476e4SDavid E. O'Brien #endif /* masscomp || _CX_UX */
703c80476e4SDavid E. O'Brien 
704c80476e4SDavid E. O'Brien #if defined(_CX_UX)
705c80476e4SDavid E. O'Brien /*ARGSUSED*/
706c80476e4SDavid E. O'Brien void
707c80476e4SDavid E. O'Brien doatt(v, c)
708c80476e4SDavid E. O'Brien     register Char **v;
709c80476e4SDavid E. O'Brien     struct command *c;
710c80476e4SDavid E. O'Brien {
711c80476e4SDavid E. O'Brien     register Char *cp = v[1];
712c80476e4SDavid E. O'Brien     char    ubuf[100];
713c80476e4SDavid E. O'Brien #ifdef BSDSIGS
714c80476e4SDavid E. O'Brien     register sigmask_t omask = 0;
715c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
716c80476e4SDavid E. O'Brien 
717c80476e4SDavid E. O'Brien     if (cp == 0)
718c80476e4SDavid E. O'Brien 	(void) setuniverse("att");
719c80476e4SDavid E. O'Brien     else {
720c80476e4SDavid E. O'Brien 	(void) getuniverse(ubuf);
721c80476e4SDavid E. O'Brien 	(void) setuniverse("att");
722c80476e4SDavid E. O'Brien 	if (setintr)
723c80476e4SDavid E. O'Brien #ifdef BSDSIGS
724c80476e4SDavid E. O'Brien 	    omask = sigblock(sigmask(SIGINT)) & ~sigmask(SIGINT);
725c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
726c80476e4SDavid E. O'Brien 	    (void) sighold(SIGINT);
727c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
728c80476e4SDavid E. O'Brien 	lshift(v, 1);
729c80476e4SDavid E. O'Brien 	if (setintr)
730c80476e4SDavid E. O'Brien #ifdef BSDSIGS
731c80476e4SDavid E. O'Brien 	    (void) sigsetmask(omask);
732c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
733c80476e4SDavid E. O'Brien 	    (void) sigrelse (SIGINT);
734c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
735c80476e4SDavid E. O'Brien 	reexecute(c);
736c80476e4SDavid E. O'Brien 	(void) setuniverse(ubuf);
737c80476e4SDavid E. O'Brien     }
738c80476e4SDavid E. O'Brien }
739c80476e4SDavid E. O'Brien 
740c80476e4SDavid E. O'Brien /*ARGSUSED*/
741c80476e4SDavid E. O'Brien void
742c80476e4SDavid E. O'Brien doucb(v, c)
743c80476e4SDavid E. O'Brien     register Char **v;
744c80476e4SDavid E. O'Brien     struct command *c;
745c80476e4SDavid E. O'Brien {
746c80476e4SDavid E. O'Brien     register Char *cp = v[1];
747c80476e4SDavid E. O'Brien     char    ubuf[100];
748c80476e4SDavid E. O'Brien #ifdef BSDSIGS
749c80476e4SDavid E. O'Brien     register sigmask_t omask = 0;
750c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
751c80476e4SDavid E. O'Brien 
752c80476e4SDavid E. O'Brien     if (cp == 0)
753c80476e4SDavid E. O'Brien 	(void) setuniverse("ucb");
754c80476e4SDavid E. O'Brien     else {
755c80476e4SDavid E. O'Brien 	(void) getuniverse(ubuf);
756c80476e4SDavid E. O'Brien 	(void) setuniverse("ucb");
757c80476e4SDavid E. O'Brien 	if (setintr)
758c80476e4SDavid E. O'Brien #ifdef BSDSIGS
759c80476e4SDavid E. O'Brien 	    omask = sigblock(sigmask(SIGINT)) & ~sigmask(SIGINT);
760c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
761c80476e4SDavid E. O'Brien 	    (void) sighold(SIGINT);
762c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
763c80476e4SDavid E. O'Brien 	lshift(v, 1);
764c80476e4SDavid E. O'Brien 	if (setintr)
765c80476e4SDavid E. O'Brien #ifdef BSDSIGS
766c80476e4SDavid E. O'Brien 	    (void) sigsetmask(omask);
767c80476e4SDavid E. O'Brien #else /* !BSDSIGS */
768c80476e4SDavid E. O'Brien 	    (void) sigrelse (SIGINT);
769c80476e4SDavid E. O'Brien #endif /* BSDSIGS */
770c80476e4SDavid E. O'Brien 	reexecute(c);
771c80476e4SDavid E. O'Brien 	(void) setuniverse(ubuf);
772c80476e4SDavid E. O'Brien     }
773c80476e4SDavid E. O'Brien }
774c80476e4SDavid E. O'Brien #endif /* _CX_UX */
775c80476e4SDavid E. O'Brien 
776c80476e4SDavid E. O'Brien #ifdef _SEQUENT_
777c80476e4SDavid E. O'Brien /*
778c80476e4SDavid E. O'Brien  * Compute the difference in process stats.
779c80476e4SDavid E. O'Brien  */
780c80476e4SDavid E. O'Brien void
781c80476e4SDavid E. O'Brien pr_stat_sub(p2, p1, pr)
782c80476e4SDavid E. O'Brien     struct process_stats *p2, *p1, *pr;
783c80476e4SDavid E. O'Brien {
784c80476e4SDavid E. O'Brien     pr->ps_utime.tv_sec = p2->ps_utime.tv_sec - p1->ps_utime.tv_sec;
785c80476e4SDavid E. O'Brien     pr->ps_utime.tv_usec = p2->ps_utime.tv_usec - p1->ps_utime.tv_usec;
786c80476e4SDavid E. O'Brien     if (pr->ps_utime.tv_usec < 0) {
787c80476e4SDavid E. O'Brien 	pr->ps_utime.tv_sec -= 1;
788c80476e4SDavid E. O'Brien 	pr->ps_utime.tv_usec += 1000000;
789c80476e4SDavid E. O'Brien     }
790c80476e4SDavid E. O'Brien     pr->ps_stime.tv_sec = p2->ps_stime.tv_sec - p1->ps_stime.tv_sec;
791c80476e4SDavid E. O'Brien     pr->ps_stime.tv_usec = p2->ps_stime.tv_usec - p1->ps_stime.tv_usec;
792c80476e4SDavid E. O'Brien     if (pr->ps_stime.tv_usec < 0) {
793c80476e4SDavid E. O'Brien 	pr->ps_stime.tv_sec -= 1;
794c80476e4SDavid E. O'Brien 	pr->ps_stime.tv_usec += 1000000;
795c80476e4SDavid E. O'Brien     }
796c80476e4SDavid E. O'Brien 
797c80476e4SDavid E. O'Brien     pr->ps_maxrss = p2->ps_maxrss - p1->ps_maxrss;
798c80476e4SDavid E. O'Brien     pr->ps_pagein = p2->ps_pagein - p1->ps_pagein;
799c80476e4SDavid E. O'Brien     pr->ps_reclaim = p2->ps_reclaim - p1->ps_reclaim;
800c80476e4SDavid E. O'Brien     pr->ps_zerofill = p2->ps_zerofill - p1->ps_zerofill;
801c80476e4SDavid E. O'Brien     pr->ps_pffincr = p2->ps_pffincr - p1->ps_pffincr;
802c80476e4SDavid E. O'Brien     pr->ps_pffdecr = p2->ps_pffdecr - p1->ps_pffdecr;
803c80476e4SDavid E. O'Brien     pr->ps_swap = p2->ps_swap - p1->ps_swap;
804c80476e4SDavid E. O'Brien     pr->ps_syscall = p2->ps_syscall - p1->ps_syscall;
805c80476e4SDavid E. O'Brien     pr->ps_volcsw = p2->ps_volcsw - p1->ps_volcsw;
806c80476e4SDavid E. O'Brien     pr->ps_involcsw = p2->ps_involcsw - p1->ps_involcsw;
807c80476e4SDavid E. O'Brien     pr->ps_signal = p2->ps_signal - p1->ps_signal;
808c80476e4SDavid E. O'Brien     pr->ps_lread = p2->ps_lread - p1->ps_lread;
809c80476e4SDavid E. O'Brien     pr->ps_lwrite = p2->ps_lwrite - p1->ps_lwrite;
810c80476e4SDavid E. O'Brien     pr->ps_bread = p2->ps_bread - p1->ps_bread;
811c80476e4SDavid E. O'Brien     pr->ps_bwrite = p2->ps_bwrite - p1->ps_bwrite;
812c80476e4SDavid E. O'Brien     pr->ps_phread = p2->ps_phread - p1->ps_phread;
813c80476e4SDavid E. O'Brien     pr->ps_phwrite = p2->ps_phwrite - p1->ps_phwrite;
814c80476e4SDavid E. O'Brien }
815c80476e4SDavid E. O'Brien 
816c80476e4SDavid E. O'Brien #endif /* _SEQUENT_ */
817c80476e4SDavid E. O'Brien 
818c80476e4SDavid E. O'Brien 
819c80476e4SDavid E. O'Brien #ifdef NEEDmemset
820c80476e4SDavid E. O'Brien /* This is a replacement for a missing memset function */
821c80476e4SDavid E. O'Brien ptr_t xmemset(loc, value, len)
822c80476e4SDavid E. O'Brien     ptr_t loc;
823c80476e4SDavid E. O'Brien     int len;
824c80476e4SDavid E. O'Brien     size_t value;
825c80476e4SDavid E. O'Brien {
826c80476e4SDavid E. O'Brien     char *ptr = (char *) loc;
827c80476e4SDavid E. O'Brien 
828c80476e4SDavid E. O'Brien     while (len--)
829c80476e4SDavid E. O'Brien 	*ptr++ = value;
830c80476e4SDavid E. O'Brien     return loc;
831c80476e4SDavid E. O'Brien }
832c80476e4SDavid E. O'Brien #endif /* NEEDmemset */
833c80476e4SDavid E. O'Brien 
834c80476e4SDavid E. O'Brien 
835c80476e4SDavid E. O'Brien #ifdef NEEDmemmove
836c80476e4SDavid E. O'Brien /* memmove():
837c80476e4SDavid E. O'Brien  * 	This is the ANSI form of bcopy() with the arguments backwards...
838c80476e4SDavid E. O'Brien  *	Unlike memcpy(), it handles overlaps between source and
839c80476e4SDavid E. O'Brien  *	destination memory
840c80476e4SDavid E. O'Brien  */
841c80476e4SDavid E. O'Brien ptr_t
842c80476e4SDavid E. O'Brien xmemmove(vdst, vsrc, len)
843c80476e4SDavid E. O'Brien     ptr_t vdst;
844c80476e4SDavid E. O'Brien     const ptr_t vsrc;
845c80476e4SDavid E. O'Brien     size_t len;
846c80476e4SDavid E. O'Brien {
847c80476e4SDavid E. O'Brien     const char *src = (const char *) vsrc;
848c80476e4SDavid E. O'Brien     char *dst = (char *) vdst;
849c80476e4SDavid E. O'Brien 
850c80476e4SDavid E. O'Brien     if (src == dst)
851c80476e4SDavid E. O'Brien 	return vdst;
852c80476e4SDavid E. O'Brien 
853c80476e4SDavid E. O'Brien     if (src > dst) {
854c80476e4SDavid E. O'Brien 	while (len--)
855c80476e4SDavid E. O'Brien 	    *dst++ = *src++;
856c80476e4SDavid E. O'Brien     }
857c80476e4SDavid E. O'Brien     else {
858c80476e4SDavid E. O'Brien 	src += len;
859c80476e4SDavid E. O'Brien 	dst += len;
860c80476e4SDavid E. O'Brien 	while (len--)
861c80476e4SDavid E. O'Brien 	    *--dst = *--src;
862c80476e4SDavid E. O'Brien     }
863c80476e4SDavid E. O'Brien     return vdst;
864c80476e4SDavid E. O'Brien }
865c80476e4SDavid E. O'Brien #endif /* NEEDmemmove */
866c80476e4SDavid E. O'Brien 
867c80476e4SDavid E. O'Brien 
868c80476e4SDavid E. O'Brien #ifndef WINNT
869c80476e4SDavid E. O'Brien #ifdef tcgetpgrp
870c80476e4SDavid E. O'Brien int
871c80476e4SDavid E. O'Brien xtcgetpgrp(fd)
872c80476e4SDavid E. O'Brien     int     fd;
873c80476e4SDavid E. O'Brien {
874c80476e4SDavid E. O'Brien     int     pgrp;
875c80476e4SDavid E. O'Brien 
876c80476e4SDavid E. O'Brien     /* ioctl will handle setting errno correctly. */
877c80476e4SDavid E. O'Brien     if (ioctl(fd, TIOCGPGRP, (ioctl_t) & pgrp) < 0)
878c80476e4SDavid E. O'Brien 	return (-1);
879c80476e4SDavid E. O'Brien     return (pgrp);
880c80476e4SDavid E. O'Brien }
881c80476e4SDavid E. O'Brien 
882c80476e4SDavid E. O'Brien /*
883c80476e4SDavid E. O'Brien  * XXX: tcsetpgrp is not a macro any more cause on some systems,
884c80476e4SDavid E. O'Brien  * pid_t is a short, but the ioctl() takes a pointer to int (pyr)
885c80476e4SDavid E. O'Brien  * Thanks to Simon Day (simon@pharaoh.cyborg.bt.co.uk) for pointing
886c80476e4SDavid E. O'Brien  * this out.
887c80476e4SDavid E. O'Brien  */
888c80476e4SDavid E. O'Brien int
889c80476e4SDavid E. O'Brien xtcsetpgrp(fd, pgrp)
890c80476e4SDavid E. O'Brien     int fd, pgrp;
891c80476e4SDavid E. O'Brien {
892c80476e4SDavid E. O'Brien     return ioctl(fd, TIOCSPGRP, (ioctl_t) &pgrp);
893c80476e4SDavid E. O'Brien }
894c80476e4SDavid E. O'Brien 
895c80476e4SDavid E. O'Brien #endif	/* tcgetpgrp */
896c80476e4SDavid E. O'Brien #endif /* WINNT */
897c80476e4SDavid E. O'Brien 
898c80476e4SDavid E. O'Brien 
899c80476e4SDavid E. O'Brien #ifdef YPBUGS
900c80476e4SDavid E. O'Brien void
901c80476e4SDavid E. O'Brien fix_yp_bugs()
902c80476e4SDavid E. O'Brien {
903c80476e4SDavid E. O'Brien     char   *mydomain;
904c80476e4SDavid E. O'Brien 
905c80476e4SDavid E. O'Brien     extern int yp_get_default_domain __P((char **));
906c80476e4SDavid E. O'Brien     /*
907c80476e4SDavid E. O'Brien      * PWP: The previous version assumed that yp domain was the same as the
908c80476e4SDavid E. O'Brien      * internet name domain.  This isn't allways true. (Thanks to Mat Landau
909c80476e4SDavid E. O'Brien      * <mlandau@bbn.com> for the original version of this.)
910c80476e4SDavid E. O'Brien      */
911c80476e4SDavid E. O'Brien     if (yp_get_default_domain(&mydomain) == 0) {	/* if we got a name */
912c80476e4SDavid E. O'Brien 	extern void yp_unbind __P((const char *));
913c80476e4SDavid E. O'Brien 
914c80476e4SDavid E. O'Brien 	yp_unbind(mydomain);
915c80476e4SDavid E. O'Brien     }
916c80476e4SDavid E. O'Brien }
917c80476e4SDavid E. O'Brien 
918c80476e4SDavid E. O'Brien #endif /* YPBUGS */
919c80476e4SDavid E. O'Brien 
920c80476e4SDavid E. O'Brien #ifdef STRCOLLBUG
921c80476e4SDavid E. O'Brien void
922c80476e4SDavid E. O'Brien fix_strcoll_bug()
923c80476e4SDavid E. O'Brien {
924c80476e4SDavid E. O'Brien #if defined(NLS) && !defined(NOSTRCOLL)
925c80476e4SDavid E. O'Brien     /*
926c80476e4SDavid E. O'Brien      * SunOS4 checks the file descriptor from openlocale() for <= 0
927c80476e4SDavid E. O'Brien      * instead of == -1. Someone should tell sun that file descriptor 0
928c80476e4SDavid E. O'Brien      * is valid! Our portable hack: open one so we call it with 0 used...
929c80476e4SDavid E. O'Brien      * We have to call this routine every time the locale changes...
930c80476e4SDavid E. O'Brien      *
931c80476e4SDavid E. O'Brien      * Of course it also tries to free the constant locale "C" it initially
932c80476e4SDavid E. O'Brien      * had allocated, with the sequence
933c80476e4SDavid E. O'Brien      * > setenv LANG "fr"
934c80476e4SDavid E. O'Brien      * > ls^D
935c80476e4SDavid E. O'Brien      * > unsetenv LANG
936c80476e4SDavid E. O'Brien      * But we are smarter than that and just print a warning message.
937c80476e4SDavid E. O'Brien      */
938c80476e4SDavid E. O'Brien     int fd = -1;
939c80476e4SDavid E. O'Brien     static char *root = "/";
940c80476e4SDavid E. O'Brien 
941c80476e4SDavid E. O'Brien     if (!didfds)
942c80476e4SDavid E. O'Brien 	fd = open(root, O_RDONLY);
943c80476e4SDavid E. O'Brien 
944c80476e4SDavid E. O'Brien     (void) strcoll(root, root);
945c80476e4SDavid E. O'Brien 
946c80476e4SDavid E. O'Brien     if (fd != -1)
947c80476e4SDavid E. O'Brien 	(void) close(fd);
948c80476e4SDavid E. O'Brien #endif
949c80476e4SDavid E. O'Brien }
950c80476e4SDavid E. O'Brien #endif /* STRCOLLBUG */
951c80476e4SDavid E. O'Brien 
952c80476e4SDavid E. O'Brien 
953c80476e4SDavid E. O'Brien #ifdef OREO
954c80476e4SDavid E. O'Brien #include <compat.h>
955c80476e4SDavid E. O'Brien #endif /* OREO */
956c80476e4SDavid E. O'Brien 
957c80476e4SDavid E. O'Brien void
958c80476e4SDavid E. O'Brien osinit()
959c80476e4SDavid E. O'Brien {
960c80476e4SDavid E. O'Brien #ifdef OREO
961c80476e4SDavid E. O'Brien     set42sig();
962c80476e4SDavid E. O'Brien     setcompat(getcompat() & ~COMPAT_EXEC);
963c80476e4SDavid E. O'Brien     sigignore(SIGIO);		/* ignore SIGIO */
964c80476e4SDavid E. O'Brien #endif /* OREO */
965c80476e4SDavid E. O'Brien 
966c80476e4SDavid E. O'Brien #ifdef aiws
967c80476e4SDavid E. O'Brien     {
968c80476e4SDavid E. O'Brien 	struct sigstack inst;
969c80476e4SDavid E. O'Brien 	inst.ss_sp = (char *) xmalloc((size_t) 4192) + 4192;
970c80476e4SDavid E. O'Brien 	inst.ss_onstack = 0;
971c80476e4SDavid E. O'Brien 	sigstack(&inst, NULL);
972c80476e4SDavid E. O'Brien     }
973c80476e4SDavid E. O'Brien #endif /* aiws */
974c80476e4SDavid E. O'Brien 
975c80476e4SDavid E. O'Brien #ifdef apollo
976c80476e4SDavid E. O'Brien     (void) isapad();
977c80476e4SDavid E. O'Brien #endif
978c80476e4SDavid E. O'Brien 
979c80476e4SDavid E. O'Brien #ifdef _SX
980c80476e4SDavid E. O'Brien     /*
981c80476e4SDavid E. O'Brien      * kill(SIGCONT) problems, don't know what this syscall does
982c80476e4SDavid E. O'Brien      * [schott@rzg.mpg.de]
983c80476e4SDavid E. O'Brien      */
984c80476e4SDavid E. O'Brien     syscall(151, getpid(), getpid());
985c80476e4SDavid E. O'Brien #endif /* _SX */
986c80476e4SDavid E. O'Brien }
987c80476e4SDavid E. O'Brien 
988c80476e4SDavid E. O'Brien #ifdef strerror
989c80476e4SDavid E. O'Brien char *
990c80476e4SDavid E. O'Brien xstrerror(i)
991c80476e4SDavid E. O'Brien     int i;
992c80476e4SDavid E. O'Brien {
993c80476e4SDavid E. O'Brien     static char errbuf[128];
994c80476e4SDavid E. O'Brien 
995c80476e4SDavid E. O'Brien     if (i >= 0 && i < sys_nerr) {
996c80476e4SDavid E. O'Brien 	return sys_errlist[i];
997c80476e4SDavid E. O'Brien     } else {
998c80476e4SDavid E. O'Brien 	(void) xsnprintf(errbuf, sizeof(errbuf),
999c80476e4SDavid E. O'Brien 	    CGETS(23, 13, "Unknown Error: %d"), i);
1000c80476e4SDavid E. O'Brien 	return errbuf;
1001c80476e4SDavid E. O'Brien     }
1002c80476e4SDavid E. O'Brien }
1003c80476e4SDavid E. O'Brien #endif /* strerror */
1004c80476e4SDavid E. O'Brien 
1005c80476e4SDavid E. O'Brien #ifdef gethostname
1006c80476e4SDavid E. O'Brien # if !defined(_MINIX) && !defined(__EMX__) && !defined(WINNT)
1007c80476e4SDavid E. O'Brien #  include <sys/utsname.h>
1008c80476e4SDavid E. O'Brien # endif /* !_MINIX && !__EMX__ && !WINNT */
1009c80476e4SDavid E. O'Brien 
1010c80476e4SDavid E. O'Brien int
1011c80476e4SDavid E. O'Brien xgethostname(name, namlen)
1012c80476e4SDavid E. O'Brien     char   *name;
1013c80476e4SDavid E. O'Brien     int     namlen;
1014c80476e4SDavid E. O'Brien {
1015c80476e4SDavid E. O'Brien # if !defined(_MINIX) && !defined(__EMX__) && !defined(WINNT)
1016c80476e4SDavid E. O'Brien     int     i, retval;
1017c80476e4SDavid E. O'Brien     struct utsname uts;
1018c80476e4SDavid E. O'Brien 
1019c80476e4SDavid E. O'Brien     retval = uname(&uts);
1020c80476e4SDavid E. O'Brien 
1021c80476e4SDavid E. O'Brien #  ifdef DEBUG
1022c80476e4SDavid E. O'Brien     xprintf(CGETS(23, 14, "sysname:  %s\n"), uts.sysname);
1023c80476e4SDavid E. O'Brien     xprintf(CGETS(23, 15, "nodename: %s\n"), uts.nodename);
1024c80476e4SDavid E. O'Brien     xprintf(CGETS(23, 16, "release:  %s\n"), uts.release);
1025c80476e4SDavid E. O'Brien     xprintf(CGETS(23, 17, "version:  %s\n"), uts.version);
1026c80476e4SDavid E. O'Brien     xprintf(CGETS(23, 18, "machine:  %s\n"), uts.machine);
1027c80476e4SDavid E. O'Brien #  endif /* DEBUG */
1028c80476e4SDavid E. O'Brien     i = strlen(uts.nodename) + 1;
1029c80476e4SDavid E. O'Brien     (void) strncpy(name, uts.nodename, i < namlen ? i : namlen);
1030c80476e4SDavid E. O'Brien 
1031c80476e4SDavid E. O'Brien     return retval;
1032c80476e4SDavid E. O'Brien # else /* !_MINIX && !__EMX__ */
1033c80476e4SDavid E. O'Brien     if (namlen > 0) {
1034c80476e4SDavid E. O'Brien #  ifdef __EMX__
1035c80476e4SDavid E. O'Brien 	(void) strncpy(name, "OS/2", namlen);
1036c80476e4SDavid E. O'Brien #  else /* _MINIX */
1037c80476e4SDavid E. O'Brien 	(void) strncpy(name, "minix", namlen);
1038c80476e4SDavid E. O'Brien #  endif /* __EMX__ */
1039c80476e4SDavid E. O'Brien 	name[namlen-1] = '\0';
1040c80476e4SDavid E. O'Brien     }
1041c80476e4SDavid E. O'Brien     return(0);
1042c80476e4SDavid E. O'Brien #endif /* _MINIX && !__EMX__ */
1043c80476e4SDavid E. O'Brien } /* end xgethostname */
1044c80476e4SDavid E. O'Brien #endif /* gethostname */
1045c80476e4SDavid E. O'Brien 
1046c80476e4SDavid E. O'Brien #ifdef nice
1047c80476e4SDavid E. O'Brien # if defined(_MINIX) && defined(NICE)
1048c80476e4SDavid E. O'Brien #  undef _POSIX_SOURCE	/* redefined in <lib.h> */
1049c80476e4SDavid E. O'Brien #  undef _MINIX		/* redefined in <lib.h> */
1050c80476e4SDavid E. O'Brien #  undef HZ		/* redefined in <minix/const.h> */
1051c80476e4SDavid E. O'Brien #  include <lib.h>
1052c80476e4SDavid E. O'Brien # endif /* _MINIX && NICE */
1053c80476e4SDavid E. O'Brien int
1054c80476e4SDavid E. O'Brien xnice(incr)
1055c80476e4SDavid E. O'Brien     int incr;
1056c80476e4SDavid E. O'Brien {
1057c80476e4SDavid E. O'Brien #if defined(_MINIX) && defined(NICE)
1058c80476e4SDavid E. O'Brien     return callm1(MM, NICE, incr, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR);
1059c80476e4SDavid E. O'Brien #else
1060c80476e4SDavid E. O'Brien     return /* incr ? 0 : */ 0;
1061c80476e4SDavid E. O'Brien #endif /* _MINIX && NICE */
1062c80476e4SDavid E. O'Brien } /* end xnice */
1063c80476e4SDavid E. O'Brien #endif /* nice */
1064c80476e4SDavid E. O'Brien 
1065c80476e4SDavid E. O'Brien #ifdef NEEDgetcwd
1066c80476e4SDavid E. O'Brien static char *strnrcpy __P((char *, char *, size_t));
1067c80476e4SDavid E. O'Brien 
1068c80476e4SDavid E. O'Brien /* xgetcwd():
1069c80476e4SDavid E. O'Brien  *	Return the pathname of the current directory, or return
1070c80476e4SDavid E. O'Brien  *	an error message in pathname.
1071c80476e4SDavid E. O'Brien  */
1072c80476e4SDavid E. O'Brien 
1073c80476e4SDavid E. O'Brien # ifdef hp9000s500
1074c80476e4SDavid E. O'Brien /*
1075c80476e4SDavid E. O'Brien  *  From: Bernd Mohr <mohr@faui77.informatik.uni-erlangen.de>
1076c80476e4SDavid E. O'Brien  *  I also ported the tcsh to the HP9000 Series 500. This computer
1077c80476e4SDavid E. O'Brien  *  is a little bit different than the other HP 9000 computer. It has
1078c80476e4SDavid E. O'Brien  *  a HP Chip instead of a Motorola CPU and it is no "real" UNIX. It runs
1079c80476e4SDavid E. O'Brien  *  HP-UX which is emulated in top of a HP operating system. So, the last
1080c80476e4SDavid E. O'Brien  *  supported version of HP-UX is 5.2 on the HP9000s500. This has two
1081c80476e4SDavid E. O'Brien  *  consequences: it supports no job control and it has a filesystem
1082c80476e4SDavid E. O'Brien  *  without "." and ".." !!!
1083c80476e4SDavid E. O'Brien  */
1084c80476e4SDavid E. O'Brien char *
1085c80476e4SDavid E. O'Brien xgetcwd(pathname, pathlen)
1086c80476e4SDavid E. O'Brien     char *pathname;
1087c80476e4SDavid E. O'Brien     size_t pathlen;
1088c80476e4SDavid E. O'Brien {
1089c80476e4SDavid E. O'Brien     char pathbuf[MAXNAMLEN];	/* temporary pathname buffer */
1090c80476e4SDavid E. O'Brien     char *pnptr = &pathbuf[(sizeof pathbuf)-1]; /* pathname pointer */
1091c80476e4SDavid E. O'Brien     dev_t rdev;			/* root device number */
1092c80476e4SDavid E. O'Brien     DIR *dirp = NULL;		/* directory stream */
1093c80476e4SDavid E. O'Brien     ino_t rino;			/* root inode number */
1094c80476e4SDavid E. O'Brien     off_t rsize;		/* root size */
1095c80476e4SDavid E. O'Brien     struct direct *dir;		/* directory entry struct */
1096c80476e4SDavid E. O'Brien     struct stat d, dd;		/* file status struct */
1097c80476e4SDavid E. O'Brien     int serrno;
1098c80476e4SDavid E. O'Brien 
1099c80476e4SDavid E. O'Brien     *pnptr = '\0';
1100c80476e4SDavid E. O'Brien     (void) stat("/.", &d);
1101c80476e4SDavid E. O'Brien     rdev = d.st_dev;
1102c80476e4SDavid E. O'Brien     rino = d.st_ino;
1103c80476e4SDavid E. O'Brien     rsize = d.st_size;
1104c80476e4SDavid E. O'Brien     for (;;) {
1105c80476e4SDavid E. O'Brien 	if (stat(".", &d) == -1) {
1106c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 24,
1107c80476e4SDavid E. O'Brien 		"getcwd: Cannot stat \".\" (%s)"), strerror(errno));
1108c80476e4SDavid E. O'Brien 	    goto fail;
1109c80476e4SDavid E. O'Brien 	}
1110c80476e4SDavid E. O'Brien 	if (d.st_ino == rino && d.st_dev == rdev && d.st_size == rsize)
1111c80476e4SDavid E. O'Brien 	    break;		/* reached root directory */
1112c80476e4SDavid E. O'Brien 	if ((dirp = opendir("..")) == NULL) {
1113c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 19,
1114c80476e4SDavid E. O'Brien 		"getcwd: Cannot open \"..\" (%s)"), strerror(errno));
1115c80476e4SDavid E. O'Brien 	    goto fail;
1116c80476e4SDavid E. O'Brien 	}
1117c80476e4SDavid E. O'Brien 	if (chdir("..") == -1) {
1118c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 20,
1119c80476e4SDavid E. O'Brien 		"getcwd: Cannot chdir to \"..\" (%s)"), strerror(errno));
1120c80476e4SDavid E. O'Brien 	    goto fail;
1121c80476e4SDavid E. O'Brien 	}
1122c80476e4SDavid E. O'Brien 	do {
1123c80476e4SDavid E. O'Brien 	    if ((dir = readdir(dirp)) == NULL) {
1124c80476e4SDavid E. O'Brien 		(void) xsnprintf(pathname, pathlen,
1125c80476e4SDavid E. O'Brien 		    CGETS(23, 21, "getcwd: Read error in \"..\" (%s)"),
1126c80476e4SDavid E. O'Brien 		    strerror(errno));
1127c80476e4SDavid E. O'Brien 		goto fail;
1128c80476e4SDavid E. O'Brien 	    }
1129c80476e4SDavid E. O'Brien 	    if (stat(dir->d_name, &dd) == -1) {
1130c80476e4SDavid E. O'Brien 		(void) xsnprintf(pathname, pathlen,
1131c80476e4SDavid E. O'Brien 		    CGETS(23, 25, "getcwd: Cannot stat directory \"%s\" (%s)"),
1132c80476e4SDavid E. O'Brien 		    dir->d_name, strerror(errno));
1133c80476e4SDavid E. O'Brien 		goto fail;
1134c80476e4SDavid E. O'Brien 	    }
1135c80476e4SDavid E. O'Brien 	} while (dd.st_ino  != d.st_ino  ||
1136c80476e4SDavid E. O'Brien 		 dd.st_dev  != d.st_dev  ||
1137c80476e4SDavid E. O'Brien 		 dd.st_size != d.st_size);
1138c80476e4SDavid E. O'Brien 	(void) closedir(dirp);
1139c80476e4SDavid E. O'Brien 	dirp = NULL;
1140c80476e4SDavid E. O'Brien 	pnptr = strnrcpy(dirp->d_name, pnptr, pnptr - pathbuf);
1141c80476e4SDavid E. O'Brien 	pnptr = strnrcpy("/", pnptr, pnptr - pathbuf);
1142c80476e4SDavid E. O'Brien     }
1143c80476e4SDavid E. O'Brien 
1144c80476e4SDavid E. O'Brien     if (*pnptr == '\0')		/* current dir == root dir */
1145c80476e4SDavid E. O'Brien 	(void) strncpy(pathname, "/", pathlen);
1146c80476e4SDavid E. O'Brien     else {
1147c80476e4SDavid E. O'Brien 	(void) strncpy(pathname, pnptr, pathlen);
1148c80476e4SDavid E. O'Brien 	pathname[pathlen - 1] = '\0';
1149c80476e4SDavid E. O'Brien 	if (chdir(pnptr) == -1) {
1150c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, MAXPATHLEN, CGETS(23, 22,
1151c80476e4SDavid E. O'Brien 		    "getcwd: Cannot change back to \".\" (%s)"),
1152c80476e4SDavid E. O'Brien 		    strerror(errno));
1153c80476e4SDavid E. O'Brien 	    return NULL;
1154c80476e4SDavid E. O'Brien 	}
1155c80476e4SDavid E. O'Brien     }
1156c80476e4SDavid E. O'Brien     return pathname;
1157c80476e4SDavid E. O'Brien 
1158c80476e4SDavid E. O'Brien fail:
1159c80476e4SDavid E. O'Brien     serrno = errno;
1160c80476e4SDavid E. O'Brien     (void) chdir(strnrcpy(".", pnptr, pnptr - pathbuf));
1161c80476e4SDavid E. O'Brien     errno = serrno;
1162c80476e4SDavid E. O'Brien     return NULL;
1163c80476e4SDavid E. O'Brien }
1164c80476e4SDavid E. O'Brien 
1165c80476e4SDavid E. O'Brien # else /* ! hp9000s500 */
1166c80476e4SDavid E. O'Brien 
1167c80476e4SDavid E. O'Brien #  if (SYSVREL != 0 && !defined(d_fileno)) || defined(_VMS_POSIX) || defined(WINNT)
1168c80476e4SDavid E. O'Brien #   define d_fileno d_ino
1169c80476e4SDavid E. O'Brien #  endif
1170c80476e4SDavid E. O'Brien 
1171c80476e4SDavid E. O'Brien char *
1172c80476e4SDavid E. O'Brien xgetcwd(pathname, pathlen)
1173c80476e4SDavid E. O'Brien     char   *pathname;
1174c80476e4SDavid E. O'Brien     size_t pathlen;
1175c80476e4SDavid E. O'Brien {
1176c80476e4SDavid E. O'Brien     DIR    *dp;
1177c80476e4SDavid E. O'Brien     struct dirent *d;
1178c80476e4SDavid E. O'Brien 
1179c80476e4SDavid E. O'Brien     struct stat st_root, st_cur, st_next, st_dotdot;
1180c80476e4SDavid E. O'Brien     char    pathbuf[MAXPATHLEN], nextpathbuf[MAXPATHLEN * 2];
1181c80476e4SDavid E. O'Brien     char   *pathptr, *nextpathptr, *cur_name_add;
1182c80476e4SDavid E. O'Brien     int	   save_errno = 0;
1183c80476e4SDavid E. O'Brien 
1184c80476e4SDavid E. O'Brien     /* find the inode of root */
1185c80476e4SDavid E. O'Brien     if (stat("/", &st_root) == -1) {
1186c80476e4SDavid E. O'Brien 	(void) xsnprintf(pathname, pathlen, CGETS(23, 23,
1187c80476e4SDavid E. O'Brien 			"getcwd: Cannot stat \"/\" (%s)"),
1188c80476e4SDavid E. O'Brien 			strerror(errno));
1189c80476e4SDavid E. O'Brien 	return NULL;
1190c80476e4SDavid E. O'Brien     }
1191c80476e4SDavid E. O'Brien     pathbuf[MAXPATHLEN - 1] = '\0';
1192c80476e4SDavid E. O'Brien     pathptr = &pathbuf[MAXPATHLEN - 1];
1193c80476e4SDavid E. O'Brien     nextpathbuf[MAXPATHLEN - 1] = '\0';
1194c80476e4SDavid E. O'Brien     cur_name_add = nextpathptr = &nextpathbuf[MAXPATHLEN - 1];
1195c80476e4SDavid E. O'Brien 
1196c80476e4SDavid E. O'Brien     /* find the inode of the current directory */
1197c80476e4SDavid E. O'Brien     if (lstat(".", &st_cur) == -1) {
1198c80476e4SDavid E. O'Brien 	(void) xsnprintf(pathname, pathlen, CGETS(23, 24,
1199c80476e4SDavid E. O'Brien 			 "getcwd: Cannot stat \".\" (%s)"),
1200c80476e4SDavid E. O'Brien 			 strerror(errno));
1201c80476e4SDavid E. O'Brien 	return NULL;
1202c80476e4SDavid E. O'Brien     }
1203c80476e4SDavid E. O'Brien     nextpathptr = strnrcpy(nextpathptr, "../", nextpathptr - nextpathbuf);
1204c80476e4SDavid E. O'Brien 
1205c80476e4SDavid E. O'Brien     /* Descend to root */
1206c80476e4SDavid E. O'Brien     for (;;) {
1207c80476e4SDavid E. O'Brien 
1208c80476e4SDavid E. O'Brien 	/* look if we found root yet */
1209c80476e4SDavid E. O'Brien 	if (st_cur.st_ino == st_root.st_ino &&
1210c80476e4SDavid E. O'Brien 	    DEV_DEV_COMPARE(st_cur.st_dev, st_root.st_dev)) {
1211c80476e4SDavid E. O'Brien 	    (void) strncpy(pathname, *pathptr != '/' ? "/" : pathptr, pathlen);
1212c80476e4SDavid E. O'Brien 	    pathname[pathlen - 1] = '\0';
1213c80476e4SDavid E. O'Brien 	    return pathname;
1214c80476e4SDavid E. O'Brien 	}
1215c80476e4SDavid E. O'Brien 
1216c80476e4SDavid E. O'Brien 	/* open the parent directory */
1217c80476e4SDavid E. O'Brien 	if (stat(nextpathptr, &st_dotdot) == -1) {
1218c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 25,
1219c80476e4SDavid E. O'Brien 			     "getcwd: Cannot stat directory \"%s\" (%s)"),
1220c80476e4SDavid E. O'Brien 			     nextpathptr, strerror(errno));
1221c80476e4SDavid E. O'Brien 	    return NULL;
1222c80476e4SDavid E. O'Brien 	}
1223c80476e4SDavid E. O'Brien 	if ((dp = opendir(nextpathptr)) == NULL) {
1224c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 26,
1225c80476e4SDavid E. O'Brien 			     "getcwd: Cannot open directory \"%s\" (%s)"),
1226c80476e4SDavid E. O'Brien 			     nextpathptr, strerror(errno));
1227c80476e4SDavid E. O'Brien 	    return NULL;
1228c80476e4SDavid E. O'Brien 	}
1229c80476e4SDavid E. O'Brien 
1230c80476e4SDavid E. O'Brien 	/* look in the parent for the entry with the same inode */
1231c80476e4SDavid E. O'Brien 	if (DEV_DEV_COMPARE(st_dotdot.st_dev, st_cur.st_dev)) {
1232c80476e4SDavid E. O'Brien 	    /* Parent has same device. No need to stat every member */
1233c80476e4SDavid E. O'Brien 	    for (d = readdir(dp); d != NULL; d = readdir(dp)) {
1234c80476e4SDavid E. O'Brien #ifdef __clipper__
1235c80476e4SDavid E. O'Brien 		if (((unsigned long)d->d_fileno & 0xffff) == st_cur.st_ino)
1236c80476e4SDavid E. O'Brien 		    break;
1237c80476e4SDavid E. O'Brien #else
1238c80476e4SDavid E. O'Brien 		if (d->d_fileno == st_cur.st_ino)
1239c80476e4SDavid E. O'Brien 		    break;
1240c80476e4SDavid E. O'Brien #endif
1241c80476e4SDavid E. O'Brien 	    }
1242c80476e4SDavid E. O'Brien 	}
1243c80476e4SDavid E. O'Brien 	else {
1244c80476e4SDavid E. O'Brien 	    /*
1245c80476e4SDavid E. O'Brien 	     * Parent has a different device. This is a mount point so we
1246c80476e4SDavid E. O'Brien 	     * need to stat every member
1247c80476e4SDavid E. O'Brien 	     */
1248c80476e4SDavid E. O'Brien 	    for (d = readdir(dp); d != NULL; d = readdir(dp)) {
1249c80476e4SDavid E. O'Brien 		if (ISDOT(d->d_name) || ISDOTDOT(d->d_name))
1250c80476e4SDavid E. O'Brien 		    continue;
1251c80476e4SDavid E. O'Brien 		(void)strncpy(cur_name_add, d->d_name,
1252c80476e4SDavid E. O'Brien 		    (size_t) (&nextpathbuf[sizeof(nextpathbuf) - 1] - cur_name_add));
1253c80476e4SDavid E. O'Brien 		if (lstat(nextpathptr, &st_next) == -1) {
1254c80476e4SDavid E. O'Brien 		    /*
1255c80476e4SDavid E. O'Brien 		     * We might not be able to stat() some path components
1256c80476e4SDavid E. O'Brien 		     * if we are using afs, but this is not an error as
1257c80476e4SDavid E. O'Brien 		     * long as we find the one we need; we also save the
1258c80476e4SDavid E. O'Brien 		     * first error to report it if we don't finally succeed.
1259c80476e4SDavid E. O'Brien 		     */
1260c80476e4SDavid E. O'Brien 		    if (save_errno == 0)
1261c80476e4SDavid E. O'Brien 			save_errno = errno;
1262c80476e4SDavid E. O'Brien 		    continue;
1263c80476e4SDavid E. O'Brien 		}
1264c80476e4SDavid E. O'Brien 		/* check if we found it yet */
1265c80476e4SDavid E. O'Brien 		if (st_next.st_ino == st_cur.st_ino &&
1266c80476e4SDavid E. O'Brien 		    DEV_DEV_COMPARE(st_next.st_dev, st_cur.st_dev))
1267c80476e4SDavid E. O'Brien 		    break;
1268c80476e4SDavid E. O'Brien 	    }
1269c80476e4SDavid E. O'Brien 	}
1270c80476e4SDavid E. O'Brien 	if (d == NULL) {
1271c80476e4SDavid E. O'Brien 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 27,
1272c80476e4SDavid E. O'Brien 			     "getcwd: Cannot find \".\" in \"..\" (%s)"),
1273c80476e4SDavid E. O'Brien 			     strerror(save_errno ? save_errno : ENOENT));
1274c80476e4SDavid E. O'Brien 	    (void) closedir(dp);
1275c80476e4SDavid E. O'Brien 	    return NULL;
1276c80476e4SDavid E. O'Brien 	}
1277c80476e4SDavid E. O'Brien 	else
1278c80476e4SDavid E. O'Brien 	    save_errno = 0;
1279c80476e4SDavid E. O'Brien 	st_cur = st_dotdot;
1280c80476e4SDavid E. O'Brien 	pathptr = strnrcpy(pathptr, d->d_name, pathptr - pathbuf);
1281c80476e4SDavid E. O'Brien 	pathptr = strnrcpy(pathptr, "/", pathptr - pathbuf);
1282c80476e4SDavid E. O'Brien 	nextpathptr = strnrcpy(nextpathptr, "../", nextpathptr - nextpathbuf);
1283c80476e4SDavid E. O'Brien 	*cur_name_add = '\0';
1284c80476e4SDavid E. O'Brien 	(void) closedir(dp);
1285c80476e4SDavid E. O'Brien     }
1286c80476e4SDavid E. O'Brien } /* end getcwd */
1287c80476e4SDavid E. O'Brien # endif /* hp9000s500 */
1288c80476e4SDavid E. O'Brien 
1289c80476e4SDavid E. O'Brien /* strnrcpy():
1290c80476e4SDavid E. O'Brien  *	Like strncpy, going backwards and returning the new pointer
1291c80476e4SDavid E. O'Brien  */
1292c80476e4SDavid E. O'Brien static char *
1293c80476e4SDavid E. O'Brien strnrcpy(ptr, str, siz)
1294c80476e4SDavid E. O'Brien     register char *ptr, *str;
1295c80476e4SDavid E. O'Brien     size_t siz;
1296c80476e4SDavid E. O'Brien {
1297c80476e4SDavid E. O'Brien     register int len = strlen(str);
1298c80476e4SDavid E. O'Brien     if (siz == 0)
1299c80476e4SDavid E. O'Brien 	return ptr;
1300c80476e4SDavid E. O'Brien 
1301c80476e4SDavid E. O'Brien     while (len && siz--)
1302c80476e4SDavid E. O'Brien 	*--ptr = str[--len];
1303c80476e4SDavid E. O'Brien 
1304c80476e4SDavid E. O'Brien     return (ptr);
1305c80476e4SDavid E. O'Brien } /* end strnrcpy */
1306c80476e4SDavid E. O'Brien #endif /* getcwd */
1307c80476e4SDavid E. O'Brien 
1308c80476e4SDavid E. O'Brien #ifdef apollo
1309c80476e4SDavid E. O'Brien /***
1310c80476e4SDavid E. O'Brien  *** Domain/OS
1311c80476e4SDavid E. O'Brien  ***/
1312c80476e4SDavid E. O'Brien #include <apollo/base.h>
1313c80476e4SDavid E. O'Brien #include <apollo/loader.h>
1314c80476e4SDavid E. O'Brien #include <apollo/error.h>
1315c80476e4SDavid E. O'Brien 
1316c80476e4SDavid E. O'Brien 
1317c80476e4SDavid E. O'Brien static char *
1318c80476e4SDavid E. O'Brien apperr(st)
1319c80476e4SDavid E. O'Brien     status_$t *st;
1320c80476e4SDavid E. O'Brien {
1321c80476e4SDavid E. O'Brien     static char buf[BUFSIZE];
1322c80476e4SDavid E. O'Brien     short e_subl, e_modl, e_codel;
1323c80476e4SDavid E. O'Brien     error_$string_t e_sub, e_mod, e_code;
1324c80476e4SDavid E. O'Brien 
1325c80476e4SDavid E. O'Brien     error_$get_text(*st, e_sub, &e_subl, e_mod, &e_modl, e_code, &e_codel);
1326c80476e4SDavid E. O'Brien     e_sub[e_subl] = '\0';
1327c80476e4SDavid E. O'Brien     e_code[e_codel] = '\0';
1328c80476e4SDavid E. O'Brien     e_mod[e_modl] = '\0';
1329c80476e4SDavid E. O'Brien     (void) xsnprintf(buf, sizeof(buf), "%s (%s/%s)", e_code, e_sub, e_mod);
1330c80476e4SDavid E. O'Brien 
1331c80476e4SDavid E. O'Brien     return(buf);
1332c80476e4SDavid E. O'Brien }
1333c80476e4SDavid E. O'Brien 
1334c80476e4SDavid E. O'Brien static int
1335c80476e4SDavid E. O'Brien llib(s)
1336c80476e4SDavid E. O'Brien     Char *s;
1337c80476e4SDavid E. O'Brien {
1338c80476e4SDavid E. O'Brien     short len = Strlen(s);
1339c80476e4SDavid E. O'Brien     status_$t st;
1340c80476e4SDavid E. O'Brien     char *t;
1341c80476e4SDavid E. O'Brien 
1342c80476e4SDavid E. O'Brien     loader_$inlib(t = short2str(s), len, &st);
1343c80476e4SDavid E. O'Brien     if (st.all != status_$ok)
1344c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, t, apperr(&st));
1345c80476e4SDavid E. O'Brien }
1346c80476e4SDavid E. O'Brien 
1347c80476e4SDavid E. O'Brien /*ARGSUSED*/
1348c80476e4SDavid E. O'Brien void
1349c80476e4SDavid E. O'Brien doinlib(v, c)
1350c80476e4SDavid E. O'Brien     Char **v;
1351c80476e4SDavid E. O'Brien     struct command *c;
1352c80476e4SDavid E. O'Brien {
1353c80476e4SDavid E. O'Brien     setname(short2str(*v++));
1354c80476e4SDavid E. O'Brien     gflag = 0, tglob(v);
1355c80476e4SDavid E. O'Brien     if (gflag) {
1356c80476e4SDavid E. O'Brien 	v = globall(v);
1357c80476e4SDavid E. O'Brien 	if (v == 0)
1358c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_NOMATCH);
1359c80476e4SDavid E. O'Brien     }
1360c80476e4SDavid E. O'Brien     else {
1361c80476e4SDavid E. O'Brien 	v = gargv = saveblk(v);
1362c80476e4SDavid E. O'Brien 	trim(v);
1363c80476e4SDavid E. O'Brien     }
1364c80476e4SDavid E. O'Brien 
1365c80476e4SDavid E. O'Brien     while (v && *v)
1366c80476e4SDavid E. O'Brien 	llib(*v++);
1367c80476e4SDavid E. O'Brien     if (gargv)
1368c80476e4SDavid E. O'Brien 	blkfree(gargv), gargv = 0;
1369c80476e4SDavid E. O'Brien }
1370c80476e4SDavid E. O'Brien 
1371c80476e4SDavid E. O'Brien int
1372c80476e4SDavid E. O'Brien getv(v)
1373c80476e4SDavid E. O'Brien     Char *v;
1374c80476e4SDavid E. O'Brien {
1375c80476e4SDavid E. O'Brien     if (eq(v, STRbsd43))
1376c80476e4SDavid E. O'Brien 	return(1);
1377c80476e4SDavid E. O'Brien     else if (eq(v, STRsys53))
1378c80476e4SDavid E. O'Brien 	return(0);
1379c80476e4SDavid E. O'Brien     else
1380c80476e4SDavid E. O'Brien 	stderror(ERR_NAME | ERR_SYSTEM, short2str(v),
1381c80476e4SDavid E. O'Brien 		 CGETS(23, 28, "Invalid system type"));
1382c80476e4SDavid E. O'Brien     /*NOTREACHED*/
1383c80476e4SDavid E. O'Brien     return(0);
1384c80476e4SDavid E. O'Brien }
1385c80476e4SDavid E. O'Brien 
1386c80476e4SDavid E. O'Brien /*ARGSUSED*/
1387c80476e4SDavid E. O'Brien void
1388c80476e4SDavid E. O'Brien dover(v, c)
1389c80476e4SDavid E. O'Brien     Char **v;
1390c80476e4SDavid E. O'Brien     struct command *c;
1391c80476e4SDavid E. O'Brien {
1392c80476e4SDavid E. O'Brien     Char *p;
1393c80476e4SDavid E. O'Brien 
1394c80476e4SDavid E. O'Brien     setname(short2str(*v++));
1395c80476e4SDavid E. O'Brien     if (!*v) {
1396c80476e4SDavid E. O'Brien 	if (!(p = tgetenv(STRSYSTYPE)))
1397c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_STRING,
1398c80476e4SDavid E. O'Brien 		     CGETS(23, 29, "System type is not set"));
1399c80476e4SDavid E. O'Brien 	xprintf("%S\n", p);
1400c80476e4SDavid E. O'Brien     }
1401c80476e4SDavid E. O'Brien     else {
1402c80476e4SDavid E. O'Brien 	tsetenv(STRSYSTYPE, getv(*v) ? STRbsd43 : STRsys53);
1403c80476e4SDavid E. O'Brien 	dohash(NULL, NULL);
1404c80476e4SDavid E. O'Brien     }
1405c80476e4SDavid E. O'Brien }
1406c80476e4SDavid E. O'Brien 
1407c80476e4SDavid E. O'Brien /*
1408c80476e4SDavid E. O'Brien  * Many thanks to rees@citi.umich.edu (Jim Rees) and
1409c80476e4SDavid E. O'Brien  *                mathys@ssdt-tempe.sps.mot.com (Yves Mathys)
1410c80476e4SDavid E. O'Brien  * For figuring out how to do this... I could have never done
1411c80476e4SDavid E. O'Brien  * it without their help.
1412c80476e4SDavid E. O'Brien  */
1413c80476e4SDavid E. O'Brien typedef short enum {
1414c80476e4SDavid E. O'Brien 	name_$wdir_type,
1415c80476e4SDavid E. O'Brien 	name_$ndir_type,
1416c80476e4SDavid E. O'Brien 	name_$node_dir_type,
1417c80476e4SDavid E. O'Brien } name_$dir_type_t;
1418c80476e4SDavid E. O'Brien 
1419c80476e4SDavid E. O'Brien /*ARGSUSED*/
1420c80476e4SDavid E. O'Brien void
1421c80476e4SDavid E. O'Brien dorootnode(v, c)
1422c80476e4SDavid E. O'Brien     Char **v;
1423c80476e4SDavid E. O'Brien     struct command *c;
1424c80476e4SDavid E. O'Brien {
1425c80476e4SDavid E. O'Brien     name_$dir_type_t dirtype = name_$node_dir_type;
1426c80476e4SDavid E. O'Brien     uid_$t uid;
1427c80476e4SDavid E. O'Brien     status_$t st;
1428c80476e4SDavid E. O'Brien     char *name;
1429c80476e4SDavid E. O'Brien     short namelen;
1430c80476e4SDavid E. O'Brien 
1431c80476e4SDavid E. O'Brien     setname(short2str(*v++));
1432c80476e4SDavid E. O'Brien 
1433c80476e4SDavid E. O'Brien     name = short2str(*v);
1434c80476e4SDavid E. O'Brien     namelen = strlen(name);
1435c80476e4SDavid E. O'Brien 
1436c80476e4SDavid E. O'Brien     name_$resolve(name, &namelen, &uid, &st);
1437c80476e4SDavid E. O'Brien     if (st.all != status_$ok)
1438c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, name, apperr(&st));
1439c80476e4SDavid E. O'Brien     namelen = 0;
1440c80476e4SDavid E. O'Brien     name_$set_diru(&uid, "", &namelen, &dirtype, &st);
1441c80476e4SDavid E. O'Brien     if (st.all != status_$ok)
1442c80476e4SDavid E. O'Brien 	stderror(ERR_SYSTEM, name, apperr(&st));
1443c80476e4SDavid E. O'Brien     dohash(NULL, NULL);
1444c80476e4SDavid E. O'Brien }
1445c80476e4SDavid E. O'Brien 
1446c80476e4SDavid E. O'Brien int
1447c80476e4SDavid E. O'Brien isapad()
1448c80476e4SDavid E. O'Brien {
1449c80476e4SDavid E. O'Brien     static int res = -1;
1450c80476e4SDavid E. O'Brien     static status_$t st;
1451c80476e4SDavid E. O'Brien 
1452c80476e4SDavid E. O'Brien     if (res == -1) {
1453c80476e4SDavid E. O'Brien 	int strm;
1454c80476e4SDavid E. O'Brien 	if (isatty(0))
1455c80476e4SDavid E. O'Brien 	    strm = 0;
1456c80476e4SDavid E. O'Brien 	if (isatty(1))
1457c80476e4SDavid E. O'Brien 	    strm = 1;
1458c80476e4SDavid E. O'Brien 	if (isatty(2))
1459c80476e4SDavid E. O'Brien 	    strm = 2;
1460c80476e4SDavid E. O'Brien 	else {
1461c80476e4SDavid E. O'Brien 	    res = 0;
1462c80476e4SDavid E. O'Brien 	    st.all = status_$ok;
1463c80476e4SDavid E. O'Brien 	    return(res);
1464c80476e4SDavid E. O'Brien 	}
1465c80476e4SDavid E. O'Brien 	res = stream_$isavt(&strm, &st);
1466c80476e4SDavid E. O'Brien 	res = res ? 1 : 0;
1467c80476e4SDavid E. O'Brien     }
1468c80476e4SDavid E. O'Brien     else {
1469c80476e4SDavid E. O'Brien 	if (st.all != status_$ok)
1470c80476e4SDavid E. O'Brien 	    stderror(ERR_SYSTEM, "stream_$isavt", apperr(&st));
1471c80476e4SDavid E. O'Brien     }
1472c80476e4SDavid E. O'Brien     return(res);
1473c80476e4SDavid E. O'Brien }
1474c80476e4SDavid E. O'Brien #endif
1475