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