xref: /dragonfly/contrib/tcsh-6/tc.os.c (revision d6ab524c)
17d8fb588SMatthias Schmidt /*
27d8fb588SMatthias Schmidt  * tc.os.c: OS Dependent builtin functions
37d8fb588SMatthias Schmidt  */
47d8fb588SMatthias Schmidt /*-
57d8fb588SMatthias Schmidt  * Copyright (c) 1980, 1991 The Regents of the University of California.
67d8fb588SMatthias Schmidt  * All rights reserved.
77d8fb588SMatthias Schmidt  *
87d8fb588SMatthias Schmidt  * Redistribution and use in source and binary forms, with or without
97d8fb588SMatthias Schmidt  * modification, are permitted provided that the following conditions
107d8fb588SMatthias Schmidt  * are met:
117d8fb588SMatthias Schmidt  * 1. Redistributions of source code must retain the above copyright
127d8fb588SMatthias Schmidt  *    notice, this list of conditions and the following disclaimer.
137d8fb588SMatthias Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
147d8fb588SMatthias Schmidt  *    notice, this list of conditions and the following disclaimer in the
157d8fb588SMatthias Schmidt  *    documentation and/or other materials provided with the distribution.
167d8fb588SMatthias Schmidt  * 3. Neither the name of the University nor the names of its contributors
177d8fb588SMatthias Schmidt  *    may be used to endorse or promote products derived from this software
187d8fb588SMatthias Schmidt  *    without specific prior written permission.
197d8fb588SMatthias Schmidt  *
207d8fb588SMatthias Schmidt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
217d8fb588SMatthias Schmidt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
227d8fb588SMatthias Schmidt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
237d8fb588SMatthias Schmidt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
247d8fb588SMatthias Schmidt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
257d8fb588SMatthias Schmidt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
267d8fb588SMatthias Schmidt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
277d8fb588SMatthias Schmidt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
287d8fb588SMatthias Schmidt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
297d8fb588SMatthias Schmidt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
307d8fb588SMatthias Schmidt  * SUCH DAMAGE.
317d8fb588SMatthias Schmidt  */
327d8fb588SMatthias Schmidt #include "sh.h"
337d8fb588SMatthias Schmidt #include "tw.h"
347d8fb588SMatthias Schmidt #include "ed.h"
357d8fb588SMatthias Schmidt #include "ed.defns.h"		/* for the function names */
367d8fb588SMatthias Schmidt #include "sh.decls.h"
377d8fb588SMatthias Schmidt 
387d8fb588SMatthias Schmidt #ifdef _UWIN
397d8fb588SMatthias Schmidt #define TIOCGPGRP TIOCGETPGRP
407d8fb588SMatthias Schmidt #define TIOCSPGRP TIOCSETPGRP
417d8fb588SMatthias Schmidt #endif
427d8fb588SMatthias Schmidt 
437d8fb588SMatthias Schmidt /***
447d8fb588SMatthias Schmidt  *** MACH
457d8fb588SMatthias Schmidt  ***/
467d8fb588SMatthias Schmidt 
477d8fb588SMatthias Schmidt #ifdef MACH
487d8fb588SMatthias Schmidt /* dosetpath -- setpath built-in command
497d8fb588SMatthias Schmidt  *
507d8fb588SMatthias Schmidt  **********************************************************************
517d8fb588SMatthias Schmidt  * HISTORY
527d8fb588SMatthias Schmidt  * 08-May-88  Richard Draves (rpd) at Carnegie-Mellon University
537d8fb588SMatthias Schmidt  *	Major changes to remove artificial limits on sizes and numbers
547d8fb588SMatthias Schmidt  *	of paths.
557d8fb588SMatthias Schmidt  *
567d8fb588SMatthias Schmidt  **********************************************************************
577d8fb588SMatthias Schmidt  */
587d8fb588SMatthias Schmidt 
597d8fb588SMatthias Schmidt #ifdef MACH
607d8fb588SMatthias Schmidt static Char STRCPATH[] = {'C', 'P', 'A', 'T', 'H', '\0'};
617d8fb588SMatthias Schmidt static Char STRLPATH[] = {'L', 'P', 'A', 'T', 'H', '\0'};
627d8fb588SMatthias Schmidt static Char STRMPATH[] = {'M', 'P', 'A', 'T', 'H', '\0'};
637d8fb588SMatthias Schmidt # if EPATH
647d8fb588SMatthias Schmidt static Char STREPATH[] = {'E', 'P', 'A', 'T', 'H', '\0'};
657d8fb588SMatthias Schmidt # endif
667d8fb588SMatthias Schmidt #endif /* MACH */
677d8fb588SMatthias Schmidt static Char *syspaths[] = {STRKPATH, STRCPATH, STRLPATH, STRMPATH,
687d8fb588SMatthias Schmidt 
697d8fb588SMatthias Schmidt #if EPATH
707d8fb588SMatthias Schmidt 	STREPATH,
717d8fb588SMatthias Schmidt #endif
727d8fb588SMatthias Schmidt 	 0};
737d8fb588SMatthias Schmidt #define LOCALSYSPATH	"/usr/local"
747d8fb588SMatthias Schmidt 
757d8fb588SMatthias Schmidt /*ARGSUSED*/
767d8fb588SMatthias Schmidt void
dosetpath(Char ** arglist,struct command * c)777d8fb588SMatthias Schmidt dosetpath(Char **arglist, struct command *c)
787d8fb588SMatthias Schmidt {
797d8fb588SMatthias Schmidt     extern char *getenv();
807d8fb588SMatthias Schmidt     Char  **pathvars, **cmdargs;
817d8fb588SMatthias Schmidt     char  **spaths, **cpaths, **cmds;
827d8fb588SMatthias Schmidt     char   *tcp;
837d8fb588SMatthias Schmidt     unsigned int npaths, ncmds;
847d8fb588SMatthias Schmidt     int     i, sysflag;
857d8fb588SMatthias Schmidt 
867d8fb588SMatthias Schmidt     pintr_disabled++;
877d8fb588SMatthias Schmidt     cleanup_push(&pintr_disabled, disabled_cleanup);
887d8fb588SMatthias Schmidt 
897d8fb588SMatthias Schmidt     /*
907d8fb588SMatthias Schmidt      * setpath(3) uses stdio and we want 0, 1, 2 to work...
917d8fb588SMatthias Schmidt      */
927d8fb588SMatthias Schmidt     if (!didfds) {
937d8fb588SMatthias Schmidt 	(void) dcopy(SHIN, 0);
947d8fb588SMatthias Schmidt 	(void) dcopy(SHOUT, 1);
957d8fb588SMatthias Schmidt 	(void) dcopy(SHDIAG, 2);
967d8fb588SMatthias Schmidt 	didfds = 1;
977d8fb588SMatthias Schmidt     }
987d8fb588SMatthias Schmidt 
997d8fb588SMatthias Schmidt     for (i = 1; arglist[i] && (arglist[i][0] != '-'); i++);
1007d8fb588SMatthias Schmidt     npaths = i - 1;
1017d8fb588SMatthias Schmidt 
1027d8fb588SMatthias Schmidt     cmdargs = &arglist[i];
1037d8fb588SMatthias Schmidt     for (; arglist[i]; i++);
1047d8fb588SMatthias Schmidt     ncmds = i - npaths - 1;
1057d8fb588SMatthias Schmidt 
1067d8fb588SMatthias Schmidt     if (npaths) {
1077d8fb588SMatthias Schmidt 	sysflag = 0;
1087d8fb588SMatthias Schmidt 	pathvars = &arglist[1];
1097d8fb588SMatthias Schmidt     }
1107d8fb588SMatthias Schmidt     else {
1117d8fb588SMatthias Schmidt 	sysflag = 1;
1127d8fb588SMatthias Schmidt 	npaths = (sizeof syspaths / sizeof *syspaths) - 1;
1137d8fb588SMatthias Schmidt 	pathvars = syspaths;
1147d8fb588SMatthias Schmidt     }
1157d8fb588SMatthias Schmidt 
1167d8fb588SMatthias Schmidt     /* note that npaths != 0 */
1177d8fb588SMatthias Schmidt 
1187d8fb588SMatthias Schmidt     spaths = xmalloc(npaths * sizeof *spaths);
1197d8fb588SMatthias Schmidt     setzero(spaths, npaths * sizeof *spaths);
1207d8fb588SMatthias Schmidt     cpaths = xmalloc((npaths + 1) * sizeof *cpaths);
1217d8fb588SMatthias Schmidt     setzero(cpaths, (npaths + 1) * sizeof *cpaths);
1227d8fb588SMatthias Schmidt     cmds = xmalloc((ncmds + 1) * sizeof *cmds);
1237d8fb588SMatthias Schmidt     setzero(cmds, (ncmds + 1) * sizeof *cmds);
1247d8fb588SMatthias Schmidt     for (i = 0; i < npaths; i++) {
1257d8fb588SMatthias Schmidt 	char   *val = getenv(short2str(pathvars[i]));
1267d8fb588SMatthias Schmidt 
1277d8fb588SMatthias Schmidt 	if (val == NULL)
1287d8fb588SMatthias Schmidt 	    val = "";
1297d8fb588SMatthias Schmidt 
1307d8fb588SMatthias Schmidt 	spaths[i] = xmalloc((Strlen(pathvars[i]) + strlen(val) + 2) *
1317d8fb588SMatthias Schmidt 			    sizeof **spaths);
1327d8fb588SMatthias Schmidt 	(void) strcpy(spaths[i], short2str(pathvars[i]));
1337d8fb588SMatthias Schmidt 	(void) strcat(spaths[i], "=");
1347d8fb588SMatthias Schmidt 	(void) strcat(spaths[i], val);
1357d8fb588SMatthias Schmidt 	cpaths[i] = spaths[i];
1367d8fb588SMatthias Schmidt     }
1377d8fb588SMatthias Schmidt 
1387d8fb588SMatthias Schmidt     for (i = 0; i < ncmds; i++) {
1397d8fb588SMatthias Schmidt 	Char   *val = globone(cmdargs[i], G_ERROR);/*FIXRESET*/
1407d8fb588SMatthias Schmidt 
1417d8fb588SMatthias Schmidt 	if (val == NULL)
1427d8fb588SMatthias Schmidt 	    goto abortpath;
1437d8fb588SMatthias Schmidt 	cmds[i] = strsave(short2str(val));
1447d8fb588SMatthias Schmidt     }
1457d8fb588SMatthias Schmidt 
1467d8fb588SMatthias Schmidt 
1477d8fb588SMatthias Schmidt     if (setpath(cpaths, cmds, LOCALSYSPATH, sysflag, 1) < 0) {
1487d8fb588SMatthias Schmidt abortpath:
1497d8fb588SMatthias Schmidt 	if (spaths) {
1507d8fb588SMatthias Schmidt 	    for (i = 0; i < npaths; i++)
1517d8fb588SMatthias Schmidt 		xfree(spaths[i]);
1527d8fb588SMatthias Schmidt 	    xfree(spaths);
1537d8fb588SMatthias Schmidt 	}
1547d8fb588SMatthias Schmidt 	xfree(cpaths);
1557d8fb588SMatthias Schmidt 	if (cmds) {
1567d8fb588SMatthias Schmidt 	    for (i = 0; i < ncmds; i++)
1577d8fb588SMatthias Schmidt 		xfree(cmds[i]);
1587d8fb588SMatthias Schmidt 	    xfree(cmds);
1597d8fb588SMatthias Schmidt 	}
1607d8fb588SMatthias Schmidt 
1617d8fb588SMatthias Schmidt 	cleanup_until(&pintr_disabled);
1627d8fb588SMatthias Schmidt 	donefds();
1637d8fb588SMatthias Schmidt 	return;
1647d8fb588SMatthias Schmidt     }
1657d8fb588SMatthias Schmidt 
1667d8fb588SMatthias Schmidt     for (i = 0; i < npaths; i++) {
1677d8fb588SMatthias Schmidt 	Char	*val, *name;
1687d8fb588SMatthias Schmidt 
1697d8fb588SMatthias Schmidt 	name = str2short(cpaths[i]);
1707d8fb588SMatthias Schmidt 	for (val = str2short(cpaths[i]); val && *val && *val != '='; val++);
1717d8fb588SMatthias Schmidt 	if (val && *val == '=') {
1727d8fb588SMatthias Schmidt 	    *val++ = '\0';
1737d8fb588SMatthias Schmidt 
1747d8fb588SMatthias Schmidt 	    tsetenv(name, val);/*FIXRESET*/
1757d8fb588SMatthias Schmidt 	    if (Strcmp(name, STRKPATH) == 0) {
1767d8fb588SMatthias Schmidt 		importpath(val);/*FIXRESET*/
1777d8fb588SMatthias Schmidt 		if (havhash)
1787d8fb588SMatthias Schmidt 		    dohash(NULL, NULL);/*FIXRESET*/
1797d8fb588SMatthias Schmidt 	    }
1807d8fb588SMatthias Schmidt 	    *--val = '=';
1817d8fb588SMatthias Schmidt 	}
1827d8fb588SMatthias Schmidt     }
1837d8fb588SMatthias Schmidt     cleanup_until(&pintr_disabled);
1847d8fb588SMatthias Schmidt     donefds();
1857d8fb588SMatthias Schmidt }
1867d8fb588SMatthias Schmidt #endif /* MACH */
1877d8fb588SMatthias Schmidt 
1887d8fb588SMatthias Schmidt /***
1897d8fb588SMatthias Schmidt  *** AIX
1907d8fb588SMatthias Schmidt  ***/
1917d8fb588SMatthias Schmidt #ifdef TCF
1927d8fb588SMatthias Schmidt /* ARGSUSED */
1937d8fb588SMatthias Schmidt void
dogetxvers(Char ** v,struct command * c)1947d8fb588SMatthias Schmidt dogetxvers(Char **v, struct command *c)
1957d8fb588SMatthias Schmidt {
1967d8fb588SMatthias Schmidt     char    xvers[MAXPATHLEN];
1977d8fb588SMatthias Schmidt 
1987d8fb588SMatthias Schmidt     if (getxvers(xvers, MAXPATHLEN) == -1)
1997d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, "getxvers", strerror(errno));
2007d8fb588SMatthias Schmidt     xprintf("%s\n", xvers);
2017d8fb588SMatthias Schmidt     flush();
2027d8fb588SMatthias Schmidt }
2037d8fb588SMatthias Schmidt 
2047d8fb588SMatthias Schmidt /*ARGSUSED*/
2057d8fb588SMatthias Schmidt void
dosetxvers(Char ** v,struct command * c)2067d8fb588SMatthias Schmidt dosetxvers(Char **v, struct command *c)
2077d8fb588SMatthias Schmidt {
2087d8fb588SMatthias Schmidt     char   *xvers;
2097d8fb588SMatthias Schmidt 
2107d8fb588SMatthias Schmidt     ++v;
2117d8fb588SMatthias Schmidt     if (!*v || *v[0] == '\0')
2127d8fb588SMatthias Schmidt 	xvers = "";
2137d8fb588SMatthias Schmidt     else
2147d8fb588SMatthias Schmidt 	xvers = short2str(*v);
2157d8fb588SMatthias Schmidt     if (setxvers(xvers) == -1)
2167d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, "setxvers", strerror(errno));
2177d8fb588SMatthias Schmidt }
2187d8fb588SMatthias Schmidt 
2197d8fb588SMatthias Schmidt #include <sf.h>
2207d8fb588SMatthias Schmidt #ifdef _AIXPS2
2217d8fb588SMatthias Schmidt # define XC_PDP11	0x01
2227d8fb588SMatthias Schmidt # define XC_23		0x02
2237d8fb588SMatthias Schmidt # define XC_Z8K		0x03
2247d8fb588SMatthias Schmidt # define XC_8086	0x04
2257d8fb588SMatthias Schmidt # define XC_68K		0x05
2267d8fb588SMatthias Schmidt # define XC_Z80		0x06
2277d8fb588SMatthias Schmidt # define XC_VAX		0x07
2287d8fb588SMatthias Schmidt # define XC_16032	0x08
2297d8fb588SMatthias Schmidt # define XC_286		0x09
2307d8fb588SMatthias Schmidt # define XC_386		0x0a
2317d8fb588SMatthias Schmidt # define XC_S370	0x0b
2327d8fb588SMatthias Schmidt #else
2337d8fb588SMatthias Schmidt # include <sys/x.out.h>
2347d8fb588SMatthias Schmidt #endif /* _AIXPS2 */
2357d8fb588SMatthias Schmidt 
2367d8fb588SMatthias Schmidt static struct xc_cpu_t {
2377d8fb588SMatthias Schmidt     short   xc_id;
2387d8fb588SMatthias Schmidt     char   *xc_name;
2397d8fb588SMatthias Schmidt }       xcpu[] =
2407d8fb588SMatthias Schmidt {
2417d8fb588SMatthias Schmidt     { XC_PDP11,	"pdp11"   },
2427d8fb588SMatthias Schmidt     { XC_23,	"i370"    },
2437d8fb588SMatthias Schmidt     { XC_Z8K,	"z8000"   },
2447d8fb588SMatthias Schmidt     { XC_8086,	"i86"	  },
2457d8fb588SMatthias Schmidt     { XC_68K,	"mc68000" },
2467d8fb588SMatthias Schmidt     { XC_Z80,	"x80"	  },
2477d8fb588SMatthias Schmidt     { XC_VAX,	"vax"	  },
2487d8fb588SMatthias Schmidt     { XC_16032,	"ns16032" },
2497d8fb588SMatthias Schmidt     { XC_286,	"i286"	  },
2507d8fb588SMatthias Schmidt     { XC_386,	"i386"	  },
2517d8fb588SMatthias Schmidt     { XC_S370,	"xa370"	  },
2527d8fb588SMatthias Schmidt     { 0,	NULL      }
2537d8fb588SMatthias Schmidt };
2547d8fb588SMatthias Schmidt 
2557d8fb588SMatthias Schmidt /*
2567d8fb588SMatthias Schmidt  * our local hack table, stolen from x.out.h
2577d8fb588SMatthias Schmidt  */
2587d8fb588SMatthias Schmidt static char *
getxcode(short xcid)2597d8fb588SMatthias Schmidt getxcode(short xcid)
2607d8fb588SMatthias Schmidt {
2617d8fb588SMatthias Schmidt     int     i;
2627d8fb588SMatthias Schmidt 
2637d8fb588SMatthias Schmidt     for (i = 0; xcpu[i].xc_name != NULL; i++)
2647d8fb588SMatthias Schmidt 	if (xcpu[i].xc_id == xcid)
2657d8fb588SMatthias Schmidt 	    return (xcpu[i].xc_name);
2667d8fb588SMatthias Schmidt     return (NULL);
2677d8fb588SMatthias Schmidt }
2687d8fb588SMatthias Schmidt 
2697d8fb588SMatthias Schmidt static short
getxid(char * xcname)2707d8fb588SMatthias Schmidt getxid(char *xcname)
2717d8fb588SMatthias Schmidt {
2727d8fb588SMatthias Schmidt     int     i;
2737d8fb588SMatthias Schmidt 
2747d8fb588SMatthias Schmidt     for (i = 0; xcpu[i].xc_name != NULL; i++)
2757d8fb588SMatthias Schmidt 	if (strcmp(xcpu[i].xc_name, xcname) == 0)
2767d8fb588SMatthias Schmidt 	    return (xcpu[i].xc_id);
2777d8fb588SMatthias Schmidt     return ((short) -1);
2787d8fb588SMatthias Schmidt }
2797d8fb588SMatthias Schmidt 
2807d8fb588SMatthias Schmidt 
2817d8fb588SMatthias Schmidt /*ARGSUSED*/
2827d8fb588SMatthias Schmidt void
dogetspath(Char ** v,struct command * c)2837d8fb588SMatthias Schmidt dogetspath(Char **v, struct command *c)
2847d8fb588SMatthias Schmidt {
2857d8fb588SMatthias Schmidt     int     i, j;
2867d8fb588SMatthias Schmidt     sitepath_t p[MAXSITE];
2877d8fb588SMatthias Schmidt     struct sf *st;
2887d8fb588SMatthias Schmidt     static char *local = "LOCAL ";
2897d8fb588SMatthias Schmidt 
2907d8fb588SMatthias Schmidt     if ((j = getspath(p, MAXSITE)) == -1)
2917d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, "getspath", strerror(errno));
2927d8fb588SMatthias Schmidt     for (i = 0; i < j && (p[i] & SPATH_CPU) != NOSITE; i++) {
2937d8fb588SMatthias Schmidt 	if (p[i] & SPATH_CPU) {
2947d8fb588SMatthias Schmidt 	    if ((p[i] & SPATH_MASK) == NULLSITE)
2957d8fb588SMatthias Schmidt 		xprintf(local);
2967d8fb588SMatthias Schmidt 	    else if ((st = sfxcode((short) (p[i] & SPATH_MASK))) != NULL)
2977d8fb588SMatthias Schmidt 		xprintf("%s ", st->sf_ctype);
2987d8fb588SMatthias Schmidt 	    else {
2997d8fb588SMatthias Schmidt 		char   *xc = getxcode(p[i] & SPATH_MASK);
3007d8fb588SMatthias Schmidt 
3017d8fb588SMatthias Schmidt 		if (xc != NULL)
3027d8fb588SMatthias Schmidt 		    xprintf("%s ", xc);
3037d8fb588SMatthias Schmidt 		else
3047d8fb588SMatthias Schmidt 		    xprintf("*cpu %d* ", (int) (p[i] & SPATH_MASK));
3057d8fb588SMatthias Schmidt 		/*
3067d8fb588SMatthias Schmidt 		 * BUG in the aix code... needs that cause if
3077d8fb588SMatthias Schmidt 		 * sfxcode fails once it fails for ever
3087d8fb588SMatthias Schmidt 		 */
3097d8fb588SMatthias Schmidt 		endsf();
3107d8fb588SMatthias Schmidt 	    }
3117d8fb588SMatthias Schmidt 	}
3127d8fb588SMatthias Schmidt 	else {
3137d8fb588SMatthias Schmidt 	    if (p[i] == NULLSITE)
3147d8fb588SMatthias Schmidt 		xprintf(local);
3157d8fb588SMatthias Schmidt 	    else if ((st = sfnum(p[i])) != NULL)
3167d8fb588SMatthias Schmidt 		xprintf("%s ", st->sf_sname);
3177d8fb588SMatthias Schmidt 	    else
3187d8fb588SMatthias Schmidt 		xprintf("*site %d* ", (int) (p[i] & SPATH_MASK));
3197d8fb588SMatthias Schmidt 	}
3207d8fb588SMatthias Schmidt     }
3217d8fb588SMatthias Schmidt     xputchar('\n');
3227d8fb588SMatthias Schmidt     flush();
3237d8fb588SMatthias Schmidt }
3247d8fb588SMatthias Schmidt 
3257d8fb588SMatthias Schmidt /*ARGSUSED*/
3267d8fb588SMatthias Schmidt void
dosetspath(Char ** v,struct command * c)3277d8fb588SMatthias Schmidt dosetspath(Char **v, struct command *c)
3287d8fb588SMatthias Schmidt {
3297d8fb588SMatthias Schmidt     int     i;
3307d8fb588SMatthias Schmidt     short   j;
3317d8fb588SMatthias Schmidt     char   *s;
3327d8fb588SMatthias Schmidt     sitepath_t p[MAXSITE];
3337d8fb588SMatthias Schmidt     struct sf *st;
3347d8fb588SMatthias Schmidt 
3357d8fb588SMatthias Schmidt     /*
3367d8fb588SMatthias Schmidt      * sfname() on AIX G9.9 at least, mallocs too pointers p, q
3377d8fb588SMatthias Schmidt      * then does the equivalent of while (*p++ == *q++) continue;
3387d8fb588SMatthias Schmidt      * and then tries to free(p,q) them! Congrats to the wizard who
3397d8fb588SMatthias Schmidt      * wrote that one. I bet he tested it really well too.
3407d8fb588SMatthias Schmidt      * Sooo, we set dont_free :-)
3417d8fb588SMatthias Schmidt      */
3427d8fb588SMatthias Schmidt     dont_free = 1;
3437d8fb588SMatthias Schmidt     for (i = 0, v++; *v && *v[0] != '\0'; v++, i++) {
3447d8fb588SMatthias Schmidt 	s = short2str(*v);
3457d8fb588SMatthias Schmidt 	if (isdigit(*s))
3467d8fb588SMatthias Schmidt 	    p[i] = atoi(s);
3477d8fb588SMatthias Schmidt 	else if (strcmp(s, "LOCAL") == 0)
3487d8fb588SMatthias Schmidt 	    p[i] = NULLSITE;
3497d8fb588SMatthias Schmidt 	else if ((st = sfctype(s)) != NULL)
3507d8fb588SMatthias Schmidt 	    p[i] = SPATH_CPU | st->sf_ccode;
3517d8fb588SMatthias Schmidt 	else if ((j = getxid(s)) != -1)
3527d8fb588SMatthias Schmidt 	    p[i] = SPATH_CPU | j;
3537d8fb588SMatthias Schmidt 	else if ((st = sfname(s)) != NULL)
3547d8fb588SMatthias Schmidt 	    p[i] = st->sf_id;
3557d8fb588SMatthias Schmidt 	else {
3567d8fb588SMatthias Schmidt 	    setname(s);
3577d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 1, "Bad cpu/site name"));
3587d8fb588SMatthias Schmidt 	}
3597d8fb588SMatthias Schmidt 	if (i == MAXSITE - 1)
3607d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 2, "Site path too long"));
3617d8fb588SMatthias Schmidt     }
3627d8fb588SMatthias Schmidt     if (setspath(p, i) == -1)
3637d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, "setspath", strerror(errno));
3647d8fb588SMatthias Schmidt     dont_free = 0;
3657d8fb588SMatthias Schmidt }
3667d8fb588SMatthias Schmidt 
3677d8fb588SMatthias Schmidt /* sitename():
3687d8fb588SMatthias Schmidt  *	Return the site name where the process is running
3697d8fb588SMatthias Schmidt  */
3707d8fb588SMatthias Schmidt char   *
sitename(pid_t pid)3717d8fb588SMatthias Schmidt sitename(pid_t pid)
3727d8fb588SMatthias Schmidt {
3737d8fb588SMatthias Schmidt     siteno_t ss;
3747d8fb588SMatthias Schmidt     struct sf *st;
3757d8fb588SMatthias Schmidt 
3767d8fb588SMatthias Schmidt     if ((ss = site(pid)) == -1 || (st = sfnum(ss)) == NULL)
3777d8fb588SMatthias Schmidt 	return CGETS(23, 3, "unknown");
3787d8fb588SMatthias Schmidt     else
3797d8fb588SMatthias Schmidt 	return st->sf_sname;
3807d8fb588SMatthias Schmidt }
3817d8fb588SMatthias Schmidt 
3827d8fb588SMatthias Schmidt static int
migratepid(pit_t pid,siteno_t new_site)3837d8fb588SMatthias Schmidt migratepid(pit_t pid, siteno_t new_site)
3847d8fb588SMatthias Schmidt {
3857d8fb588SMatthias Schmidt     struct sf *st;
3867d8fb588SMatthias Schmidt     int     need_local;
3877d8fb588SMatthias Schmidt 
3887d8fb588SMatthias Schmidt     need_local = (pid == 0) || (pid == getpid());
3897d8fb588SMatthias Schmidt 
3907d8fb588SMatthias Schmidt     if (kill3(pid, SIGMIGRATE, new_site) < 0) {
3917d8fb588SMatthias Schmidt 	xprintf("%d: %s\n", pid, strerror(errno));
3927d8fb588SMatthias Schmidt 	return (-1);
3937d8fb588SMatthias Schmidt     }
3947d8fb588SMatthias Schmidt 
3957d8fb588SMatthias Schmidt     if (need_local) {
3967d8fb588SMatthias Schmidt 	if ((new_site = site(0)) == -1) {
3977d8fb588SMatthias Schmidt 	    xprintf(CGETS(23, 4, "site: %s\n"), strerror(errno));
3987d8fb588SMatthias Schmidt 	    return (-1);
3997d8fb588SMatthias Schmidt 	}
4007d8fb588SMatthias Schmidt 	if ((st = sfnum(new_site)) == NULL) {
4017d8fb588SMatthias Schmidt 	    xprintf(CGETS(23, 5, "%d: Site not found\n"), new_site);
4027d8fb588SMatthias Schmidt 	    return (-1);
4037d8fb588SMatthias Schmidt 	}
4047d8fb588SMatthias Schmidt 	if (setlocal(st->sf_local, strlen(st->sf_local)) == -1) {
4057d8fb588SMatthias Schmidt 	    xprintf(CGETS(23, 6, "setlocal: %s: %s\n"),
4067d8fb588SMatthias Schmidt 			  st->sf_local, strerror(errno));
4077d8fb588SMatthias Schmidt 	    return (-1);
4087d8fb588SMatthias Schmidt 	}
4097d8fb588SMatthias Schmidt     }
4107d8fb588SMatthias Schmidt     return (0);
4117d8fb588SMatthias Schmidt }
4127d8fb588SMatthias Schmidt 
4137d8fb588SMatthias Schmidt /*ARGSUSED*/
4147d8fb588SMatthias Schmidt void
domigrate(Char ** v,struct command * c)4157d8fb588SMatthias Schmidt domigrate(Char **v, struct command *c)
4167d8fb588SMatthias Schmidt {
4177d8fb588SMatthias Schmidt     struct sf *st;
4187d8fb588SMatthias Schmidt     char   *s;
4197d8fb588SMatthias Schmidt     Char   *cp;
4207d8fb588SMatthias Schmidt     struct process *pp;
4217d8fb588SMatthias Schmidt     int    err1 = 0;
4227d8fb588SMatthias Schmidt     int    pid = 0;
4237d8fb588SMatthias Schmidt     siteno_t new_site = 0;
4247d8fb588SMatthias Schmidt 
4257d8fb588SMatthias Schmidt     pchild_disabled++;
4267d8fb588SMatthias Schmidt     cleanup_push(&pchild_disabled, disabled_cleanup);
4277d8fb588SMatthias Schmidt     if (setintr) {
4287d8fb588SMatthias Schmidt 	pintr_disabled++;
4297d8fb588SMatthias Schmidt 	cleanup_push(&pintr_disabled, disabled_cleanup);
4307d8fb588SMatthias Schmidt     }
4317d8fb588SMatthias Schmidt 
4327d8fb588SMatthias Schmidt     ++v;
4337d8fb588SMatthias Schmidt     if (*v[0] == '-') {
4347d8fb588SMatthias Schmidt 	/*
4357d8fb588SMatthias Schmidt 	 * Do the -site.
4367d8fb588SMatthias Schmidt 	 */
4377d8fb588SMatthias Schmidt 	s = short2str(&v[0][1]);
4387d8fb588SMatthias Schmidt 	/*
4397d8fb588SMatthias Schmidt 	 * see comment in setspath()
4407d8fb588SMatthias Schmidt 	 */
4417d8fb588SMatthias Schmidt 	dont_free = 1;
4427d8fb588SMatthias Schmidt 	if ((st = sfname(s)) == NULL) {
4437d8fb588SMatthias Schmidt 	    dont_free = 0;
4447d8fb588SMatthias Schmidt 	    setname(s);
4457d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 7, "Site not found"));
4467d8fb588SMatthias Schmidt 	}
4477d8fb588SMatthias Schmidt 	dont_free = 0;
4487d8fb588SMatthias Schmidt 	new_site = st->sf_id;
4497d8fb588SMatthias Schmidt 	++v;
4507d8fb588SMatthias Schmidt     }
4517d8fb588SMatthias Schmidt 
4527d8fb588SMatthias Schmidt     if (!*v || *v[0] == '\0') {
4537d8fb588SMatthias Schmidt 	if (migratepid(0, new_site) == -1)
4547d8fb588SMatthias Schmidt 	    err1++;
4557d8fb588SMatthias Schmidt     }
4567d8fb588SMatthias Schmidt     else {
4577d8fb588SMatthias Schmidt 	Char **globbed;
4587d8fb588SMatthias Schmidt 
4597d8fb588SMatthias Schmidt 	v = glob_all_or_error(v);
4607d8fb588SMatthias Schmidt 	globbed = v;
4617d8fb588SMatthias Schmidt 	cleanup_push(globbed, blk_cleanup);
4627d8fb588SMatthias Schmidt 
4637d8fb588SMatthias Schmidt 	while (v && (cp = *v)) {
4647d8fb588SMatthias Schmidt 	    if (*cp == '%') {
4657d8fb588SMatthias Schmidt 		pp = pfind(cp);
4667d8fb588SMatthias Schmidt 		if (kill3(- pp->p_jobid, SIGMIGRATE, new_site) < 0) {
4677d8fb588SMatthias Schmidt 		    xprintf("%S: %s\n", cp, strerror(errno));
4687d8fb588SMatthias Schmidt 		    err1++;
4697d8fb588SMatthias Schmidt 		}
4707d8fb588SMatthias Schmidt 	    }
4717d8fb588SMatthias Schmidt 	    else if (!(Isdigit(*cp) || *cp == '-'))
4727d8fb588SMatthias Schmidt 		stderror(ERR_NAME | ERR_JOBARGS);
4737d8fb588SMatthias Schmidt 	    else {
4747d8fb588SMatthias Schmidt 		pid = atoi(short2str(cp));
4757d8fb588SMatthias Schmidt 		if (migratepid(pid, new_site) == -1)
4767d8fb588SMatthias Schmidt 		    err1++;
4777d8fb588SMatthias Schmidt 	    }
4787d8fb588SMatthias Schmidt 	    v++;
4797d8fb588SMatthias Schmidt 	}
4807d8fb588SMatthias Schmidt 	cleanup_until(globbed);
4817d8fb588SMatthias Schmidt     }
4827d8fb588SMatthias Schmidt 
4837d8fb588SMatthias Schmidt done:
4847d8fb588SMatthias Schmidt     cleanup_until(&pchild_disabled);
4857d8fb588SMatthias Schmidt     if (err1)
4867d8fb588SMatthias Schmidt 	stderror(ERR_SILENT);
4877d8fb588SMatthias Schmidt }
4887d8fb588SMatthias Schmidt 
4897d8fb588SMatthias Schmidt #endif /* TCF */
4907d8fb588SMatthias Schmidt 
4917d8fb588SMatthias Schmidt /***
4927d8fb588SMatthias Schmidt  *** CRAY ddmode <velo@sesun3.epfl.ch> (Martin Ouwehand EPFL-SIC/SE)
4937d8fb588SMatthias Schmidt  ***/
4947d8fb588SMatthias Schmidt #if defined(_CRAY) && !defined(_CRAYMPP)
4957d8fb588SMatthias Schmidt void
dodmmode(Char ** v,struct command * c)4967d8fb588SMatthias Schmidt dodmmode(Char **v, struct command *c)
4977d8fb588SMatthias Schmidt {
4987d8fb588SMatthias Schmidt     Char *cp = v[1];
4997d8fb588SMatthias Schmidt 
5007d8fb588SMatthias Schmidt     USE(c);
5017d8fb588SMatthias Schmidt 
5027d8fb588SMatthias Schmidt     if ( !cp ) {
5037d8fb588SMatthias Schmidt 	int mode;
5047d8fb588SMatthias Schmidt 
5057d8fb588SMatthias Schmidt 	mode = dmmode(0);
5067d8fb588SMatthias Schmidt 	dmmode(mode);
5077d8fb588SMatthias Schmidt 	xprintf("%d\n",mode);
5087d8fb588SMatthias Schmidt     }
5097d8fb588SMatthias Schmidt     else {
5107d8fb588SMatthias Schmidt 	if (cp[1] != '\0')
5117d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING,
5127d8fb588SMatthias Schmidt 		     CGETS(23, 30, "Too many arguments"));
5137d8fb588SMatthias Schmidt 	else
5147d8fb588SMatthias Schmidt 	    switch(*cp) {
5157d8fb588SMatthias Schmidt 	    case '0':
5167d8fb588SMatthias Schmidt 		dmmode(0);
5177d8fb588SMatthias Schmidt 		break;
5187d8fb588SMatthias Schmidt 	    case '1':
5197d8fb588SMatthias Schmidt 		dmmode(1);
5207d8fb588SMatthias Schmidt 		break;
5217d8fb588SMatthias Schmidt 	    default:
5227d8fb588SMatthias Schmidt 		stderror(ERR_NAME | ERR_STRING,
5237d8fb588SMatthias Schmidt 			 CGETS(23, 31, "Invalid argument"));
5247d8fb588SMatthias Schmidt 	    }
5257d8fb588SMatthias Schmidt     }
5267d8fb588SMatthias Schmidt }
5277d8fb588SMatthias Schmidt #endif /* _CRAY && !_CRAYMPP */
5287d8fb588SMatthias Schmidt 
5297d8fb588SMatthias Schmidt 
5307d8fb588SMatthias Schmidt /***
5317d8fb588SMatthias Schmidt  *** CONVEX Warps.
5327d8fb588SMatthias Schmidt  ***/
5337d8fb588SMatthias Schmidt 
5347d8fb588SMatthias Schmidt #ifdef WARP
5357d8fb588SMatthias Schmidt /*
5367d8fb588SMatthias Schmidt  * handle the funky warping of symlinks
5377d8fb588SMatthias Schmidt  */
5387d8fb588SMatthias Schmidt #include <warpdb.h>
5397d8fb588SMatthias Schmidt #include <sys/warp.h>
5407d8fb588SMatthias Schmidt 
5417d8fb588SMatthias Schmidt static jmp_buf sigsys_buf;
5427d8fb588SMatthias Schmidt 
5437d8fb588SMatthias Schmidt static void
catch_sigsys(void)5447d8fb588SMatthias Schmidt catch_sigsys(void)
5457d8fb588SMatthias Schmidt {
5467d8fb588SMatthias Schmidt     sigset_t set;
5477d8fb588SMatthias Schmidt     sigemptyset(&set, SIGSYS);
5487d8fb588SMatthias Schmidt     (void)sigprocmask(SIG_UNBLOCK, &set, NULL);
5497d8fb588SMatthias Schmidt     longjmp(sigsys_buf, 1);
5507d8fb588SMatthias Schmidt }
5517d8fb588SMatthias Schmidt 
5527d8fb588SMatthias Schmidt 
5537d8fb588SMatthias Schmidt /*ARGSUSED*/
5547d8fb588SMatthias Schmidt void
dowarp(Char ** v,struct command * c)5557d8fb588SMatthias Schmidt dowarp(Char **v, struct command *c)
5567d8fb588SMatthias Schmidt {
5577d8fb588SMatthias Schmidt     int     warp, oldwarp;
5587d8fb588SMatthias Schmidt     struct warpent *we;
5597d8fb588SMatthias Schmidt     volatile struct sigaction old_sigsys_handler;
5607d8fb588SMatthias Schmidt     char   *newwarp;
5617d8fb588SMatthias Schmidt 
5627d8fb588SMatthias Schmidt     if (setjmp(sigsys_buf)) {
5637d8fb588SMatthias Schmidt 	sigaction(SIGSYS, &old_sigsys_handler, NULL);
5647d8fb588SMatthias Schmidt 	stderror(ERR_NAME | ERR_STRING,
5657d8fb588SMatthias Schmidt 		 CGETS(23, 8, "You're trapped in a universe you never made"));
5667d8fb588SMatthias Schmidt 	return;
5677d8fb588SMatthias Schmidt     }
5687d8fb588SMatthias Schmidt     sigaction(SIGSYS, NULL, &old_sigsys_handler);
5697d8fb588SMatthias Schmidt     signal(SIGSYS, catch_sigsys);
5707d8fb588SMatthias Schmidt 
5717d8fb588SMatthias Schmidt     warp = getwarp();
5727d8fb588SMatthias Schmidt 
5737d8fb588SMatthias Schmidt     v++;
5747d8fb588SMatthias Schmidt     if (*v == 0) {		/* display warp value */
5757d8fb588SMatthias Schmidt 	if (warp < 0)
5767d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 9, "Getwarp failed"));
5777d8fb588SMatthias Schmidt 	we = getwarpbyvalue(warp);
5787d8fb588SMatthias Schmidt 	if (we)
5797d8fb588SMatthias Schmidt 	    printf("%s\n", we->w_name);
5807d8fb588SMatthias Schmidt 	else
5817d8fb588SMatthias Schmidt 	    printf("%d\n", warp);
5827d8fb588SMatthias Schmidt     }
5837d8fb588SMatthias Schmidt     else {			/* set warp value */
5847d8fb588SMatthias Schmidt 	oldwarp = warp;
5857d8fb588SMatthias Schmidt 	newwarp = short2str(*v);
5867d8fb588SMatthias Schmidt 	if (Isdigit(*v[0]))
5877d8fb588SMatthias Schmidt 	    warp = atoi(newwarp);
5887d8fb588SMatthias Schmidt 	else {
5897d8fb588SMatthias Schmidt 	    we = getwarpbyname(newwarp);
5907d8fb588SMatthias Schmidt 	    if (we)
5917d8fb588SMatthias Schmidt 		warp = we->w_value;
5927d8fb588SMatthias Schmidt 	    else
5937d8fb588SMatthias Schmidt 		warp = -1;
5947d8fb588SMatthias Schmidt 	}
5957d8fb588SMatthias Schmidt 	if ((warp < 0) || (warp >= WARP_MAXLINK))
5967d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 10, "Invalid warp"));
5977d8fb588SMatthias Schmidt 	if ((setwarp(warp) < 0) || (getwarp() != warp)) {
5987d8fb588SMatthias Schmidt 	    (void) setwarp(oldwarp);
5997d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING, CGETS(23, 11, "Setwarp failed"));
6007d8fb588SMatthias Schmidt 	}
6017d8fb588SMatthias Schmidt     }
6027d8fb588SMatthias Schmidt     sigaction(SIGSYS, &old_sigsys_handler, NULL);
6037d8fb588SMatthias Schmidt }
6047d8fb588SMatthias Schmidt #endif /* WARP */
6057d8fb588SMatthias Schmidt 
6067d8fb588SMatthias Schmidt /***
6077d8fb588SMatthias Schmidt  *** Masscomp or HCX
6087d8fb588SMatthias Schmidt  ***/
6097d8fb588SMatthias Schmidt /* Added, DAS DEC-90. */
6107d8fb588SMatthias Schmidt #if defined(masscomp) || defined(_CX_UX)
6117d8fb588SMatthias Schmidt static void
setuniverse_cleanup(void * xbuf)6127d8fb588SMatthias Schmidt setuniverse_cleanup(void *xbuf)
6137d8fb588SMatthias Schmidt {
6147d8fb588SMatthias Schmidt     char *buf;
6157d8fb588SMatthias Schmidt 
6167d8fb588SMatthias Schmidt     buf = xbuf;
6177d8fb588SMatthias Schmidt     setuniverse(buf);
6187d8fb588SMatthias Schmidt }
6197d8fb588SMatthias Schmidt 
6207d8fb588SMatthias Schmidt /*ARGSUSED*/
6217d8fb588SMatthias Schmidt void
douniverse(Char ** v,struct command * c)6227d8fb588SMatthias Schmidt douniverse(Char **v, struct command *c)
6237d8fb588SMatthias Schmidt {
6247d8fb588SMatthias Schmidt     Char *cp = v[1];
6257d8fb588SMatthias Schmidt     Char *cp2;		/* dunno how many elements v comes in with */
6267d8fb588SMatthias Schmidt     char    ubuf[100];
6277d8fb588SMatthias Schmidt 
6287d8fb588SMatthias Schmidt     if (cp == 0) {
6297d8fb588SMatthias Schmidt 	(void) getuniverse(ubuf);
6307d8fb588SMatthias Schmidt 	xprintf("%s\n", ubuf);
6317d8fb588SMatthias Schmidt     }
6327d8fb588SMatthias Schmidt     else {
6337d8fb588SMatthias Schmidt 	cp2 = v[2];
6347d8fb588SMatthias Schmidt 	if (cp2 == 0) {
6357d8fb588SMatthias Schmidt 	    if (*cp == '\0' || setuniverse(short2str(cp)) != 0)
6367d8fb588SMatthias Schmidt 		stderror(ERR_NAME | ERR_STRING, CGETS(23, 12, "Illegal universe"));
6377d8fb588SMatthias Schmidt 	    }
6387d8fb588SMatthias Schmidt 	else {
6397d8fb588SMatthias Schmidt 	    (void) getuniverse(ubuf);
6407d8fb588SMatthias Schmidt 	    if (*cp == '\0' || setuniverse(short2str(cp)) != 0)
6417d8fb588SMatthias Schmidt 		stderror(ERR_NAME | ERR_STRING, CGETS(23, 12, "Illegal universe"));
6427d8fb588SMatthias Schmidt 	    cleanup_push(ubuf, setuniverse_cleanup);
6437d8fb588SMatthias Schmidt 	    if (setintr) {
6447d8fb588SMatthias Schmidt 		pintr_disabled++;
6457d8fb588SMatthias Schmidt 		cleanup_push(&pintr_disabled, disabled_cleanup);
6467d8fb588SMatthias Schmidt 	    }
6477d8fb588SMatthias Schmidt 	    lshift(v, 2);
6487d8fb588SMatthias Schmidt 	    if (setintr)
6497d8fb588SMatthias Schmidt 		cleanup_until(&pintr_disabled);
6507d8fb588SMatthias Schmidt 	    reexecute(c);
6517d8fb588SMatthias Schmidt 	    cleanup_until(ubuf);
6527d8fb588SMatthias Schmidt 	}
6537d8fb588SMatthias Schmidt     }
6547d8fb588SMatthias Schmidt }
6557d8fb588SMatthias Schmidt #endif /* masscomp || _CX_UX */
6567d8fb588SMatthias Schmidt 
6577d8fb588SMatthias Schmidt /***
6587d8fb588SMatthias Schmidt  *** BS2000/OSD POSIX (Fujitsu Siemens Computers)
6597d8fb588SMatthias Schmidt  ***/
6607d8fb588SMatthias Schmidt #if defined(_OSD_POSIX)
6617d8fb588SMatthias Schmidt static int
bs2upcase(char * str)6627d8fb588SMatthias Schmidt bs2upcase(char *str)
6637d8fb588SMatthias Schmidt {
6647d8fb588SMatthias Schmidt     enum { outside = ' ', singlequote='\'', doublequote='"'} string = outside;
6657d8fb588SMatthias Schmidt 
6667d8fb588SMatthias Schmidt     char *white;
6677d8fb588SMatthias Schmidt 
6687d8fb588SMatthias Schmidt     for (white = str + strlen(str) - 1; isspace(*white) && white > str; --white)
6697d8fb588SMatthias Schmidt         *white = '\0';
6707d8fb588SMatthias Schmidt 
6717d8fb588SMatthias Schmidt     for (; *str != '\0'; ++str)
6727d8fb588SMatthias Schmidt     {
6737d8fb588SMatthias Schmidt         if (string == outside)
6747d8fb588SMatthias Schmidt         {
6757d8fb588SMatthias Schmidt             *str = toupper (*str);
6767d8fb588SMatthias Schmidt         }
6777d8fb588SMatthias Schmidt         if (*str == '\'')
6787d8fb588SMatthias Schmidt         {
6797d8fb588SMatthias Schmidt             if (string == outside)
6807d8fb588SMatthias Schmidt                 string = singlequote;
6817d8fb588SMatthias Schmidt             else if (string != doublequote)
6827d8fb588SMatthias Schmidt                 string = outside;
6837d8fb588SMatthias Schmidt         }
6847d8fb588SMatthias Schmidt         else if (*str == '"')
6857d8fb588SMatthias Schmidt         {
6867d8fb588SMatthias Schmidt             if (string == outside)
6877d8fb588SMatthias Schmidt                 string = doublequote;
6887d8fb588SMatthias Schmidt             else if (string != singlequote)
6897d8fb588SMatthias Schmidt                 string = outside;
6907d8fb588SMatthias Schmidt         }
6917d8fb588SMatthias Schmidt     }
6927d8fb588SMatthias Schmidt     if (string != outside)
6937d8fb588SMatthias Schmidt     {
6947d8fb588SMatthias Schmidt         stderror(ERR_NAME | ERR_UNMATCHED, (Char) string);
6957d8fb588SMatthias Schmidt         return 1;
6967d8fb588SMatthias Schmidt     }
6977d8fb588SMatthias Schmidt     return 0;
6987d8fb588SMatthias Schmidt }
6997d8fb588SMatthias Schmidt static int
bs2cmdlist(char * str)7007d8fb588SMatthias Schmidt bs2cmdlist(char *str)
7017d8fb588SMatthias Schmidt {
7027d8fb588SMatthias Schmidt     char *str_beg = NULL;
7037d8fb588SMatthias Schmidt     int ret = 0;
7047d8fb588SMatthias Schmidt 
7057d8fb588SMatthias Schmidt     enum { outside = ' ', singlequote='\'', doublequote='"'} string = outside;
7067d8fb588SMatthias Schmidt 
7077d8fb588SMatthias Schmidt     while (*str != '\0')
7087d8fb588SMatthias Schmidt     {
7097d8fb588SMatthias Schmidt         while (isspace(*str))
7107d8fb588SMatthias Schmidt             ++str;
7117d8fb588SMatthias Schmidt 
7127d8fb588SMatthias Schmidt         if (*str == '\0')
7137d8fb588SMatthias Schmidt             break;
7147d8fb588SMatthias Schmidt 
7157d8fb588SMatthias Schmidt         str_beg = str;
7167d8fb588SMatthias Schmidt 
7177d8fb588SMatthias Schmidt         for (; *str != '\0'; ++str)
7187d8fb588SMatthias Schmidt         {
7197d8fb588SMatthias Schmidt             if (string == outside && *str == ';') /* End of command */
7207d8fb588SMatthias Schmidt             {
7217d8fb588SMatthias Schmidt                 *str++ = '\0';
7227d8fb588SMatthias Schmidt                 break;    /* continue with next command */
7237d8fb588SMatthias Schmidt             }
7247d8fb588SMatthias Schmidt             if (*str == '\'')
7257d8fb588SMatthias Schmidt             {
7267d8fb588SMatthias Schmidt                 if (string == outside)
7277d8fb588SMatthias Schmidt                     string = singlequote;
7287d8fb588SMatthias Schmidt                 else if (string != doublequote)
7297d8fb588SMatthias Schmidt                     string = outside;
7307d8fb588SMatthias Schmidt             }
7317d8fb588SMatthias Schmidt             else if (*str == '"')
7327d8fb588SMatthias Schmidt             {
7337d8fb588SMatthias Schmidt                 if (string == outside)
7347d8fb588SMatthias Schmidt                     string = doublequote;
7357d8fb588SMatthias Schmidt                 else if (string != singlequote)
7367d8fb588SMatthias Schmidt                     string = outside;
7377d8fb588SMatthias Schmidt             }
7387d8fb588SMatthias Schmidt         }
7397d8fb588SMatthias Schmidt         if (strlen(str_beg) != 0)
7407d8fb588SMatthias Schmidt         {
7417d8fb588SMatthias Schmidt             ret = bs2system(str_beg);
7427d8fb588SMatthias Schmidt 	    flush();
7437d8fb588SMatthias Schmidt             if (ret != 0 /*&& !option.err_ignore*/)
7447d8fb588SMatthias Schmidt                 break; /* do not continue after errors */
7457d8fb588SMatthias Schmidt         }
7467d8fb588SMatthias Schmidt     }
7477d8fb588SMatthias Schmidt 
7487d8fb588SMatthias Schmidt     if (string != outside)
7497d8fb588SMatthias Schmidt     {
7507d8fb588SMatthias Schmidt         stderror(ERR_NAME | ERR_UNMATCHED, (Char) string);
7517d8fb588SMatthias Schmidt         return -1;
7527d8fb588SMatthias Schmidt     }
7537d8fb588SMatthias Schmidt 
7547d8fb588SMatthias Schmidt     return ret;
7557d8fb588SMatthias Schmidt }
7567d8fb588SMatthias Schmidt /*ARGSUSED*/
7577d8fb588SMatthias Schmidt void
dobs2cmd(Char ** v,struct command * c)7587d8fb588SMatthias Schmidt dobs2cmd(Char **v, struct command *c)
7597d8fb588SMatthias Schmidt {
7607d8fb588SMatthias Schmidt     Char *cp, **globbed;
7617d8fb588SMatthias Schmidt     int  i = 0, len = 0;
7627d8fb588SMatthias Schmidt     char *cmd = NULL;
7637d8fb588SMatthias Schmidt     int     pvec[2];
7647d8fb588SMatthias Schmidt     struct command faket;
7657d8fb588SMatthias Schmidt     Char   *fakecom[2];
7667d8fb588SMatthias Schmidt     char    tibuf[BUFSIZE];
7677d8fb588SMatthias Schmidt     int     icnt, old_pintr_disabled;
7687d8fb588SMatthias Schmidt     static const Char STRbs2cmd[] = { 'b','s','2','c','m','d','\0' };
7697d8fb588SMatthias Schmidt 
7707d8fb588SMatthias Schmidt     v++;
7717d8fb588SMatthias Schmidt     if (setintr)
7727d8fb588SMatthias Schmidt 	pintr_push_enable(&old_pintr_disabled);
7737d8fb588SMatthias Schmidt     v = glob_all_or_error(v);
7747d8fb588SMatthias Schmidt     if (setintr)
7757d8fb588SMatthias Schmidt 	cleanup_until(&old_pintr_disabled);
7767d8fb588SMatthias Schmidt     globbed = v;
7777d8fb588SMatthias Schmidt     cleanup_push(globbed, blk_cleanup);
7787d8fb588SMatthias Schmidt 
7797d8fb588SMatthias Schmidt     /* First round: count the string lengths */
7807d8fb588SMatthias Schmidt     for (i=0; v[i]; ++i) {
7817d8fb588SMatthias Schmidt 	len += Strlen(v[i]) + (v[i+1] != NULL);
7827d8fb588SMatthias Schmidt     }
7837d8fb588SMatthias Schmidt 
7847d8fb588SMatthias Schmidt     cmd = xmalloc(len+1); /* 1 for the final '\0' *//* FIXME: memory leak? */
7857d8fb588SMatthias Schmidt 
7867d8fb588SMatthias Schmidt     /* 2nd round: fill cmd buffer */
7877d8fb588SMatthias Schmidt     i = 0;
7887d8fb588SMatthias Schmidt     while ((cp = *v++) != 0) {
7897d8fb588SMatthias Schmidt 	int c;
7907d8fb588SMatthias Schmidt 	while (c = *cp++)
7917d8fb588SMatthias Schmidt 	    cmd[i++] = (char)c;
7927d8fb588SMatthias Schmidt         if (*v)
7937d8fb588SMatthias Schmidt 	    cmd[i++] = ' ';
7947d8fb588SMatthias Schmidt     }
7957d8fb588SMatthias Schmidt     cmd[i] = '\0';
7967d8fb588SMatthias Schmidt 
7977d8fb588SMatthias Schmidt     /* Make upper case */
7987d8fb588SMatthias Schmidt     bs2upcase(cmd);
7997d8fb588SMatthias Schmidt 
8007d8fb588SMatthias Schmidt     faket.t_dtyp = NODE_COMMAND;
8017d8fb588SMatthias Schmidt     faket.t_dflg = F_BACKQ|F_STDERR;
8027d8fb588SMatthias Schmidt     faket.t_dlef = 0;
8037d8fb588SMatthias Schmidt     faket.t_drit = 0;
8047d8fb588SMatthias Schmidt     faket.t_dspr = 0;
8057d8fb588SMatthias Schmidt     faket.t_dcom = fakecom;
8067d8fb588SMatthias Schmidt     fakecom[0] = (Char *)STRbs2cmd;
8077d8fb588SMatthias Schmidt     fakecom[1] = 0;
8087d8fb588SMatthias Schmidt 
8097d8fb588SMatthias Schmidt     mypipe(pvec);
8107d8fb588SMatthias Schmidt     cleanup_push(&pvec[0], open_cleanup);
8117d8fb588SMatthias Schmidt     cleanup_push(&pvec[1], open_cleanup);
8127d8fb588SMatthias Schmidt     if (pfork(&faket, -1) == 0) {
8137d8fb588SMatthias Schmidt 	sigset_t set;
8147d8fb588SMatthias Schmidt         /* child */
8157d8fb588SMatthias Schmidt         xclose(pvec[0]);
8167d8fb588SMatthias Schmidt         (void) dmove(pvec[1], 1);
8177d8fb588SMatthias Schmidt         (void) dmove(SHDIAG,  2);
8187d8fb588SMatthias Schmidt         initdesc();
8197d8fb588SMatthias Schmidt 	sigemptyset(&set);
8207d8fb588SMatthias Schmidt 	sigaddset(&set, SIGINT);
8217d8fb588SMatthias Schmidt 	(void)sigprocmask(SIG_UNBLOCK, &set, NULL);
8227d8fb588SMatthias Schmidt #ifdef SIGTSTP
8237d8fb588SMatthias Schmidt         signal(SIGTSTP, SIG_IGN);
8247d8fb588SMatthias Schmidt #endif
8257d8fb588SMatthias Schmidt #ifdef SIGTTIN
8267d8fb588SMatthias Schmidt         signal(SIGTTIN, SIG_IGN);
8277d8fb588SMatthias Schmidt #endif
8287d8fb588SMatthias Schmidt #ifdef SIGTTOU
8297d8fb588SMatthias Schmidt         signal(SIGTTOU, SIG_IGN);
8307d8fb588SMatthias Schmidt #endif
8317d8fb588SMatthias Schmidt         xexit(bs2cmdlist(cmd));
8327d8fb588SMatthias Schmidt     }
8337d8fb588SMatthias Schmidt     cleanup_until(&pvec[1]);
8347d8fb588SMatthias Schmidt     for (;;) {
8357d8fb588SMatthias Schmidt 	int old_pintr_disabled;
8367d8fb588SMatthias Schmidt 
8377d8fb588SMatthias Schmidt 	if (setintr)
8387d8fb588SMatthias Schmidt 	    pintr_push_enable(&old_pintr_disabled);
8397d8fb588SMatthias Schmidt 	icnt = xread(pvec[0], tibuf, sizeof(tibuf));
8407d8fb588SMatthias Schmidt 	if (setintr)
8417d8fb588SMatthias Schmidt 	    cleanup_until(&old_pintr_disabled);
8427d8fb588SMatthias Schmidt         if (icnt <= 0)
8437d8fb588SMatthias Schmidt             break;
8447d8fb588SMatthias Schmidt         for (i = 0; i < icnt; i++)
8457d8fb588SMatthias Schmidt             xputchar((unsigned char) tibuf[i]);
8467d8fb588SMatthias Schmidt     }
8477d8fb588SMatthias Schmidt     cleanup_until(&pvec[0]);
8487d8fb588SMatthias Schmidt     pwait();
8497d8fb588SMatthias Schmidt 
8507d8fb588SMatthias Schmidt     flush();
8517d8fb588SMatthias Schmidt 
8527d8fb588SMatthias Schmidt     cleanup_until(globbed);
8537d8fb588SMatthias Schmidt }
8547d8fb588SMatthias Schmidt #endif /* _OSD_POSIX */
8557d8fb588SMatthias Schmidt 
8567d8fb588SMatthias Schmidt #if defined(_CX_UX)
8577d8fb588SMatthias Schmidt static void
setuniverse_cleanup(void * xbuf)8587d8fb588SMatthias Schmidt setuniverse_cleanup(void *xbuf)
8597d8fb588SMatthias Schmidt {
8607d8fb588SMatthias Schmidt     char *buf;
8617d8fb588SMatthias Schmidt 
8627d8fb588SMatthias Schmidt     buf = xbuf;
8637d8fb588SMatthias Schmidt     setuniverse(buf);
8647d8fb588SMatthias Schmidt }
8657d8fb588SMatthias Schmidt 
8667d8fb588SMatthias Schmidt /*ARGSUSED*/
8677d8fb588SMatthias Schmidt void
doatt(Char ** v,struct command * c)8687d8fb588SMatthias Schmidt doatt(Char **v, struct command *c)
8697d8fb588SMatthias Schmidt {
8707d8fb588SMatthias Schmidt     Char *cp = v[1];
8717d8fb588SMatthias Schmidt     char    ubuf[100];
8727d8fb588SMatthias Schmidt 
8737d8fb588SMatthias Schmidt     if (cp == 0)
8747d8fb588SMatthias Schmidt 	(void) setuniverse("att");
8757d8fb588SMatthias Schmidt     else {
8767d8fb588SMatthias Schmidt 	(void) getuniverse(ubuf);
8777d8fb588SMatthias Schmidt 	(void) setuniverse("att");
8787d8fb588SMatthias Schmidt 	cleanup_push(ubuf, setuniverse_cleanup);
8797d8fb588SMatthias Schmidt 	if (setintr) {
8807d8fb588SMatthias Schmidt 	    pintr_disabled++;
8817d8fb588SMatthias Schmidt 	    cleanup_push(&pintr_disabled, disabled_cleanup);
8827d8fb588SMatthias Schmidt 	}
8837d8fb588SMatthias Schmidt 	lshift(v, 1);
8847d8fb588SMatthias Schmidt 	if (setintr)
8857d8fb588SMatthias Schmidt 	    cleanup_until(&pintr_disabled);
8867d8fb588SMatthias Schmidt 	reexecute(c);
8877d8fb588SMatthias Schmidt 	cleanup_until(ubuf);
8887d8fb588SMatthias Schmidt     }
8897d8fb588SMatthias Schmidt }
8907d8fb588SMatthias Schmidt 
8917d8fb588SMatthias Schmidt /*ARGSUSED*/
8927d8fb588SMatthias Schmidt void
doucb(Char ** v,struct command * c)8937d8fb588SMatthias Schmidt doucb(Char **v, struct command *c)
8947d8fb588SMatthias Schmidt {
8957d8fb588SMatthias Schmidt     Char *cp = v[1];
8967d8fb588SMatthias Schmidt     char    ubuf[100];
8977d8fb588SMatthias Schmidt 
8987d8fb588SMatthias Schmidt     if (cp == 0)
8997d8fb588SMatthias Schmidt 	(void) setuniverse("ucb");
9007d8fb588SMatthias Schmidt     else {
9017d8fb588SMatthias Schmidt 	(void) getuniverse(ubuf);
9027d8fb588SMatthias Schmidt 	(void) setuniverse("ucb");
9037d8fb588SMatthias Schmidt 	cleanup_push(ubuf, setuniverse_cleanup);
9047d8fb588SMatthias Schmidt 	if (setintr) {
9057d8fb588SMatthias Schmidt 	    pintr_disabled++;
9067d8fb588SMatthias Schmidt 	    cleanup_push(&pintr_disabled, disabled_cleanup);
9077d8fb588SMatthias Schmidt 	}
9087d8fb588SMatthias Schmidt 	lshift(v, 1);
9097d8fb588SMatthias Schmidt 	if (setintr)
9107d8fb588SMatthias Schmidt 	    cleanup_until(&pintr_disabled);
9117d8fb588SMatthias Schmidt 	reexecute(c);
9127d8fb588SMatthias Schmidt 	cleanup_until(ubuf);
9137d8fb588SMatthias Schmidt     }
9147d8fb588SMatthias Schmidt }
9157d8fb588SMatthias Schmidt #endif /* _CX_UX */
9167d8fb588SMatthias Schmidt 
9177d8fb588SMatthias Schmidt #ifdef _SEQUENT_
9187d8fb588SMatthias Schmidt /*
9197d8fb588SMatthias Schmidt  * Compute the difference in process stats.
9207d8fb588SMatthias Schmidt  */
9217d8fb588SMatthias Schmidt void
pr_stat_sub(struct process_stats * p2,struct process_stats * p1,struct process_stats * pr)9227d8fb588SMatthias Schmidt pr_stat_sub(struct process_stats *p2, struct process_stats *p1,
9237d8fb588SMatthias Schmidt 	    struct process_stats *pr)
9247d8fb588SMatthias Schmidt {
9257d8fb588SMatthias Schmidt     pr->ps_utime.tv_sec = p2->ps_utime.tv_sec - p1->ps_utime.tv_sec;
9267d8fb588SMatthias Schmidt     pr->ps_utime.tv_usec = p2->ps_utime.tv_usec - p1->ps_utime.tv_usec;
9277d8fb588SMatthias Schmidt     if (pr->ps_utime.tv_usec < 0) {
9287d8fb588SMatthias Schmidt 	pr->ps_utime.tv_sec -= 1;
9297d8fb588SMatthias Schmidt 	pr->ps_utime.tv_usec += 1000000;
9307d8fb588SMatthias Schmidt     }
9317d8fb588SMatthias Schmidt     pr->ps_stime.tv_sec = p2->ps_stime.tv_sec - p1->ps_stime.tv_sec;
9327d8fb588SMatthias Schmidt     pr->ps_stime.tv_usec = p2->ps_stime.tv_usec - p1->ps_stime.tv_usec;
9337d8fb588SMatthias Schmidt     if (pr->ps_stime.tv_usec < 0) {
9347d8fb588SMatthias Schmidt 	pr->ps_stime.tv_sec -= 1;
9357d8fb588SMatthias Schmidt 	pr->ps_stime.tv_usec += 1000000;
9367d8fb588SMatthias Schmidt     }
9377d8fb588SMatthias Schmidt 
9387d8fb588SMatthias Schmidt     pr->ps_maxrss = p2->ps_maxrss - p1->ps_maxrss;
9397d8fb588SMatthias Schmidt     pr->ps_pagein = p2->ps_pagein - p1->ps_pagein;
9407d8fb588SMatthias Schmidt     pr->ps_reclaim = p2->ps_reclaim - p1->ps_reclaim;
9417d8fb588SMatthias Schmidt     pr->ps_zerofill = p2->ps_zerofill - p1->ps_zerofill;
9427d8fb588SMatthias Schmidt     pr->ps_pffincr = p2->ps_pffincr - p1->ps_pffincr;
9437d8fb588SMatthias Schmidt     pr->ps_pffdecr = p2->ps_pffdecr - p1->ps_pffdecr;
9447d8fb588SMatthias Schmidt     pr->ps_swap = p2->ps_swap - p1->ps_swap;
9457d8fb588SMatthias Schmidt     pr->ps_syscall = p2->ps_syscall - p1->ps_syscall;
9467d8fb588SMatthias Schmidt     pr->ps_volcsw = p2->ps_volcsw - p1->ps_volcsw;
9477d8fb588SMatthias Schmidt     pr->ps_involcsw = p2->ps_involcsw - p1->ps_involcsw;
9487d8fb588SMatthias Schmidt     pr->ps_signal = p2->ps_signal - p1->ps_signal;
9497d8fb588SMatthias Schmidt     pr->ps_lread = p2->ps_lread - p1->ps_lread;
9507d8fb588SMatthias Schmidt     pr->ps_lwrite = p2->ps_lwrite - p1->ps_lwrite;
9517d8fb588SMatthias Schmidt     pr->ps_bread = p2->ps_bread - p1->ps_bread;
9527d8fb588SMatthias Schmidt     pr->ps_bwrite = p2->ps_bwrite - p1->ps_bwrite;
9537d8fb588SMatthias Schmidt     pr->ps_phread = p2->ps_phread - p1->ps_phread;
9547d8fb588SMatthias Schmidt     pr->ps_phwrite = p2->ps_phwrite - p1->ps_phwrite;
9557d8fb588SMatthias Schmidt }
9567d8fb588SMatthias Schmidt 
9577d8fb588SMatthias Schmidt #endif /* _SEQUENT_ */
9587d8fb588SMatthias Schmidt 
9597d8fb588SMatthias Schmidt 
9607d8fb588SMatthias Schmidt #ifndef HAVE_MEMSET
9617d8fb588SMatthias Schmidt /* This is a replacement for a missing memset function */
xmemset(void * loc,int value,size_t len)9627d8fb588SMatthias Schmidt void *xmemset(void *loc, int value, size_t len)
9637d8fb588SMatthias Schmidt {
9647d8fb588SMatthias Schmidt     char *ptr = loc;
9657d8fb588SMatthias Schmidt 
9667d8fb588SMatthias Schmidt     while (len--)
9677d8fb588SMatthias Schmidt 	*ptr++ = value;
9687d8fb588SMatthias Schmidt     return loc;
9697d8fb588SMatthias Schmidt }
9707d8fb588SMatthias Schmidt #endif /* !HAVE_MEMSET */
9717d8fb588SMatthias Schmidt 
9727d8fb588SMatthias Schmidt 
9737d8fb588SMatthias Schmidt #ifndef HAVE_MEMMOVE
9747d8fb588SMatthias Schmidt /* memmove():
9757d8fb588SMatthias Schmidt  * 	This is the ANSI form of bcopy() with the arguments backwards...
9767d8fb588SMatthias Schmidt  *	Unlike memcpy(), it handles overlaps between source and
9777d8fb588SMatthias Schmidt  *	destination memory
9787d8fb588SMatthias Schmidt  */
9797d8fb588SMatthias Schmidt void *
xmemmove(void * vdst,const void * vsrc,size_t len)9807d8fb588SMatthias Schmidt xmemmove(void *vdst, const void *vsrc, size_t len)
9817d8fb588SMatthias Schmidt {
9827d8fb588SMatthias Schmidt     const char *src = vsrc;
9837d8fb588SMatthias Schmidt     char *dst = vdst;
9847d8fb588SMatthias Schmidt 
9857d8fb588SMatthias Schmidt     if (src == dst)
9867d8fb588SMatthias Schmidt 	return vdst;
9877d8fb588SMatthias Schmidt 
9887d8fb588SMatthias Schmidt     if (src > dst) {
9897d8fb588SMatthias Schmidt 	while (len--)
9907d8fb588SMatthias Schmidt 	    *dst++ = *src++;
9917d8fb588SMatthias Schmidt     }
9927d8fb588SMatthias Schmidt     else {
9937d8fb588SMatthias Schmidt 	src += len;
9947d8fb588SMatthias Schmidt 	dst += len;
9957d8fb588SMatthias Schmidt 	while (len--)
9967d8fb588SMatthias Schmidt 	    *--dst = *--src;
9977d8fb588SMatthias Schmidt     }
9987d8fb588SMatthias Schmidt     return vdst;
9997d8fb588SMatthias Schmidt }
10007d8fb588SMatthias Schmidt #endif /* HAVE_MEMMOVE */
10017d8fb588SMatthias Schmidt 
10027d8fb588SMatthias Schmidt 
10037d8fb588SMatthias Schmidt #ifndef WINNT_NATIVE
10047d8fb588SMatthias Schmidt #ifdef NEEDtcgetpgrp
10057d8fb588SMatthias Schmidt pid_t
xtcgetpgrp(int fd)10067d8fb588SMatthias Schmidt xtcgetpgrp(int fd)
10077d8fb588SMatthias Schmidt {
10087d8fb588SMatthias Schmidt     int     pgrp;
10097d8fb588SMatthias Schmidt 
10107d8fb588SMatthias Schmidt     /* ioctl will handle setting errno correctly. */
10117d8fb588SMatthias Schmidt     if (ioctl(fd, TIOCGPGRP, (ioctl_t) & pgrp) < 0)
10127d8fb588SMatthias Schmidt 	return (-1);
10137d8fb588SMatthias Schmidt     return (pgrp);
10147d8fb588SMatthias Schmidt }
10157d8fb588SMatthias Schmidt 
10167d8fb588SMatthias Schmidt /*
10177d8fb588SMatthias Schmidt  * XXX: tcsetpgrp is not a macro any more cause on some systems,
10187d8fb588SMatthias Schmidt  * pid_t is a short, but the ioctl() takes a pointer to int (pyr)
10197d8fb588SMatthias Schmidt  * Thanks to Simon Day (simon@pharaoh.cyborg.bt.co.uk) for pointing
10207d8fb588SMatthias Schmidt  * this out.
10217d8fb588SMatthias Schmidt  */
10227d8fb588SMatthias Schmidt int
xtcsetpgrp(int fd,int pgrp)10237d8fb588SMatthias Schmidt xtcsetpgrp(int fd, int pgrp)
10247d8fb588SMatthias Schmidt {
10257d8fb588SMatthias Schmidt     return ioctl(fd, TIOCSPGRP, (ioctl_t) &pgrp);
10267d8fb588SMatthias Schmidt }
10277d8fb588SMatthias Schmidt 
10287d8fb588SMatthias Schmidt #endif	/* NEEDtcgetpgrp */
10297d8fb588SMatthias Schmidt #endif /* WINNT_NATIVE */
10307d8fb588SMatthias Schmidt 
10317d8fb588SMatthias Schmidt 
10327d8fb588SMatthias Schmidt #ifdef YPBUGS
10337d8fb588SMatthias Schmidt void
fix_yp_bugs(void)10347d8fb588SMatthias Schmidt fix_yp_bugs(void)
10357d8fb588SMatthias Schmidt {
10367d8fb588SMatthias Schmidt     char   *mydomain;
10377d8fb588SMatthias Schmidt 
10387d8fb588SMatthias Schmidt     extern int yp_get_default_domain (char **);
10397d8fb588SMatthias Schmidt     /*
10407d8fb588SMatthias Schmidt      * PWP: The previous version assumed that yp domain was the same as the
10417d8fb588SMatthias Schmidt      * internet name domain.  This isn't allways true. (Thanks to Mat Landau
10427d8fb588SMatthias Schmidt      * <mlandau@bbn.com> for the original version of this.)
10437d8fb588SMatthias Schmidt      */
10447d8fb588SMatthias Schmidt     if (yp_get_default_domain(&mydomain) == 0) {	/* if we got a name */
10457d8fb588SMatthias Schmidt 	extern void yp_unbind (const char *);
10467d8fb588SMatthias Schmidt 
10477d8fb588SMatthias Schmidt 	yp_unbind(mydomain);
10487d8fb588SMatthias Schmidt     }
10497d8fb588SMatthias Schmidt }
10507d8fb588SMatthias Schmidt 
10517d8fb588SMatthias Schmidt #endif /* YPBUGS */
10527d8fb588SMatthias Schmidt 
10537d8fb588SMatthias Schmidt #ifdef STRCOLLBUG
10547d8fb588SMatthias Schmidt void
fix_strcoll_bug(void)10557d8fb588SMatthias Schmidt fix_strcoll_bug(void)
10567d8fb588SMatthias Schmidt {
10577d8fb588SMatthias Schmidt #if defined(NLS) && defined(HAVE_STRCOLL)
10587d8fb588SMatthias Schmidt     /*
10597d8fb588SMatthias Schmidt      * SunOS4 checks the file descriptor from openlocale() for <= 0
10607d8fb588SMatthias Schmidt      * instead of == -1. Someone should tell sun that file descriptor 0
10617d8fb588SMatthias Schmidt      * is valid! Our portable hack: open one so we call it with 0 used...
10627d8fb588SMatthias Schmidt      * We have to call this routine every time the locale changes...
10637d8fb588SMatthias Schmidt      *
10647d8fb588SMatthias Schmidt      * Of course it also tries to free the constant locale "C" it initially
10657d8fb588SMatthias Schmidt      * had allocated, with the sequence
10667d8fb588SMatthias Schmidt      * > setenv LANG "fr"
10677d8fb588SMatthias Schmidt      * > ls^D
10687d8fb588SMatthias Schmidt      * > unsetenv LANG
10697d8fb588SMatthias Schmidt      * But we are smarter than that and just print a warning message.
10707d8fb588SMatthias Schmidt      */
10717d8fb588SMatthias Schmidt     int fd = -1;
10727d8fb588SMatthias Schmidt     static char *root = "/";
10737d8fb588SMatthias Schmidt 
10747d8fb588SMatthias Schmidt     if (!didfds)
10757d8fb588SMatthias Schmidt 	fd = xopen(root, O_RDONLY|O_LARGEFILE);
10767d8fb588SMatthias Schmidt 
10777d8fb588SMatthias Schmidt     (void) strcoll(root, root);
10787d8fb588SMatthias Schmidt 
10797d8fb588SMatthias Schmidt     if (fd != -1)
10807d8fb588SMatthias Schmidt 	xclose(fd);
10817d8fb588SMatthias Schmidt #endif
10827d8fb588SMatthias Schmidt }
10837d8fb588SMatthias Schmidt #endif /* STRCOLLBUG */
10847d8fb588SMatthias Schmidt 
10857d8fb588SMatthias Schmidt 
10867d8fb588SMatthias Schmidt #ifdef OREO
10877d8fb588SMatthias Schmidt #include <compat.h>
10887d8fb588SMatthias Schmidt #endif /* OREO */
10897d8fb588SMatthias Schmidt 
10907d8fb588SMatthias Schmidt void
osinit(void)10917d8fb588SMatthias Schmidt osinit(void)
10927d8fb588SMatthias Schmidt {
10937d8fb588SMatthias Schmidt #ifdef OREO
10947d8fb588SMatthias Schmidt     set42sig();
10957d8fb588SMatthias Schmidt     setcompat(getcompat() & ~COMPAT_EXEC);
10967d8fb588SMatthias Schmidt     signal(SIGIO, SIG_IGN);		/* ignore SIGIO */
10977d8fb588SMatthias Schmidt #endif /* OREO */
10987d8fb588SMatthias Schmidt 
10997d8fb588SMatthias Schmidt #ifdef aiws
11007d8fb588SMatthias Schmidt     {
11017d8fb588SMatthias Schmidt 	struct sigstack inst;
11027d8fb588SMatthias Schmidt 	inst.ss_sp = xmalloc(4192) + 4192;
11037d8fb588SMatthias Schmidt 	inst.ss_onstack = 0;
11047d8fb588SMatthias Schmidt 	sigstack(&inst, NULL);
11057d8fb588SMatthias Schmidt     }
11067d8fb588SMatthias Schmidt #endif /* aiws */
11077d8fb588SMatthias Schmidt 
11087d8fb588SMatthias Schmidt #ifdef apollo
11097d8fb588SMatthias Schmidt     (void) isapad();
11107d8fb588SMatthias Schmidt #endif
11117d8fb588SMatthias Schmidt 
11127d8fb588SMatthias Schmidt #ifdef _SX
11137d8fb588SMatthias Schmidt     /*
11147d8fb588SMatthias Schmidt      * kill(SIGCONT) problems, don't know what this syscall does
11157d8fb588SMatthias Schmidt      * [schott@rzg.mpg.de]
11167d8fb588SMatthias Schmidt      */
11177d8fb588SMatthias Schmidt     syscall(151, getpid(), getpid());
11187d8fb588SMatthias Schmidt #endif /* _SX */
11197d8fb588SMatthias Schmidt }
11207d8fb588SMatthias Schmidt 
11217d8fb588SMatthias Schmidt #ifndef HAVE_STRERROR
11227d8fb588SMatthias Schmidt extern int sys_nerr;
11237d8fb588SMatthias Schmidt extern char *sys_errlist[];
11247d8fb588SMatthias Schmidt char *
xstrerror(int i)11257d8fb588SMatthias Schmidt xstrerror(int i)
11267d8fb588SMatthias Schmidt {
11277d8fb588SMatthias Schmidt     if (i >= 0 && i < sys_nerr) {
11287d8fb588SMatthias Schmidt 	return sys_errlist[i];
11297d8fb588SMatthias Schmidt     } else {
11307d8fb588SMatthias Schmidt 	static char *errbuf; /* = NULL; */
11317d8fb588SMatthias Schmidt 
11327d8fb588SMatthias Schmidt 	xfree(errbuf);
11337d8fb588SMatthias Schmidt 	errbuf = xasprintf(CGETS(23, 13, "Unknown Error: %d"), i);
11347d8fb588SMatthias Schmidt 	return errbuf;
11357d8fb588SMatthias Schmidt     }
11367d8fb588SMatthias Schmidt }
11377d8fb588SMatthias Schmidt #endif /* !HAVE_STRERROR */
11387d8fb588SMatthias Schmidt 
11397d8fb588SMatthias Schmidt #ifndef HAVE_GETHOSTNAME
11407d8fb588SMatthias Schmidt # if !defined(_MINIX) && !defined(__EMX__) && !defined(WINNT_NATIVE)
11417d8fb588SMatthias Schmidt #  include <sys/utsname.h>
11427d8fb588SMatthias Schmidt # endif /* !_MINIX && !__EMX__ && !WINNT_NATIVE */
11437d8fb588SMatthias Schmidt 
11447d8fb588SMatthias Schmidt int
xgethostname(char * name,int namlen)11457d8fb588SMatthias Schmidt xgethostname(char *name, int namlen)
11467d8fb588SMatthias Schmidt {
11477d8fb588SMatthias Schmidt # if !defined(_MINIX) && !defined(__EMX__) && !defined(WINNT_NATIVE)
11487d8fb588SMatthias Schmidt     int     i, retval;
11497d8fb588SMatthias Schmidt     struct utsname uts;
11507d8fb588SMatthias Schmidt 
11517d8fb588SMatthias Schmidt     retval = uname(&uts);
11527d8fb588SMatthias Schmidt 
11537d8fb588SMatthias Schmidt #  ifdef DEBUG
11547d8fb588SMatthias Schmidt     xprintf(CGETS(23, 14, "sysname:  %s\n"), uts.sysname);
11557d8fb588SMatthias Schmidt     xprintf(CGETS(23, 15, "nodename: %s\n"), uts.nodename);
11567d8fb588SMatthias Schmidt     xprintf(CGETS(23, 16, "release:  %s\n"), uts.release);
11577d8fb588SMatthias Schmidt     xprintf(CGETS(23, 17, "version:  %s\n"), uts.version);
11587d8fb588SMatthias Schmidt     xprintf(CGETS(23, 18, "machine:  %s\n"), uts.machine);
11597d8fb588SMatthias Schmidt #  endif /* DEBUG */
11607d8fb588SMatthias Schmidt     i = strlen(uts.nodename) + 1;
11617d8fb588SMatthias Schmidt     (void) strncpy(name, uts.nodename, i < namlen ? i : namlen);
11627d8fb588SMatthias Schmidt 
11637d8fb588SMatthias Schmidt     return retval;
11647d8fb588SMatthias Schmidt # else /* !_MINIX && !__EMX__ */
11657d8fb588SMatthias Schmidt     if (namlen > 0) {
11667d8fb588SMatthias Schmidt #  ifdef __EMX__
11677d8fb588SMatthias Schmidt 	(void) strncpy(name, "OS/2", namlen);
11687d8fb588SMatthias Schmidt #  else /* _MINIX */
11697d8fb588SMatthias Schmidt 	(void) strncpy(name, "minix", namlen);
11707d8fb588SMatthias Schmidt #  endif /* __EMX__ */
11717d8fb588SMatthias Schmidt 	name[namlen-1] = '\0';
11727d8fb588SMatthias Schmidt     }
11737d8fb588SMatthias Schmidt     return(0);
11747d8fb588SMatthias Schmidt #endif /* _MINIX && !__EMX__ */
11757d8fb588SMatthias Schmidt } /* end xgethostname */
11767d8fb588SMatthias Schmidt #endif /* !HAVE_GETHOSTNAME */
11777d8fb588SMatthias Schmidt 
11787d8fb588SMatthias Schmidt #ifndef HAVE_NICE
11797d8fb588SMatthias Schmidt # if defined(_MINIX) && defined(NICE)
11807d8fb588SMatthias Schmidt #  undef _POSIX_SOURCE	/* redefined in <lib.h> */
11817d8fb588SMatthias Schmidt #  undef _MINIX		/* redefined in <lib.h> */
11827d8fb588SMatthias Schmidt #  undef HZ		/* redefined in <minix/const.h> */
11837d8fb588SMatthias Schmidt #  include <lib.h>
11847d8fb588SMatthias Schmidt # endif /* _MINIX && NICE */
11857d8fb588SMatthias Schmidt int
xnice(int incr)11867d8fb588SMatthias Schmidt xnice(int incr)
11877d8fb588SMatthias Schmidt {
11887d8fb588SMatthias Schmidt #if defined(_MINIX) && defined(NICE)
11897d8fb588SMatthias Schmidt     return callm1(MM, NICE, incr, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR);
11907d8fb588SMatthias Schmidt #else
11917d8fb588SMatthias Schmidt     return /* incr ? 0 : */ 0;
11927d8fb588SMatthias Schmidt #endif /* _MINIX && NICE */
11937d8fb588SMatthias Schmidt } /* end xnice */
11947d8fb588SMatthias Schmidt #endif /* !HAVE_NICE */
11957d8fb588SMatthias Schmidt 
11967d8fb588SMatthias Schmidt #ifndef HAVE_GETCWD
11977d8fb588SMatthias Schmidt static char *strnrcpy (char *, char *, size_t);
11987d8fb588SMatthias Schmidt 
11997d8fb588SMatthias Schmidt /* xgetcwd():
12007d8fb588SMatthias Schmidt  *	Return the pathname of the current directory, or return
12017d8fb588SMatthias Schmidt  *	an error message in pathname.
12027d8fb588SMatthias Schmidt  */
12037d8fb588SMatthias Schmidt 
12047d8fb588SMatthias Schmidt # ifdef hp9000s500
12057d8fb588SMatthias Schmidt /*
12067d8fb588SMatthias Schmidt  *  From: Bernd Mohr <mohr@faui77.informatik.uni-erlangen.de>
12077d8fb588SMatthias Schmidt  *  I also ported the tcsh to the HP9000 Series 500. This computer
12087d8fb588SMatthias Schmidt  *  is a little bit different than the other HP 9000 computer. It has
12097d8fb588SMatthias Schmidt  *  a HP Chip instead of a Motorola CPU and it is no "real" UNIX. It runs
12107d8fb588SMatthias Schmidt  *  HP-UX which is emulated in top of a HP operating system. So, the last
12117d8fb588SMatthias Schmidt  *  supported version of HP-UX is 5.2 on the HP9000s500. This has two
12127d8fb588SMatthias Schmidt  *  consequences: it supports no job control and it has a filesystem
12137d8fb588SMatthias Schmidt  *  without "." and ".." !!!
12147d8fb588SMatthias Schmidt  */
12157d8fb588SMatthias Schmidt char *
xgetcwd(char * pathname,size_t pathlen)12167d8fb588SMatthias Schmidt xgetcwd(char *pathname, size_t pathlen)
12177d8fb588SMatthias Schmidt {
12187d8fb588SMatthias Schmidt     char pathbuf[MAXPATHLEN];	/* temporary pathname buffer */
12197d8fb588SMatthias Schmidt     char *pnptr = &pathbuf[(sizeof pathbuf)-1]; /* pathname pointer */
12207d8fb588SMatthias Schmidt     dev_t rdev;			/* root device number */
12217d8fb588SMatthias Schmidt     DIR *dirp = NULL;		/* directory stream */
12227d8fb588SMatthias Schmidt     ino_t rino;			/* root inode number */
12237d8fb588SMatthias Schmidt     off_t rsize;		/* root size */
12247d8fb588SMatthias Schmidt     struct direct *dir;		/* directory entry struct */
12257d8fb588SMatthias Schmidt     struct stat d, dd;		/* file status struct */
12267d8fb588SMatthias Schmidt     int serrno;
12277d8fb588SMatthias Schmidt 
12287d8fb588SMatthias Schmidt     *pnptr = '\0';
12297d8fb588SMatthias Schmidt     (void) stat("/.", &d);
12307d8fb588SMatthias Schmidt     rdev = d.st_dev;
12317d8fb588SMatthias Schmidt     rino = d.st_ino;
12327d8fb588SMatthias Schmidt     rsize = d.st_size;
12337d8fb588SMatthias Schmidt     for (;;) {
12347d8fb588SMatthias Schmidt 	if (stat(".", &d) == -1) {
12357d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 24,
12367d8fb588SMatthias Schmidt 		"getcwd: Cannot stat \".\" (%s)"), strerror(errno));
12377d8fb588SMatthias Schmidt 	    goto fail;
12387d8fb588SMatthias Schmidt 	}
12397d8fb588SMatthias Schmidt 	if (d.st_ino == rino && d.st_dev == rdev && d.st_size == rsize)
12407d8fb588SMatthias Schmidt 	    break;		/* reached root directory */
12417d8fb588SMatthias Schmidt 	if ((dirp = opendir("..")) == NULL) {
12427d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 19,
12437d8fb588SMatthias Schmidt 		"getcwd: Cannot open \"..\" (%s)"), strerror(errno));
12447d8fb588SMatthias Schmidt 	    goto fail;
12457d8fb588SMatthias Schmidt 	}
12467d8fb588SMatthias Schmidt 	if (chdir("..") == -1) {
12477d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 20,
12487d8fb588SMatthias Schmidt 		"getcwd: Cannot chdir to \"..\" (%s)"), strerror(errno));
12497d8fb588SMatthias Schmidt 	    goto fail;
12507d8fb588SMatthias Schmidt 	}
12517d8fb588SMatthias Schmidt 	do {
12527d8fb588SMatthias Schmidt 	    if ((dir = readdir(dirp)) == NULL) {
12537d8fb588SMatthias Schmidt 		(void) xsnprintf(pathname, pathlen,
12547d8fb588SMatthias Schmidt 		    CGETS(23, 21, "getcwd: Read error in \"..\" (%s)"),
12557d8fb588SMatthias Schmidt 		    strerror(errno));
12567d8fb588SMatthias Schmidt 		goto fail;
12577d8fb588SMatthias Schmidt 	    }
12587d8fb588SMatthias Schmidt 	    if (stat(dir->d_name, &dd) == -1) {
12597d8fb588SMatthias Schmidt 		(void) xsnprintf(pathname, pathlen,
12607d8fb588SMatthias Schmidt 		    CGETS(23, 25, "getcwd: Cannot stat directory \"%s\" (%s)"),
12617d8fb588SMatthias Schmidt 		    dir->d_name, strerror(errno));
12627d8fb588SMatthias Schmidt 		goto fail;
12637d8fb588SMatthias Schmidt 	    }
12647d8fb588SMatthias Schmidt 	} while (dd.st_ino  != d.st_ino  ||
12657d8fb588SMatthias Schmidt 		 dd.st_dev  != d.st_dev  ||
12667d8fb588SMatthias Schmidt 		 dd.st_size != d.st_size);
12677d8fb588SMatthias Schmidt 	closedir(dirp);
12687d8fb588SMatthias Schmidt 	dirp = NULL;
12697d8fb588SMatthias Schmidt 	pnptr = strnrcpy(dirp->d_name, pnptr, pnptr - pathbuf);
12707d8fb588SMatthias Schmidt 	pnptr = strnrcpy("/", pnptr, pnptr - pathbuf);
12717d8fb588SMatthias Schmidt     }
12727d8fb588SMatthias Schmidt 
12737d8fb588SMatthias Schmidt     if (*pnptr == '\0')		/* current dir == root dir */
12747d8fb588SMatthias Schmidt 	(void) strncpy(pathname, "/", pathlen);
12757d8fb588SMatthias Schmidt     else {
12767d8fb588SMatthias Schmidt 	(void) strncpy(pathname, pnptr, pathlen);
12777d8fb588SMatthias Schmidt 	pathname[pathlen - 1] = '\0';
12787d8fb588SMatthias Schmidt 	if (chdir(pnptr) == -1) {
12797d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, MAXPATHLEN, CGETS(23, 22,
12807d8fb588SMatthias Schmidt 		    "getcwd: Cannot change back to \".\" (%s)"),
12817d8fb588SMatthias Schmidt 		    strerror(errno));
12827d8fb588SMatthias Schmidt 	    return NULL;
12837d8fb588SMatthias Schmidt 	}
12847d8fb588SMatthias Schmidt     }
12857d8fb588SMatthias Schmidt     return pathname;
12867d8fb588SMatthias Schmidt 
12877d8fb588SMatthias Schmidt fail:
12887d8fb588SMatthias Schmidt     serrno = errno;
12897d8fb588SMatthias Schmidt     (void) chdir(strnrcpy(".", pnptr, pnptr - pathbuf));
12907d8fb588SMatthias Schmidt     errno = serrno;
12917d8fb588SMatthias Schmidt     return NULL;
12927d8fb588SMatthias Schmidt }
12937d8fb588SMatthias Schmidt 
12947d8fb588SMatthias Schmidt # else /* ! hp9000s500 */
12957d8fb588SMatthias Schmidt 
12967d8fb588SMatthias Schmidt 
12977d8fb588SMatthias Schmidt char *
xgetcwd(char * pathname,size_t pathlen)12987d8fb588SMatthias Schmidt xgetcwd(char *pathname, size_t pathlen)
12997d8fb588SMatthias Schmidt {
13007d8fb588SMatthias Schmidt     DIR    *dp;
13017d8fb588SMatthias Schmidt     struct dirent *d;
13027d8fb588SMatthias Schmidt 
13037d8fb588SMatthias Schmidt     struct stat st_root, st_cur, st_next, st_dotdot;
13047d8fb588SMatthias Schmidt     char    pathbuf[MAXPATHLEN], nextpathbuf[MAXPATHLEN * 2];
13057d8fb588SMatthias Schmidt     char   *pathptr, *nextpathptr, *cur_name_add;
13067d8fb588SMatthias Schmidt     int	   save_errno = 0;
13077d8fb588SMatthias Schmidt 
13087d8fb588SMatthias Schmidt     /* find the inode of root */
13097d8fb588SMatthias Schmidt     if (stat("/", &st_root) == -1) {
13107d8fb588SMatthias Schmidt 	(void) xsnprintf(pathname, pathlen, CGETS(23, 23,
13117d8fb588SMatthias Schmidt 			"getcwd: Cannot stat \"/\" (%s)"),
13127d8fb588SMatthias Schmidt 			strerror(errno));
13137d8fb588SMatthias Schmidt 	return NULL;
13147d8fb588SMatthias Schmidt     }
13157d8fb588SMatthias Schmidt     pathbuf[MAXPATHLEN - 1] = '\0';
13167d8fb588SMatthias Schmidt     pathptr = &pathbuf[MAXPATHLEN - 1];
13177d8fb588SMatthias Schmidt     nextpathbuf[MAXPATHLEN - 1] = '\0';
13187d8fb588SMatthias Schmidt     cur_name_add = nextpathptr = &nextpathbuf[MAXPATHLEN - 1];
13197d8fb588SMatthias Schmidt 
13207d8fb588SMatthias Schmidt     /* find the inode of the current directory */
13217d8fb588SMatthias Schmidt     if (lstat(".", &st_cur) == -1) {
13227d8fb588SMatthias Schmidt 	(void) xsnprintf(pathname, pathlen, CGETS(23, 24,
13237d8fb588SMatthias Schmidt 			 "getcwd: Cannot stat \".\" (%s)"),
13247d8fb588SMatthias Schmidt 			 strerror(errno));
13257d8fb588SMatthias Schmidt 	return NULL;
13267d8fb588SMatthias Schmidt     }
13277d8fb588SMatthias Schmidt     nextpathptr = strnrcpy(nextpathptr, "../", nextpathptr - nextpathbuf);
13287d8fb588SMatthias Schmidt 
13297d8fb588SMatthias Schmidt     /* Descend to root */
13307d8fb588SMatthias Schmidt     for (;;) {
13317d8fb588SMatthias Schmidt 
13327d8fb588SMatthias Schmidt 	/* look if we found root yet */
13337d8fb588SMatthias Schmidt 	if (st_cur.st_ino == st_root.st_ino &&
13347d8fb588SMatthias Schmidt 	    DEV_DEV_COMPARE(st_cur.st_dev, st_root.st_dev)) {
13357d8fb588SMatthias Schmidt 	    (void) strncpy(pathname, *pathptr != '/' ? "/" : pathptr, pathlen);
13367d8fb588SMatthias Schmidt 	    pathname[pathlen - 1] = '\0';
13377d8fb588SMatthias Schmidt 	    return pathname;
13387d8fb588SMatthias Schmidt 	}
13397d8fb588SMatthias Schmidt 
13407d8fb588SMatthias Schmidt 	/* open the parent directory */
13417d8fb588SMatthias Schmidt 	if (stat(nextpathptr, &st_dotdot) == -1) {
13427d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 25,
13437d8fb588SMatthias Schmidt 			     "getcwd: Cannot stat directory \"%s\" (%s)"),
13447d8fb588SMatthias Schmidt 			     nextpathptr, strerror(errno));
13457d8fb588SMatthias Schmidt 	    return NULL;
13467d8fb588SMatthias Schmidt 	}
13477d8fb588SMatthias Schmidt 	if ((dp = opendir(nextpathptr)) == NULL) {
13487d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 26,
13497d8fb588SMatthias Schmidt 			     "getcwd: Cannot open directory \"%s\" (%s)"),
13507d8fb588SMatthias Schmidt 			     nextpathptr, strerror(errno));
13517d8fb588SMatthias Schmidt 	    return NULL;
13527d8fb588SMatthias Schmidt 	}
13537d8fb588SMatthias Schmidt 
13547d8fb588SMatthias Schmidt 	/* look in the parent for the entry with the same inode */
13557d8fb588SMatthias Schmidt 	if (DEV_DEV_COMPARE(st_dotdot.st_dev, st_cur.st_dev)) {
13567d8fb588SMatthias Schmidt 	    /* Parent has same device. No need to stat every member */
13577d8fb588SMatthias Schmidt 	    for (d = readdir(dp); d != NULL; d = readdir(dp)) {
13587d8fb588SMatthias Schmidt #ifdef __clipper__
13597d8fb588SMatthias Schmidt 		if (((unsigned long)d->d_ino & 0xffff) == st_cur.st_ino)
13607d8fb588SMatthias Schmidt 		    break;
13617d8fb588SMatthias Schmidt #else
13627d8fb588SMatthias Schmidt 		if (d->d_ino == st_cur.st_ino)
13637d8fb588SMatthias Schmidt 		    break;
13647d8fb588SMatthias Schmidt #endif
13657d8fb588SMatthias Schmidt 	    }
13667d8fb588SMatthias Schmidt 	}
13677d8fb588SMatthias Schmidt 	else {
13687d8fb588SMatthias Schmidt 	    /*
13697d8fb588SMatthias Schmidt 	     * Parent has a different device. This is a mount point so we
13707d8fb588SMatthias Schmidt 	     * need to stat every member
13717d8fb588SMatthias Schmidt 	     */
13727d8fb588SMatthias Schmidt 	    for (d = readdir(dp); d != NULL; d = readdir(dp)) {
13737d8fb588SMatthias Schmidt 		if (ISDOT(d->d_name) || ISDOTDOT(d->d_name))
13747d8fb588SMatthias Schmidt 		    continue;
13757d8fb588SMatthias Schmidt 		(void)strncpy(cur_name_add, d->d_name,
13767d8fb588SMatthias Schmidt 		    (size_t) (&nextpathbuf[sizeof(nextpathbuf) - 1] - cur_name_add));
13777d8fb588SMatthias Schmidt 		if (lstat(nextpathptr, &st_next) == -1) {
13787d8fb588SMatthias Schmidt 		    /*
13797d8fb588SMatthias Schmidt 		     * We might not be able to stat() some path components
13807d8fb588SMatthias Schmidt 		     * if we are using afs, but this is not an error as
13817d8fb588SMatthias Schmidt 		     * long as we find the one we need; we also save the
13827d8fb588SMatthias Schmidt 		     * first error to report it if we don't finally succeed.
13837d8fb588SMatthias Schmidt 		     */
13847d8fb588SMatthias Schmidt 		    if (save_errno == 0)
13857d8fb588SMatthias Schmidt 			save_errno = errno;
13867d8fb588SMatthias Schmidt 		    continue;
13877d8fb588SMatthias Schmidt 		}
13887d8fb588SMatthias Schmidt 		/* check if we found it yet */
13897d8fb588SMatthias Schmidt 		if (st_next.st_ino == st_cur.st_ino &&
13907d8fb588SMatthias Schmidt 		    DEV_DEV_COMPARE(st_next.st_dev, st_cur.st_dev))
13917d8fb588SMatthias Schmidt 		    break;
13927d8fb588SMatthias Schmidt 	    }
13937d8fb588SMatthias Schmidt 	}
13947d8fb588SMatthias Schmidt 	if (d == NULL) {
13957d8fb588SMatthias Schmidt 	    (void) xsnprintf(pathname, pathlen, CGETS(23, 27,
13967d8fb588SMatthias Schmidt 			     "getcwd: Cannot find \".\" in \"..\" (%s)"),
13977d8fb588SMatthias Schmidt 			     strerror(save_errno ? save_errno : ENOENT));
13987d8fb588SMatthias Schmidt 	    closedir(dp);
13997d8fb588SMatthias Schmidt 	    return NULL;
14007d8fb588SMatthias Schmidt 	}
14017d8fb588SMatthias Schmidt 	else
14027d8fb588SMatthias Schmidt 	    save_errno = 0;
14037d8fb588SMatthias Schmidt 	st_cur = st_dotdot;
14047d8fb588SMatthias Schmidt 	pathptr = strnrcpy(pathptr, d->d_name, pathptr - pathbuf);
14057d8fb588SMatthias Schmidt 	pathptr = strnrcpy(pathptr, "/", pathptr - pathbuf);
14067d8fb588SMatthias Schmidt 	nextpathptr = strnrcpy(nextpathptr, "../", nextpathptr - nextpathbuf);
14077d8fb588SMatthias Schmidt 	*cur_name_add = '\0';
14087d8fb588SMatthias Schmidt 	closedir(dp);
14097d8fb588SMatthias Schmidt     }
14107d8fb588SMatthias Schmidt } /* end getcwd */
14117d8fb588SMatthias Schmidt # endif /* hp9000s500 */
14127d8fb588SMatthias Schmidt 
14137d8fb588SMatthias Schmidt /* strnrcpy():
14147d8fb588SMatthias Schmidt  *	Like strncpy, going backwards and returning the new pointer
14157d8fb588SMatthias Schmidt  */
14167d8fb588SMatthias Schmidt static char *
strnrcpy(char * ptr,char * str,size_t siz)14177d8fb588SMatthias Schmidt strnrcpy(char *ptr, char *str, size_t siz)
14187d8fb588SMatthias Schmidt {
14197d8fb588SMatthias Schmidt     int len = strlen(str);
14207d8fb588SMatthias Schmidt     if (siz == 0)
14217d8fb588SMatthias Schmidt 	return ptr;
14227d8fb588SMatthias Schmidt 
14237d8fb588SMatthias Schmidt     while (len && siz--)
14247d8fb588SMatthias Schmidt 	*--ptr = str[--len];
14257d8fb588SMatthias Schmidt 
14267d8fb588SMatthias Schmidt     return (ptr);
14277d8fb588SMatthias Schmidt } /* end strnrcpy */
14287d8fb588SMatthias Schmidt #endif /* !HAVE_GETCWD */
14297d8fb588SMatthias Schmidt 
14307d8fb588SMatthias Schmidt #ifdef apollo
14317d8fb588SMatthias Schmidt /***
14327d8fb588SMatthias Schmidt  *** Domain/OS
14337d8fb588SMatthias Schmidt  ***/
14347d8fb588SMatthias Schmidt #include <apollo/base.h>
14357d8fb588SMatthias Schmidt #include <apollo/loader.h>
14367d8fb588SMatthias Schmidt #include <apollo/error.h>
14377d8fb588SMatthias Schmidt 
14387d8fb588SMatthias Schmidt 
14397d8fb588SMatthias Schmidt static char *
apperr(status_$t * st)14407d8fb588SMatthias Schmidt apperr(status_$t *st)
14417d8fb588SMatthias Schmidt {
14427d8fb588SMatthias Schmidt     static char *buf; /* = NULL */
14437d8fb588SMatthias Schmidt     short e_subl, e_modl, e_codel;
14447d8fb588SMatthias Schmidt     error_$string_t e_sub, e_mod, e_code;
14457d8fb588SMatthias Schmidt 
14467d8fb588SMatthias Schmidt     error_$get_text(*st, e_sub, &e_subl, e_mod, &e_modl, e_code, &e_codel);
14477d8fb588SMatthias Schmidt     e_sub[e_subl] = '\0';
14487d8fb588SMatthias Schmidt     e_code[e_codel] = '\0';
14497d8fb588SMatthias Schmidt     e_mod[e_modl] = '\0';
14507d8fb588SMatthias Schmidt     xfree(buf);
14517d8fb588SMatthias Schmidt     buf = xasprintf("%s (%s/%s)", e_code, e_sub, e_mod);
14527d8fb588SMatthias Schmidt 
14537d8fb588SMatthias Schmidt     return(buf);
14547d8fb588SMatthias Schmidt }
14557d8fb588SMatthias Schmidt 
14567d8fb588SMatthias Schmidt static int
llib(Char * s)14577d8fb588SMatthias Schmidt llib(Char *s)
14587d8fb588SMatthias Schmidt {
14597d8fb588SMatthias Schmidt     short len = Strlen(s);
14607d8fb588SMatthias Schmidt     status_$t st;
14617d8fb588SMatthias Schmidt     char *t;
14627d8fb588SMatthias Schmidt 
14637d8fb588SMatthias Schmidt     loader_$inlib(t = short2str(s), len, &st);
14647d8fb588SMatthias Schmidt     if (st.all != status_$ok)
14657d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, t, apperr(&st));
14667d8fb588SMatthias Schmidt }
14677d8fb588SMatthias Schmidt 
14687d8fb588SMatthias Schmidt /*ARGSUSED*/
14697d8fb588SMatthias Schmidt void
doinlib(Char ** v,struct command * c)14707d8fb588SMatthias Schmidt doinlib(Char **v, struct command *c)
14717d8fb588SMatthias Schmidt {
14727d8fb588SMatthias Schmidt     Char **globbed;
14737d8fb588SMatthias Schmidt 
14747d8fb588SMatthias Schmidt     setname(short2str(*v++));
14757d8fb588SMatthias Schmidt     v = glob_all_or_error(v);
14767d8fb588SMatthias Schmidt     globbed = v;
14777d8fb588SMatthias Schmidt     cleanup_push(globbed, blk_cleanup);
14787d8fb588SMatthias Schmidt 
14797d8fb588SMatthias Schmidt     while (v && *v)
14807d8fb588SMatthias Schmidt 	llib(*v++);
14817d8fb588SMatthias Schmidt     cleanup_until(globbed);
14827d8fb588SMatthias Schmidt }
14837d8fb588SMatthias Schmidt 
14847d8fb588SMatthias Schmidt int
getv(Char * v)14857d8fb588SMatthias Schmidt getv(Char *v)
14867d8fb588SMatthias Schmidt {
14877d8fb588SMatthias Schmidt     if (eq(v, STRbsd43))
14887d8fb588SMatthias Schmidt 	return(1);
14897d8fb588SMatthias Schmidt     else if (eq(v, STRsys53))
14907d8fb588SMatthias Schmidt 	return(0);
14917d8fb588SMatthias Schmidt     else
14927d8fb588SMatthias Schmidt 	stderror(ERR_NAME | ERR_SYSTEM, short2str(v),
14937d8fb588SMatthias Schmidt 		 CGETS(23, 28, "Invalid system type"));
14947d8fb588SMatthias Schmidt     /*NOTREACHED*/
14957d8fb588SMatthias Schmidt     return(0);
14967d8fb588SMatthias Schmidt }
14977d8fb588SMatthias Schmidt 
14987d8fb588SMatthias Schmidt /*ARGSUSED*/
14997d8fb588SMatthias Schmidt void
dover(Char ** v,struct command * c)15007d8fb588SMatthias Schmidt dover(Char **v, struct command *c)
15017d8fb588SMatthias Schmidt {
15027d8fb588SMatthias Schmidt     Char *p;
15037d8fb588SMatthias Schmidt 
15047d8fb588SMatthias Schmidt     setname(short2str(*v++));
15057d8fb588SMatthias Schmidt     if (!*v) {
15067d8fb588SMatthias Schmidt 	if (!(p = tgetenv(STRSYSTYPE)))
15077d8fb588SMatthias Schmidt 	    stderror(ERR_NAME | ERR_STRING,
15087d8fb588SMatthias Schmidt 		     CGETS(23, 29, "System type is not set"));
15097d8fb588SMatthias Schmidt 	xprintf("%S\n", p);
15107d8fb588SMatthias Schmidt     }
15117d8fb588SMatthias Schmidt     else {
15127d8fb588SMatthias Schmidt 	tsetenv(STRSYSTYPE, getv(*v) ? STRbsd43 : STRsys53);
15137d8fb588SMatthias Schmidt 	dohash(NULL, NULL);
15147d8fb588SMatthias Schmidt     }
15157d8fb588SMatthias Schmidt }
15167d8fb588SMatthias Schmidt 
15177d8fb588SMatthias Schmidt /*
15187d8fb588SMatthias Schmidt  * Many thanks to rees@citi.umich.edu (Jim Rees) and
15197d8fb588SMatthias Schmidt  *                mathys@ssdt-tempe.sps.mot.com (Yves Mathys)
15207d8fb588SMatthias Schmidt  * For figuring out how to do this... I could have never done
15217d8fb588SMatthias Schmidt  * it without their help.
15227d8fb588SMatthias Schmidt  */
15237d8fb588SMatthias Schmidt typedef short enum {
15247d8fb588SMatthias Schmidt 	name_$wdir_type,
15257d8fb588SMatthias Schmidt 	name_$ndir_type,
15267d8fb588SMatthias Schmidt 	name_$node_dir_type,
15277d8fb588SMatthias Schmidt } name_$dir_type_t;
15287d8fb588SMatthias Schmidt 
15297d8fb588SMatthias Schmidt /*ARGSUSED*/
15307d8fb588SMatthias Schmidt void
dorootnode(Char ** v,struct command * c)15317d8fb588SMatthias Schmidt dorootnode(Char **v, struct command *c)
15327d8fb588SMatthias Schmidt {
15337d8fb588SMatthias Schmidt     name_$dir_type_t dirtype = name_$node_dir_type;
15347d8fb588SMatthias Schmidt     uid_$t uid;
15357d8fb588SMatthias Schmidt     status_$t st;
15367d8fb588SMatthias Schmidt     char *name;
15377d8fb588SMatthias Schmidt     short namelen;
15387d8fb588SMatthias Schmidt 
15397d8fb588SMatthias Schmidt     setname(short2str(*v++));
15407d8fb588SMatthias Schmidt 
15417d8fb588SMatthias Schmidt     name = short2str(*v);
15427d8fb588SMatthias Schmidt     namelen = strlen(name);
15437d8fb588SMatthias Schmidt 
15447d8fb588SMatthias Schmidt     name_$resolve(name, &namelen, &uid, &st);
15457d8fb588SMatthias Schmidt     if (st.all != status_$ok)
15467d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, name, apperr(&st));
15477d8fb588SMatthias Schmidt     namelen = 0;
15487d8fb588SMatthias Schmidt     name_$set_diru(&uid, "", &namelen, &dirtype, &st);
15497d8fb588SMatthias Schmidt     if (st.all != status_$ok)
15507d8fb588SMatthias Schmidt 	stderror(ERR_SYSTEM, name, apperr(&st));
15517d8fb588SMatthias Schmidt     dohash(NULL, NULL);
15527d8fb588SMatthias Schmidt }
15537d8fb588SMatthias Schmidt 
15547d8fb588SMatthias Schmidt int
isapad(void)15557d8fb588SMatthias Schmidt isapad(void)
15567d8fb588SMatthias Schmidt {
15577d8fb588SMatthias Schmidt     static int res = -1;
15587d8fb588SMatthias Schmidt     static status_$t st;
15597d8fb588SMatthias Schmidt 
15607d8fb588SMatthias Schmidt     if (res == -1) {
15617d8fb588SMatthias Schmidt 	int strm;
15627d8fb588SMatthias Schmidt 	if (isatty(0))
15637d8fb588SMatthias Schmidt 	    strm = 0;
15647d8fb588SMatthias Schmidt 	if (isatty(1))
15657d8fb588SMatthias Schmidt 	    strm = 1;
15667d8fb588SMatthias Schmidt 	if (isatty(2))
15677d8fb588SMatthias Schmidt 	    strm = 2;
15687d8fb588SMatthias Schmidt 	else {
15697d8fb588SMatthias Schmidt 	    res = 0;
15707d8fb588SMatthias Schmidt 	    st.all = status_$ok;
15717d8fb588SMatthias Schmidt 	    return(res);
15727d8fb588SMatthias Schmidt 	}
15737d8fb588SMatthias Schmidt 	res = stream_$isavt(&strm, &st);
15747d8fb588SMatthias Schmidt 	res = res ? 1 : 0;
15757d8fb588SMatthias Schmidt     }
15767d8fb588SMatthias Schmidt     else {
15777d8fb588SMatthias Schmidt 	if (st.all != status_$ok)
15787d8fb588SMatthias Schmidt 	    stderror(ERR_SYSTEM, "stream_$isavt", apperr(&st));
15797d8fb588SMatthias Schmidt     }
15807d8fb588SMatthias Schmidt     return(res);
15817d8fb588SMatthias Schmidt }
15827d8fb588SMatthias Schmidt #endif
1583*94afa86dSJohn Marino 
1584*94afa86dSJohn Marino #if defined(__CYGWIN__) && !defined(NO_CRYPT)
1585*94afa86dSJohn Marino #undef CHAR		/* Collides with Win32 API */
1586*94afa86dSJohn Marino #define WIN32_LEAN_AND_MEAN
1587*94afa86dSJohn Marino #include <windows.h>
1588*94afa86dSJohn Marino #include <sys/cygwin.h>
1589*94afa86dSJohn Marino char *
cygwin_xcrypt(struct passwd * pw,const char * password,const char * expected_pwd)1590*94afa86dSJohn Marino cygwin_xcrypt(struct passwd *pw, const char *password, const char *expected_pwd)
1591*94afa86dSJohn Marino {
1592*94afa86dSJohn Marino     static char invalid_password[] = "\377";
1593*94afa86dSJohn Marino     HANDLE token = cygwin_logon_user(pw, password);
1594*94afa86dSJohn Marino     if (token == INVALID_HANDLE_VALUE)
1595*94afa86dSJohn Marino 	return invalid_password;
1596*94afa86dSJohn Marino     CloseHandle(token);
1597*94afa86dSJohn Marino     return (char *) expected_pwd;
1598*94afa86dSJohn Marino }
1599*94afa86dSJohn Marino #endif /* __CYGWIN__ && !NO_CRYPT */
1600