1c80476e4SDavid E. O'Brien /* $Header: /src/pub/tcsh/tc.func.c,v 3.87 1999/08/14 21:24:13 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * tc.func.c: New tcsh builtins. 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.func.c,v 3.87 1999/08/14 21:24:13 christos Exp $") 40c80476e4SDavid E. O'Brien 41c80476e4SDavid E. O'Brien #include "ed.h" 42c80476e4SDavid E. O'Brien #include "ed.defns.h" /* for the function names */ 43c80476e4SDavid E. O'Brien #include "tw.h" 44c80476e4SDavid E. O'Brien #include "tc.h" 45c80476e4SDavid E. O'Brien #ifdef WINNT 46c80476e4SDavid E. O'Brien #include "nt.const.h" 47c80476e4SDavid E. O'Brien #endif /* WINNT */ 48c80476e4SDavid E. O'Brien 49c80476e4SDavid E. O'Brien #ifdef AFS 50c80476e4SDavid E. O'Brien #define PASSMAX 16 51c80476e4SDavid E. O'Brien #include <afs/stds.h> 52c80476e4SDavid E. O'Brien #include <afs/kautils.h> 53c80476e4SDavid E. O'Brien long ka_UserAuthenticateGeneral(); 54c80476e4SDavid E. O'Brien #else 55c80476e4SDavid E. O'Brien #ifndef PASSMAX 56c80476e4SDavid E. O'Brien #define PASSMAX 8 57c80476e4SDavid E. O'Brien #endif 58c80476e4SDavid E. O'Brien #endif /* AFS */ 59c80476e4SDavid E. O'Brien 60c80476e4SDavid E. O'Brien #ifdef TESLA 61c80476e4SDavid E. O'Brien extern int do_logout; 62c80476e4SDavid E. O'Brien #endif /* TESLA */ 63c80476e4SDavid E. O'Brien extern time_t t_period; 64c80476e4SDavid E. O'Brien extern int just_signaled; 65c80476e4SDavid E. O'Brien static bool precmd_active = 0; 66c80476e4SDavid E. O'Brien static bool postcmd_active = 0; 67c80476e4SDavid E. O'Brien static bool periodic_active = 0; 68c80476e4SDavid E. O'Brien static bool cwdcmd_active = 0; /* PWP: for cwd_cmd */ 69c80476e4SDavid E. O'Brien static bool beepcmd_active = 0; 70c80476e4SDavid E. O'Brien static signalfun_t alm_fun = NULL; 71c80476e4SDavid E. O'Brien 72c80476e4SDavid E. O'Brien static void auto_logout __P((int)); 73c80476e4SDavid E. O'Brien static char *xgetpass __P((char *)); 74c80476e4SDavid E. O'Brien static void auto_lock __P((int)); 75c80476e4SDavid E. O'Brien #ifdef BSDJOBS 76c80476e4SDavid E. O'Brien static void insert __P((struct wordent *, bool)); 77c80476e4SDavid E. O'Brien static void insert_we __P((struct wordent *, struct wordent *)); 78c80476e4SDavid E. O'Brien static int inlist __P((Char *, Char *)); 79c80476e4SDavid E. O'Brien #endif /* BSDJOBS */ 80c80476e4SDavid E. O'Brien struct tildecache; 81c80476e4SDavid E. O'Brien static int tildecompare __P((struct tildecache *, struct tildecache *)); 82c80476e4SDavid E. O'Brien static Char *gethomedir __P((Char *)); 83c80476e4SDavid E. O'Brien #ifdef REMOTEHOST 84c80476e4SDavid E. O'Brien static sigret_t palarm __P((int)); 85c80476e4SDavid E. O'Brien static void getremotehost __P((void)); 86c80476e4SDavid E. O'Brien #endif /* REMOTEHOST */ 87c80476e4SDavid E. O'Brien 88c80476e4SDavid E. O'Brien /* 89c80476e4SDavid E. O'Brien * Tops-C shell 90c80476e4SDavid E. O'Brien */ 91c80476e4SDavid E. O'Brien 92c80476e4SDavid E. O'Brien /* 93c80476e4SDavid E. O'Brien * expand_lex: Take the given lex and put an expanded version of it in the 94c80476e4SDavid E. O'Brien * string buf. First guy in lex list is ignored; last guy is ^J which we 95c80476e4SDavid E. O'Brien * ignore Only take lex'es from position from to position to inclusive Note: 96c80476e4SDavid E. O'Brien * csh sometimes sets bit 8 in characters which causes all kinds of problems 97c80476e4SDavid E. O'Brien * if we don't mask it here. Note: excl's in lexes have been un-back-slashed 98c80476e4SDavid E. O'Brien * and must be re-back-slashed 99c80476e4SDavid E. O'Brien * (PWP: NOTE: this returns a pointer to the END of the string expanded 100c80476e4SDavid E. O'Brien * (in other words, where the NUL is).) 101c80476e4SDavid E. O'Brien */ 102c80476e4SDavid E. O'Brien /* PWP: this is a combination of the old sprlex() and the expand_lex from 103c80476e4SDavid E. O'Brien the magic-space stuff */ 104c80476e4SDavid E. O'Brien 105c80476e4SDavid E. O'Brien Char * 106c80476e4SDavid E. O'Brien expand_lex(buf, bufsiz, sp0, from, to) 107c80476e4SDavid E. O'Brien Char *buf; 108c80476e4SDavid E. O'Brien size_t bufsiz; 109c80476e4SDavid E. O'Brien struct wordent *sp0; 110c80476e4SDavid E. O'Brien int from, to; 111c80476e4SDavid E. O'Brien { 112c80476e4SDavid E. O'Brien register struct wordent *sp; 113c80476e4SDavid E. O'Brien register Char *s, *d, *e; 114c80476e4SDavid E. O'Brien register Char prev_c; 115c80476e4SDavid E. O'Brien register int i; 116c80476e4SDavid E. O'Brien 117c80476e4SDavid E. O'Brien buf[0] = '\0'; 118c80476e4SDavid E. O'Brien prev_c = '\0'; 119c80476e4SDavid E. O'Brien d = buf; 120c80476e4SDavid E. O'Brien e = &buf[bufsiz]; /* for bounds checking */ 121c80476e4SDavid E. O'Brien 122c80476e4SDavid E. O'Brien if (!sp0) 123c80476e4SDavid E. O'Brien return (buf); /* null lex */ 124c80476e4SDavid E. O'Brien if ((sp = sp0->next) == sp0) 125c80476e4SDavid E. O'Brien return (buf); /* nada */ 126c80476e4SDavid E. O'Brien if (sp == (sp0 = sp0->prev)) 127c80476e4SDavid E. O'Brien return (buf); /* nada */ 128c80476e4SDavid E. O'Brien 129c80476e4SDavid E. O'Brien for (i = 0; i < NCARGS; i++) { 130c80476e4SDavid E. O'Brien if ((i >= from) && (i <= to)) { /* if in range */ 131c80476e4SDavid E. O'Brien for (s = sp->word; *s && d < e; s++) { 132c80476e4SDavid E. O'Brien /* 133c80476e4SDavid E. O'Brien * bugfix by Michael Bloom: anything but the current history 134c80476e4SDavid E. O'Brien * character {(PWP) and backslash} seem to be dealt with 135c80476e4SDavid E. O'Brien * elsewhere. 136c80476e4SDavid E. O'Brien */ 137c80476e4SDavid E. O'Brien if ((*s & QUOTE) 138c80476e4SDavid E. O'Brien && (((*s & TRIM) == HIST) || 139c80476e4SDavid E. O'Brien (((*s & TRIM) == '\'') && (prev_c != '\\')) || 140c80476e4SDavid E. O'Brien (((*s & TRIM) == '\"') && (prev_c != '\\')) || 141c80476e4SDavid E. O'Brien (((*s & TRIM) == '\\') && (prev_c != '\\')))) { 142c80476e4SDavid E. O'Brien *d++ = '\\'; 143c80476e4SDavid E. O'Brien } 144c80476e4SDavid E. O'Brien if (d < e) 145c80476e4SDavid E. O'Brien *d++ = (*s & TRIM); 146c80476e4SDavid E. O'Brien prev_c = *s; 147c80476e4SDavid E. O'Brien } 148c80476e4SDavid E. O'Brien if (d < e) 149c80476e4SDavid E. O'Brien *d++ = ' '; 150c80476e4SDavid E. O'Brien } 151c80476e4SDavid E. O'Brien sp = sp->next; 152c80476e4SDavid E. O'Brien if (sp == sp0) 153c80476e4SDavid E. O'Brien break; 154c80476e4SDavid E. O'Brien } 155c80476e4SDavid E. O'Brien if (d > buf) 156c80476e4SDavid E. O'Brien d--; /* get rid of trailing space */ 157c80476e4SDavid E. O'Brien 158c80476e4SDavid E. O'Brien return (d); 159c80476e4SDavid E. O'Brien } 160c80476e4SDavid E. O'Brien 161c80476e4SDavid E. O'Brien Char * 162c80476e4SDavid E. O'Brien sprlex(buf, bufsiz, sp0) 163c80476e4SDavid E. O'Brien Char *buf; 164c80476e4SDavid E. O'Brien size_t bufsiz; 165c80476e4SDavid E. O'Brien struct wordent *sp0; 166c80476e4SDavid E. O'Brien { 167c80476e4SDavid E. O'Brien Char *cp; 168c80476e4SDavid E. O'Brien 169c80476e4SDavid E. O'Brien cp = expand_lex(buf, bufsiz, sp0, 0, NCARGS); 170c80476e4SDavid E. O'Brien *cp = '\0'; 171c80476e4SDavid E. O'Brien return (buf); 172c80476e4SDavid E. O'Brien } 173c80476e4SDavid E. O'Brien 174c80476e4SDavid E. O'Brien 175c80476e4SDavid E. O'Brien Char * 176c80476e4SDavid E. O'Brien Itoa(n, s, min_digits, attributes) 177c80476e4SDavid E. O'Brien int n; 178c80476e4SDavid E. O'Brien Char *s; 179c80476e4SDavid E. O'Brien int min_digits, attributes; 180c80476e4SDavid E. O'Brien { 181c80476e4SDavid E. O'Brien /* 182c80476e4SDavid E. O'Brien * The array size here is derived from 183c80476e4SDavid E. O'Brien * log8(UINT_MAX) 184c80476e4SDavid E. O'Brien * which is guaranteed to be enough for a decimal 185c80476e4SDavid E. O'Brien * representation. We add 1 because integer divide 186c80476e4SDavid E. O'Brien * rounds down. 187c80476e4SDavid E. O'Brien */ 188c80476e4SDavid E. O'Brien #ifndef CHAR_BIT 189c80476e4SDavid E. O'Brien # define CHAR_BIT 8 190c80476e4SDavid E. O'Brien #endif 191c80476e4SDavid E. O'Brien Char buf[CHAR_BIT * sizeof(int) / 3 + 1]; 192c80476e4SDavid E. O'Brien Char *p; 193c80476e4SDavid E. O'Brien unsigned int un; /* handle most negative # too */ 194c80476e4SDavid E. O'Brien int pad = (min_digits != 0); 195c80476e4SDavid E. O'Brien 196c80476e4SDavid E. O'Brien if (sizeof(buf) - 1 < min_digits) 197c80476e4SDavid E. O'Brien min_digits = sizeof(buf) - 1; 198c80476e4SDavid E. O'Brien 199c80476e4SDavid E. O'Brien un = n; 200c80476e4SDavid E. O'Brien if (n < 0) { 201c80476e4SDavid E. O'Brien un = -n; 202c80476e4SDavid E. O'Brien *s++ = '-'; 203c80476e4SDavid E. O'Brien } 204c80476e4SDavid E. O'Brien 205c80476e4SDavid E. O'Brien p = buf; 206c80476e4SDavid E. O'Brien do { 207c80476e4SDavid E. O'Brien *p++ = un % 10 + '0'; 208c80476e4SDavid E. O'Brien un /= 10; 209c80476e4SDavid E. O'Brien } while ((pad && --min_digits > 0) || un != 0); 210c80476e4SDavid E. O'Brien 211c80476e4SDavid E. O'Brien while (p > buf) 212c80476e4SDavid E. O'Brien *s++ = *--p | attributes; 213c80476e4SDavid E. O'Brien 214c80476e4SDavid E. O'Brien *s = '\0'; 215c80476e4SDavid E. O'Brien return s; 216c80476e4SDavid E. O'Brien } 217c80476e4SDavid E. O'Brien 218c80476e4SDavid E. O'Brien 219c80476e4SDavid E. O'Brien /*ARGSUSED*/ 220c80476e4SDavid E. O'Brien void 221c80476e4SDavid E. O'Brien dolist(v, c) 222c80476e4SDavid E. O'Brien register Char **v; 223c80476e4SDavid E. O'Brien struct command *c; 224c80476e4SDavid E. O'Brien { 225c80476e4SDavid E. O'Brien int i, k; 226c80476e4SDavid E. O'Brien struct stat st; 227c80476e4SDavid E. O'Brien #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE) 228c80476e4SDavid E. O'Brien extern bool dspmbyte_ls; 229c80476e4SDavid E. O'Brien #endif 230c80476e4SDavid E. O'Brien #ifdef COLOR_LS_F 231c80476e4SDavid E. O'Brien extern bool color_context_ls; 232c80476e4SDavid E. O'Brien #endif /* COLOR_LS_F */ 233c80476e4SDavid E. O'Brien 234c80476e4SDavid E. O'Brien USE(c); 235c80476e4SDavid E. O'Brien if (*++v == NULL) { 236c80476e4SDavid E. O'Brien (void) t_search(STRNULL, NULL, LIST, 0, TW_ZERO, 0, STRNULL, 0); 237c80476e4SDavid E. O'Brien return; 238c80476e4SDavid E. O'Brien } 239c80476e4SDavid E. O'Brien gflag = 0; 240c80476e4SDavid E. O'Brien tglob(v); 241c80476e4SDavid E. O'Brien if (gflag) { 242c80476e4SDavid E. O'Brien v = globall(v); 243c80476e4SDavid E. O'Brien if (v == 0) 244c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_NOMATCH); 245c80476e4SDavid E. O'Brien } 246c80476e4SDavid E. O'Brien else 247c80476e4SDavid E. O'Brien v = gargv = saveblk(v); 248c80476e4SDavid E. O'Brien trim(v); 249c80476e4SDavid E. O'Brien for (k = 0; v[k] != NULL && v[k][0] != '-'; k++) 250c80476e4SDavid E. O'Brien continue; 251c80476e4SDavid E. O'Brien if (v[k]) { 252c80476e4SDavid E. O'Brien /* 253c80476e4SDavid E. O'Brien * We cannot process a flag therefore we let ls do it right. 254c80476e4SDavid E. O'Brien */ 255c80476e4SDavid E. O'Brien static Char STRls[] = {'l', 's', '\0'}; 256c80476e4SDavid E. O'Brien static Char STRmCF[] = {'-', 'C', 'F', '\0', '\0' }; 257c80476e4SDavid E. O'Brien Char *lspath; 258c80476e4SDavid E. O'Brien struct command *t; 259c80476e4SDavid E. O'Brien struct wordent cmd, *nextword, *lastword; 260c80476e4SDavid E. O'Brien Char *cp; 261c80476e4SDavid E. O'Brien struct varent *vp; 262c80476e4SDavid E. O'Brien 263c80476e4SDavid E. O'Brien #ifdef BSDSIGS 264c80476e4SDavid E. O'Brien sigmask_t omask = 0; 265c80476e4SDavid E. O'Brien 266c80476e4SDavid E. O'Brien if (setintr) 267c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)) & ~sigmask(SIGINT); 268c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 269c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 270c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 271c80476e4SDavid E. O'Brien if (seterr) { 272c80476e4SDavid E. O'Brien xfree((ptr_t) seterr); 273c80476e4SDavid E. O'Brien seterr = NULL; 274c80476e4SDavid E. O'Brien } 275c80476e4SDavid E. O'Brien 276c80476e4SDavid E. O'Brien lspath = STRls; 277c80476e4SDavid E. O'Brien STRmCF[1] = 'C'; 278c80476e4SDavid E. O'Brien STRmCF[3] = '\0'; 279c80476e4SDavid E. O'Brien /* Look at listflags, to add -A to the flags, to get a path 280c80476e4SDavid E. O'Brien of ls if necessary */ 281c80476e4SDavid E. O'Brien if ((vp = adrof(STRlistflags)) != NULL && vp->vec[0] != STRNULL) { 282c80476e4SDavid E. O'Brien if (vp->vec[1] != NULL && vp->vec[1][0] != '\0') 283c80476e4SDavid E. O'Brien lspath = vp->vec[1]; 284c80476e4SDavid E. O'Brien for (cp = vp->vec[0]; *cp; cp++) 285c80476e4SDavid E. O'Brien switch (*cp) { 286c80476e4SDavid E. O'Brien case 'x': 287c80476e4SDavid E. O'Brien STRmCF[1] = 'x'; 288c80476e4SDavid E. O'Brien break; 289c80476e4SDavid E. O'Brien case 'a': 290c80476e4SDavid E. O'Brien STRmCF[3] = 'a'; 291c80476e4SDavid E. O'Brien break; 292c80476e4SDavid E. O'Brien case 'A': 293c80476e4SDavid E. O'Brien STRmCF[3] = 'A'; 294c80476e4SDavid E. O'Brien break; 295c80476e4SDavid E. O'Brien default: 296c80476e4SDavid E. O'Brien break; 297c80476e4SDavid E. O'Brien } 298c80476e4SDavid E. O'Brien } 299c80476e4SDavid E. O'Brien 300c80476e4SDavid E. O'Brien cmd.word = STRNULL; 301c80476e4SDavid E. O'Brien lastword = &cmd; 302c80476e4SDavid E. O'Brien nextword = (struct wordent *) xcalloc(1, sizeof cmd); 303c80476e4SDavid E. O'Brien nextword->word = Strsave(lspath); 304c80476e4SDavid E. O'Brien lastword->next = nextword; 305c80476e4SDavid E. O'Brien nextword->prev = lastword; 306c80476e4SDavid E. O'Brien lastword = nextword; 307c80476e4SDavid E. O'Brien nextword = (struct wordent *) xcalloc(1, sizeof cmd); 308c80476e4SDavid E. O'Brien nextword->word = Strsave(STRmCF); 309c80476e4SDavid E. O'Brien lastword->next = nextword; 310c80476e4SDavid E. O'Brien nextword->prev = lastword; 311c80476e4SDavid E. O'Brien #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE) 312c80476e4SDavid E. O'Brien if (dspmbyte_ls) { 313c80476e4SDavid E. O'Brien lastword = nextword; 314c80476e4SDavid E. O'Brien nextword = (struct wordent *) xcalloc(1, sizeof cmd); 315c80476e4SDavid E. O'Brien nextword->word = Strsave(STRmmliteral); 316c80476e4SDavid E. O'Brien lastword->next = nextword; 317c80476e4SDavid E. O'Brien nextword->prev = lastword; 318c80476e4SDavid E. O'Brien } 319c80476e4SDavid E. O'Brien #endif 320c80476e4SDavid E. O'Brien #ifdef COLOR_LS_F 321c80476e4SDavid E. O'Brien if (color_context_ls) { 322c80476e4SDavid E. O'Brien lastword = nextword; 323c80476e4SDavid E. O'Brien nextword = (struct wordent *) xcalloc(1, sizeof cmd); 324c80476e4SDavid E. O'Brien nextword->word = Strsave(STRmmcolormauto); 325c80476e4SDavid E. O'Brien lastword->next = nextword; 326c80476e4SDavid E. O'Brien nextword->prev = lastword; 327c80476e4SDavid E. O'Brien } 328c80476e4SDavid E. O'Brien #endif /* COLOR_LS_F */ 329c80476e4SDavid E. O'Brien lastword = nextword; 330c80476e4SDavid E. O'Brien for (cp = *v; cp; cp = *++v) { 331c80476e4SDavid E. O'Brien nextword = (struct wordent *) xcalloc(1, sizeof cmd); 332c80476e4SDavid E. O'Brien nextword->word = Strsave(cp); 333c80476e4SDavid E. O'Brien lastword->next = nextword; 334c80476e4SDavid E. O'Brien nextword->prev = lastword; 335c80476e4SDavid E. O'Brien lastword = nextword; 336c80476e4SDavid E. O'Brien } 337c80476e4SDavid E. O'Brien lastword->next = &cmd; 338c80476e4SDavid E. O'Brien cmd.prev = lastword; 339c80476e4SDavid E. O'Brien 340c80476e4SDavid E. O'Brien /* build a syntax tree for the command. */ 341c80476e4SDavid E. O'Brien t = syntax(cmd.next, &cmd, 0); 342c80476e4SDavid E. O'Brien if (seterr) 343c80476e4SDavid E. O'Brien stderror(ERR_OLD); 344c80476e4SDavid E. O'Brien /* expand aliases like process() does */ 345c80476e4SDavid E. O'Brien /* alias(&cmd); */ 346c80476e4SDavid E. O'Brien /* execute the parse tree. */ 347c80476e4SDavid E. O'Brien execute(t, tpgrp > 0 ? tpgrp : -1, NULL, NULL); 348c80476e4SDavid E. O'Brien /* done. free the lex list and parse tree. */ 349c80476e4SDavid E. O'Brien freelex(&cmd), freesyn(t); 350c80476e4SDavid E. O'Brien if (setintr) 351c80476e4SDavid E. O'Brien #ifdef BSDSIGS 352c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 353c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 354c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 355c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 356c80476e4SDavid E. O'Brien } 357c80476e4SDavid E. O'Brien else { 358c80476e4SDavid E. O'Brien Char *dp, *tmp, buf[MAXPATHLEN]; 359c80476e4SDavid E. O'Brien 360c80476e4SDavid E. O'Brien for (k = 0, i = 0; v[k] != NULL; k++) { 361c80476e4SDavid E. O'Brien tmp = dnormalize(v[k], symlinks == SYM_IGNORE); 362c80476e4SDavid E. O'Brien dp = &tmp[Strlen(tmp) - 1]; 363c80476e4SDavid E. O'Brien if (*dp == '/' && dp != tmp) 364c80476e4SDavid E. O'Brien #ifdef apollo 365c80476e4SDavid E. O'Brien if (dp != &tmp[1]) 366c80476e4SDavid E. O'Brien #endif /* apollo */ 367c80476e4SDavid E. O'Brien *dp = '\0'; 368c80476e4SDavid E. O'Brien if (stat(short2str(tmp), &st) == -1) { 369c80476e4SDavid E. O'Brien if (k != i) { 370c80476e4SDavid E. O'Brien if (i != 0) 371c80476e4SDavid E. O'Brien xputchar('\n'); 372c80476e4SDavid E. O'Brien print_by_column(STRNULL, &v[i], k - i, FALSE); 373c80476e4SDavid E. O'Brien } 374c80476e4SDavid E. O'Brien xprintf("%S: %s.\n", tmp, strerror(errno)); 375c80476e4SDavid E. O'Brien i = k + 1; 376c80476e4SDavid E. O'Brien } 377c80476e4SDavid E. O'Brien else if (S_ISDIR(st.st_mode)) { 378c80476e4SDavid E. O'Brien Char *cp; 379c80476e4SDavid E. O'Brien 380c80476e4SDavid E. O'Brien if (k != i) { 381c80476e4SDavid E. O'Brien if (i != 0) 382c80476e4SDavid E. O'Brien xputchar('\n'); 383c80476e4SDavid E. O'Brien print_by_column(STRNULL, &v[i], k - i, FALSE); 384c80476e4SDavid E. O'Brien } 385c80476e4SDavid E. O'Brien if (k != 0 && v[1] != NULL) 386c80476e4SDavid E. O'Brien xputchar('\n'); 387c80476e4SDavid E. O'Brien xprintf("%S:\n", tmp); 388c80476e4SDavid E. O'Brien for (cp = tmp, dp = buf; *cp; *dp++ = (*cp++ | QUOTE)) 389c80476e4SDavid E. O'Brien continue; 390c80476e4SDavid E. O'Brien if ( 391c80476e4SDavid E. O'Brien #ifdef WINNT 392c80476e4SDavid E. O'Brien (dp[-1] != (Char) (':' | QUOTE)) && 393c80476e4SDavid E. O'Brien #endif /* WINNT */ 394c80476e4SDavid E. O'Brien (dp[-1] != (Char) ('/' | QUOTE))) 395c80476e4SDavid E. O'Brien *dp++ = '/'; 396c80476e4SDavid E. O'Brien else 397c80476e4SDavid E. O'Brien dp[-1] &= TRIM; 398c80476e4SDavid E. O'Brien *dp = '\0'; 399c80476e4SDavid E. O'Brien (void) t_search(buf, NULL, LIST, 0, TW_ZERO, 0, STRNULL, 0); 400c80476e4SDavid E. O'Brien i = k + 1; 401c80476e4SDavid E. O'Brien } 402c80476e4SDavid E. O'Brien xfree((ptr_t) tmp); 403c80476e4SDavid E. O'Brien } 404c80476e4SDavid E. O'Brien if (k != i) { 405c80476e4SDavid E. O'Brien if (i != 0) 406c80476e4SDavid E. O'Brien xputchar('\n'); 407c80476e4SDavid E. O'Brien print_by_column(STRNULL, &v[i], k - i, FALSE); 408c80476e4SDavid E. O'Brien } 409c80476e4SDavid E. O'Brien } 410c80476e4SDavid E. O'Brien 411c80476e4SDavid E. O'Brien if (gargv) { 412c80476e4SDavid E. O'Brien blkfree(gargv); 413c80476e4SDavid E. O'Brien gargv = 0; 414c80476e4SDavid E. O'Brien } 415c80476e4SDavid E. O'Brien } 416c80476e4SDavid E. O'Brien 417c80476e4SDavid E. O'Brien static char *defaulttell = "ALL"; 418c80476e4SDavid E. O'Brien extern bool GotTermCaps; 419c80476e4SDavid E. O'Brien 420c80476e4SDavid E. O'Brien /*ARGSUSED*/ 421c80476e4SDavid E. O'Brien void 422c80476e4SDavid E. O'Brien dotelltc(v, c) 423c80476e4SDavid E. O'Brien register Char **v; 424c80476e4SDavid E. O'Brien struct command *c; 425c80476e4SDavid E. O'Brien { 426c80476e4SDavid E. O'Brien USE(c); 427c80476e4SDavid E. O'Brien if (!GotTermCaps) 428c80476e4SDavid E. O'Brien GetTermCaps(); 429c80476e4SDavid E. O'Brien 430c80476e4SDavid E. O'Brien /* 431c80476e4SDavid E. O'Brien * Avoid a compiler bug on hpux 9.05 432c80476e4SDavid E. O'Brien * Writing the following as func(a ? b : c) breaks 433c80476e4SDavid E. O'Brien */ 434c80476e4SDavid E. O'Brien if (v[1]) 435c80476e4SDavid E. O'Brien TellTC(short2str(v[1])); 436c80476e4SDavid E. O'Brien else 437c80476e4SDavid E. O'Brien TellTC(defaulttell); 438c80476e4SDavid E. O'Brien } 439c80476e4SDavid E. O'Brien 440c80476e4SDavid E. O'Brien /*ARGSUSED*/ 441c80476e4SDavid E. O'Brien void 442c80476e4SDavid E. O'Brien doechotc(v, c) 443c80476e4SDavid E. O'Brien register Char **v; 444c80476e4SDavid E. O'Brien struct command *c; 445c80476e4SDavid E. O'Brien { 446c80476e4SDavid E. O'Brien if (!GotTermCaps) 447c80476e4SDavid E. O'Brien GetTermCaps(); 448c80476e4SDavid E. O'Brien EchoTC(++v); 449c80476e4SDavid E. O'Brien } 450c80476e4SDavid E. O'Brien 451c80476e4SDavid E. O'Brien /*ARGSUSED*/ 452c80476e4SDavid E. O'Brien void 453c80476e4SDavid E. O'Brien dosettc(v, c) 454c80476e4SDavid E. O'Brien Char **v; 455c80476e4SDavid E. O'Brien struct command *c; 456c80476e4SDavid E. O'Brien { 457c80476e4SDavid E. O'Brien char tv[2][BUFSIZE]; 458c80476e4SDavid E. O'Brien 459c80476e4SDavid E. O'Brien if (!GotTermCaps) 460c80476e4SDavid E. O'Brien GetTermCaps(); 461c80476e4SDavid E. O'Brien 462c80476e4SDavid E. O'Brien (void) strcpy(tv[0], short2str(v[1])); 463c80476e4SDavid E. O'Brien (void) strcpy(tv[1], short2str(v[2])); 464c80476e4SDavid E. O'Brien SetTC(tv[0], tv[1]); 465c80476e4SDavid E. O'Brien } 466c80476e4SDavid E. O'Brien 467c80476e4SDavid E. O'Brien /* The dowhich() is by: 468c80476e4SDavid E. O'Brien * Andreas Luik <luik@isaak.isa.de> 469c80476e4SDavid E. O'Brien * I S A GmbH - Informationssysteme fuer computerintegrierte Automatisierung 470c80476e4SDavid E. O'Brien * Azenberstr. 35 471c80476e4SDavid E. O'Brien * D-7000 Stuttgart 1 472c80476e4SDavid E. O'Brien * West-Germany 473c80476e4SDavid E. O'Brien * Thanks!! 474c80476e4SDavid E. O'Brien */ 475c80476e4SDavid E. O'Brien int 476c80476e4SDavid E. O'Brien cmd_expand(cmd, str) 477c80476e4SDavid E. O'Brien Char *cmd; 478c80476e4SDavid E. O'Brien Char *str; 479c80476e4SDavid E. O'Brien { 480c80476e4SDavid E. O'Brien struct wordent lexp[3]; 481c80476e4SDavid E. O'Brien struct varent *vp; 482c80476e4SDavid E. O'Brien int rv = TRUE; 483c80476e4SDavid E. O'Brien 484c80476e4SDavid E. O'Brien lexp[0].next = &lexp[1]; 485c80476e4SDavid E. O'Brien lexp[1].next = &lexp[2]; 486c80476e4SDavid E. O'Brien lexp[2].next = &lexp[0]; 487c80476e4SDavid E. O'Brien 488c80476e4SDavid E. O'Brien lexp[0].prev = &lexp[2]; 489c80476e4SDavid E. O'Brien lexp[1].prev = &lexp[0]; 490c80476e4SDavid E. O'Brien lexp[2].prev = &lexp[1]; 491c80476e4SDavid E. O'Brien 492c80476e4SDavid E. O'Brien lexp[0].word = STRNULL; 493c80476e4SDavid E. O'Brien lexp[2].word = STRret; 494c80476e4SDavid E. O'Brien 495c80476e4SDavid E. O'Brien if ((vp = adrof1(cmd, &aliases)) != NULL) { 496c80476e4SDavid E. O'Brien if (str == NULL) { 497c80476e4SDavid E. O'Brien xprintf(CGETS(22, 1, "%S: \t aliased to "), cmd); 498c80476e4SDavid E. O'Brien blkpr(vp->vec); 499c80476e4SDavid E. O'Brien xputchar('\n'); 500c80476e4SDavid E. O'Brien } 501c80476e4SDavid E. O'Brien else 502c80476e4SDavid E. O'Brien blkexpand(vp->vec, str); 503c80476e4SDavid E. O'Brien } 504c80476e4SDavid E. O'Brien else { 505c80476e4SDavid E. O'Brien lexp[1].word = cmd; 506c80476e4SDavid E. O'Brien rv = tellmewhat(lexp, str); 507c80476e4SDavid E. O'Brien } 508c80476e4SDavid E. O'Brien return rv; 509c80476e4SDavid E. O'Brien } 510c80476e4SDavid E. O'Brien 511c80476e4SDavid E. O'Brien 512c80476e4SDavid E. O'Brien /*ARGSUSED*/ 513c80476e4SDavid E. O'Brien void 514c80476e4SDavid E. O'Brien dowhich(v, c) 515c80476e4SDavid E. O'Brien register Char **v; 516c80476e4SDavid E. O'Brien struct command *c; 517c80476e4SDavid E. O'Brien { 518c80476e4SDavid E. O'Brien int rv = TRUE; 519c80476e4SDavid E. O'Brien USE(c); 520c80476e4SDavid E. O'Brien 521c80476e4SDavid E. O'Brien #ifdef notdef 522c80476e4SDavid E. O'Brien /* 523c80476e4SDavid E. O'Brien * We don't want to glob dowhich args because we lose quoteing 524c80476e4SDavid E. O'Brien * E.g. which \ls if ls is aliased will not work correctly if 525c80476e4SDavid E. O'Brien * we glob here. 526c80476e4SDavid E. O'Brien */ 527c80476e4SDavid E. O'Brien gflag = 0, tglob(v); 528c80476e4SDavid E. O'Brien if (gflag) { 529c80476e4SDavid E. O'Brien v = globall(v); 530c80476e4SDavid E. O'Brien if (v == 0) 531c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_NOMATCH); 532c80476e4SDavid E. O'Brien } 533c80476e4SDavid E. O'Brien else { 534c80476e4SDavid E. O'Brien v = gargv = saveblk(v); 535c80476e4SDavid E. O'Brien trim(v); 536c80476e4SDavid E. O'Brien } 537c80476e4SDavid E. O'Brien #endif 538c80476e4SDavid E. O'Brien 539c80476e4SDavid E. O'Brien while (*++v) 540c80476e4SDavid E. O'Brien rv &= cmd_expand(*v, NULL); 541c80476e4SDavid E. O'Brien 542c80476e4SDavid E. O'Brien if (!rv) 543c80476e4SDavid E. O'Brien set(STRstatus, Strsave(STR1), VAR_READWRITE); 544c80476e4SDavid E. O'Brien 545c80476e4SDavid E. O'Brien #ifdef notdef 546c80476e4SDavid E. O'Brien /* Again look at the comment above; since we don't glob, we don't free */ 547c80476e4SDavid E. O'Brien if (gargv) 548c80476e4SDavid E. O'Brien blkfree(gargv), gargv = 0; 549c80476e4SDavid E. O'Brien #endif 550c80476e4SDavid E. O'Brien } 551c80476e4SDavid E. O'Brien 552c80476e4SDavid E. O'Brien /* PWP: a hack to start up your stopped editor on a single keystroke */ 553c80476e4SDavid E. O'Brien /* jbs - fixed hack so it worked :-) 3/28/89 */ 554c80476e4SDavid E. O'Brien 555c80476e4SDavid E. O'Brien struct process * 556c80476e4SDavid E. O'Brien find_stop_ed() 557c80476e4SDavid E. O'Brien { 558c80476e4SDavid E. O'Brien register struct process *pp, *retp; 559c80476e4SDavid E. O'Brien register char *ep, *vp, *cp, *p; 560c80476e4SDavid E. O'Brien int epl, vpl, pstatus; 561c80476e4SDavid E. O'Brien 562c80476e4SDavid E. O'Brien if ((ep = getenv("EDITOR")) != NULL) { /* if we have a value */ 563c80476e4SDavid E. O'Brien if ((p = strrchr(ep, '/')) != NULL) /* if it has a path */ 564c80476e4SDavid E. O'Brien ep = p + 1; /* then we want only the last part */ 565c80476e4SDavid E. O'Brien } 566c80476e4SDavid E. O'Brien else 567c80476e4SDavid E. O'Brien ep = "ed"; 568c80476e4SDavid E. O'Brien 569c80476e4SDavid E. O'Brien if ((vp = getenv("VISUAL")) != NULL) { /* if we have a value */ 570c80476e4SDavid E. O'Brien if ((p = strrchr(vp, '/')) != NULL) /* and it has a path */ 571c80476e4SDavid E. O'Brien vp = p + 1; /* then we want only the last part */ 572c80476e4SDavid E. O'Brien } 573c80476e4SDavid E. O'Brien else 574c80476e4SDavid E. O'Brien vp = "vi"; 575c80476e4SDavid E. O'Brien 576c80476e4SDavid E. O'Brien for (vpl = 0; vp[vpl] && !Isspace(vp[vpl]); vpl++) 577c80476e4SDavid E. O'Brien continue; 578c80476e4SDavid E. O'Brien for (epl = 0; ep[epl] && !Isspace(ep[epl]); epl++) 579c80476e4SDavid E. O'Brien continue; 580c80476e4SDavid E. O'Brien 581c80476e4SDavid E. O'Brien if (pcurrent == NULL) /* see if we have any jobs */ 582c80476e4SDavid E. O'Brien return NULL; /* nope */ 583c80476e4SDavid E. O'Brien 584c80476e4SDavid E. O'Brien retp = NULL; 585c80476e4SDavid E. O'Brien for (pp = proclist.p_next; pp; pp = pp->p_next) 586c80476e4SDavid E. O'Brien if (pp->p_procid == pp->p_jobid) { 587c80476e4SDavid E. O'Brien 588c80476e4SDavid E. O'Brien /* 589c80476e4SDavid E. O'Brien * Only foreground an edit session if it is suspended. Some GUI 590c80476e4SDavid E. O'Brien * editors have may be happily running in a separate window, no 591c80476e4SDavid E. O'Brien * point in foregrounding these if they're already running - webb 592c80476e4SDavid E. O'Brien */ 593c80476e4SDavid E. O'Brien pstatus = (int) (pp->p_flags & PALLSTATES); 594c80476e4SDavid E. O'Brien if (pstatus != PINTERRUPTED && pstatus != PSTOPPED && 595c80476e4SDavid E. O'Brien pstatus != PSIGNALED) 596c80476e4SDavid E. O'Brien continue; 597c80476e4SDavid E. O'Brien 598c80476e4SDavid E. O'Brien p = short2str(pp->p_command); 599c80476e4SDavid E. O'Brien /* get the first word */ 600c80476e4SDavid E. O'Brien for (cp = p; *cp && !isspace((unsigned char) *cp); cp++) 601c80476e4SDavid E. O'Brien continue; 602c80476e4SDavid E. O'Brien *cp = '\0'; 603c80476e4SDavid E. O'Brien 604c80476e4SDavid E. O'Brien if ((cp = strrchr(p, '/')) != NULL) /* and it has a path */ 605c80476e4SDavid E. O'Brien cp = cp + 1; /* then we want only the last part */ 606c80476e4SDavid E. O'Brien else 607c80476e4SDavid E. O'Brien cp = p; /* else we get all of it */ 608c80476e4SDavid E. O'Brien 609c80476e4SDavid E. O'Brien /* if we find either in the current name, fg it */ 610c80476e4SDavid E. O'Brien if (strncmp(ep, cp, (size_t) epl) == 0 || 611c80476e4SDavid E. O'Brien strncmp(vp, cp, (size_t) vpl) == 0) { 612c80476e4SDavid E. O'Brien 613c80476e4SDavid E. O'Brien /* 614c80476e4SDavid E. O'Brien * If there is a choice, then choose the current process if 615c80476e4SDavid E. O'Brien * available, or the previous process otherwise, or else 616c80476e4SDavid E. O'Brien * anything will do - Robert Webb (robertw@mulga.cs.mu.oz.au). 617c80476e4SDavid E. O'Brien */ 618c80476e4SDavid E. O'Brien if (pp == pcurrent) 619c80476e4SDavid E. O'Brien return pp; 620c80476e4SDavid E. O'Brien else if (retp == NULL || pp == pprevious) 621c80476e4SDavid E. O'Brien retp = pp; 622c80476e4SDavid E. O'Brien } 623c80476e4SDavid E. O'Brien } 624c80476e4SDavid E. O'Brien 625c80476e4SDavid E. O'Brien return retp; /* Will be NULL if we didn't find a job */ 626c80476e4SDavid E. O'Brien } 627c80476e4SDavid E. O'Brien 628c80476e4SDavid E. O'Brien void 629c80476e4SDavid E. O'Brien fg_proc_entry(pp) 630c80476e4SDavid E. O'Brien register struct process *pp; 631c80476e4SDavid E. O'Brien { 632c80476e4SDavid E. O'Brien #ifdef BSDSIGS 633c80476e4SDavid E. O'Brien sigmask_t omask; 634c80476e4SDavid E. O'Brien #endif 635c80476e4SDavid E. O'Brien jmp_buf_t osetexit; 636c80476e4SDavid E. O'Brien bool ohaderr; 637c80476e4SDavid E. O'Brien Char oGettingInput; 638c80476e4SDavid E. O'Brien 639c80476e4SDavid E. O'Brien getexit(osetexit); 640c80476e4SDavid E. O'Brien 641c80476e4SDavid E. O'Brien #ifdef BSDSIGS 642c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 643c80476e4SDavid E. O'Brien #else 644c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 645c80476e4SDavid E. O'Brien #endif 646c80476e4SDavid E. O'Brien oGettingInput = GettingInput; 647c80476e4SDavid E. O'Brien GettingInput = 0; 648c80476e4SDavid E. O'Brien 649c80476e4SDavid E. O'Brien ohaderr = haderr; /* we need to ignore setting of haderr due to 650c80476e4SDavid E. O'Brien * process getting stopped by a signal */ 651c80476e4SDavid E. O'Brien if (setexit() == 0) { /* come back here after pjwait */ 652c80476e4SDavid E. O'Brien pendjob(); 653c80476e4SDavid E. O'Brien (void) alarm(0); /* No autologout */ 654c80476e4SDavid E. O'Brien if (!pstart(pp, 1)) { 655c80476e4SDavid E. O'Brien pp->p_procid = 0; 656c80476e4SDavid E. O'Brien stderror(ERR_BADJOB, pp->p_command, strerror(errno)); 657c80476e4SDavid E. O'Brien } 658c80476e4SDavid E. O'Brien pjwait(pp); 659c80476e4SDavid E. O'Brien } 660c80476e4SDavid E. O'Brien setalarm(1); /* Autologout back on */ 661c80476e4SDavid E. O'Brien resexit(osetexit); 662c80476e4SDavid E. O'Brien haderr = ohaderr; 663c80476e4SDavid E. O'Brien GettingInput = oGettingInput; 664c80476e4SDavid E. O'Brien 665c80476e4SDavid E. O'Brien #ifdef BSDSIGS 666c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 667c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 668c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 669c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 670c80476e4SDavid E. O'Brien 671c80476e4SDavid E. O'Brien } 672c80476e4SDavid E. O'Brien 673c80476e4SDavid E. O'Brien static char * 674c80476e4SDavid E. O'Brien xgetpass(prm) 675c80476e4SDavid E. O'Brien char *prm; 676c80476e4SDavid E. O'Brien { 677c80476e4SDavid E. O'Brien static char pass[PASSMAX + 1]; 678c80476e4SDavid E. O'Brien int fd, i; 679c80476e4SDavid E. O'Brien signalfun_t sigint; 680c80476e4SDavid E. O'Brien 681c80476e4SDavid E. O'Brien sigint = (signalfun_t) sigset(SIGINT, SIG_IGN); 682c80476e4SDavid E. O'Brien (void) Rawmode(); /* Make sure, cause we want echo off */ 683c80476e4SDavid E. O'Brien if ((fd = open("/dev/tty", O_RDWR)) == -1) 684c80476e4SDavid E. O'Brien fd = SHIN; 685c80476e4SDavid E. O'Brien 686c80476e4SDavid E. O'Brien xprintf("%s", prm); flush(); 687c80476e4SDavid E. O'Brien for (i = 0;;) { 688c80476e4SDavid E. O'Brien if (read(fd, &pass[i], 1) < 1 || pass[i] == '\n') 689c80476e4SDavid E. O'Brien break; 690c80476e4SDavid E. O'Brien if (i < PASSMAX) 691c80476e4SDavid E. O'Brien i++; 692c80476e4SDavid E. O'Brien } 693c80476e4SDavid E. O'Brien 694c80476e4SDavid E. O'Brien pass[i] = '\0'; 695c80476e4SDavid E. O'Brien 696c80476e4SDavid E. O'Brien if (fd != SHIN) 697c80476e4SDavid E. O'Brien (void) close(fd); 698c80476e4SDavid E. O'Brien (void) sigset(SIGINT, sigint); 699c80476e4SDavid E. O'Brien 700c80476e4SDavid E. O'Brien return(pass); 701c80476e4SDavid E. O'Brien } 702c80476e4SDavid E. O'Brien 703c80476e4SDavid E. O'Brien /* 704c80476e4SDavid E. O'Brien * Ask the user for his login password to continue working 705c80476e4SDavid E. O'Brien * On systems that have a shadow password, this will only 706c80476e4SDavid E. O'Brien * work for root, but what can we do? 707c80476e4SDavid E. O'Brien * 708c80476e4SDavid E. O'Brien * If we fail to get the password, then we log the user out 709c80476e4SDavid E. O'Brien * immediately 710c80476e4SDavid E. O'Brien */ 711c80476e4SDavid E. O'Brien /*ARGSUSED*/ 712c80476e4SDavid E. O'Brien static void 713c80476e4SDavid E. O'Brien auto_lock(n) 714c80476e4SDavid E. O'Brien int n; 715c80476e4SDavid E. O'Brien { 716c80476e4SDavid E. O'Brien #ifndef NO_CRYPT 717c80476e4SDavid E. O'Brien 718c80476e4SDavid E. O'Brien int i; 719c80476e4SDavid E. O'Brien char *srpp = NULL; 720c80476e4SDavid E. O'Brien struct passwd *pw; 721c80476e4SDavid E. O'Brien #ifdef POSIX 722c80476e4SDavid E. O'Brien extern char *crypt __P((const char *, const char *)); 723c80476e4SDavid E. O'Brien #else 724c80476e4SDavid E. O'Brien extern char *crypt __P(()); 725c80476e4SDavid E. O'Brien #endif 726c80476e4SDavid E. O'Brien 727c80476e4SDavid E. O'Brien #undef XCRYPT 728c80476e4SDavid E. O'Brien 729c80476e4SDavid E. O'Brien #if defined(PW_AUTH) && !defined(XCRYPT) 730c80476e4SDavid E. O'Brien 731c80476e4SDavid E. O'Brien struct authorization *apw; 732c80476e4SDavid E. O'Brien extern char *crypt16 __P((const char *, const char *)); 733c80476e4SDavid E. O'Brien 734c80476e4SDavid E. O'Brien # define XCRYPT(a, b) crypt16(a, b) 735c80476e4SDavid E. O'Brien 736c80476e4SDavid E. O'Brien if ((pw = getpwuid(euid)) != NULL && /* effective user passwd */ 737c80476e4SDavid E. O'Brien (apw = getauthuid(euid)) != NULL) /* enhanced ultrix passwd */ 738c80476e4SDavid E. O'Brien srpp = apw->a_password; 739c80476e4SDavid E. O'Brien 740c80476e4SDavid E. O'Brien #endif /* PW_AUTH && !XCRYPT */ 741c80476e4SDavid E. O'Brien 742c80476e4SDavid E. O'Brien #if defined(PW_SHADOW) && !defined(XCRYPT) 743c80476e4SDavid E. O'Brien 744c80476e4SDavid E. O'Brien struct spwd *spw; 745c80476e4SDavid E. O'Brien 746c80476e4SDavid E. O'Brien # define XCRYPT(a, b) crypt(a, b) 747c80476e4SDavid E. O'Brien 748c80476e4SDavid E. O'Brien if ((pw = getpwuid(euid)) != NULL && /* effective user passwd */ 749c80476e4SDavid E. O'Brien (spw = getspnam(pw->pw_name)) != NULL) /* shadowed passwd */ 750c80476e4SDavid E. O'Brien srpp = spw->sp_pwdp; 751c80476e4SDavid E. O'Brien 752c80476e4SDavid E. O'Brien #endif /* PW_SHADOW && !XCRYPT */ 753c80476e4SDavid E. O'Brien 754c80476e4SDavid E. O'Brien #ifndef XCRYPT 755c80476e4SDavid E. O'Brien 756c80476e4SDavid E. O'Brien #define XCRYPT(a, b) crypt(a, b) 757c80476e4SDavid E. O'Brien 758c80476e4SDavid E. O'Brien if ((pw = getpwuid(euid)) != NULL) /* effective user passwd */ 759c80476e4SDavid E. O'Brien srpp = pw->pw_passwd; 760c80476e4SDavid E. O'Brien 761c80476e4SDavid E. O'Brien #endif /* !XCRYPT */ 762c80476e4SDavid E. O'Brien 763c80476e4SDavid E. O'Brien if (srpp == NULL) { 764c80476e4SDavid E. O'Brien auto_logout(0); 765c80476e4SDavid E. O'Brien /*NOTREACHED*/ 766c80476e4SDavid E. O'Brien return; 767c80476e4SDavid E. O'Brien } 768c80476e4SDavid E. O'Brien 769c80476e4SDavid E. O'Brien setalarm(0); /* Not for locking any more */ 770c80476e4SDavid E. O'Brien #ifdef BSDSIGS 771c80476e4SDavid E. O'Brien (void) sigsetmask(sigblock(0) & ~(sigmask(SIGALRM))); 772c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 773c80476e4SDavid E. O'Brien (void) sigrelse(SIGALRM); 774c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 775c80476e4SDavid E. O'Brien xputchar('\n'); 776c80476e4SDavid E. O'Brien for (i = 0; i < 5; i++) { 777c80476e4SDavid E. O'Brien const char *crpp; 778c80476e4SDavid E. O'Brien char *pp; 779c80476e4SDavid E. O'Brien #ifdef AFS 780c80476e4SDavid E. O'Brien char *afsname; 781c80476e4SDavid E. O'Brien Char *safs; 782c80476e4SDavid E. O'Brien 783c80476e4SDavid E. O'Brien if ((safs = varval(STRafsuser)) != STRNULL) 784c80476e4SDavid E. O'Brien afsname = short2str(safs); 785c80476e4SDavid E. O'Brien else 786c80476e4SDavid E. O'Brien if ((afsname = getenv("AFSUSER")) == NULL) 787c80476e4SDavid E. O'Brien afsname = pw->pw_name; 788c80476e4SDavid E. O'Brien #endif 789c80476e4SDavid E. O'Brien pp = xgetpass("Password:"); 790c80476e4SDavid E. O'Brien 791c80476e4SDavid E. O'Brien crpp = XCRYPT(pp, srpp); 792c80476e4SDavid E. O'Brien if ((strcmp(crpp, srpp) == 0) 793c80476e4SDavid E. O'Brien #ifdef AFS 794c80476e4SDavid E. O'Brien || (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION, 795c80476e4SDavid E. O'Brien afsname, /* name */ 796c80476e4SDavid E. O'Brien NULL, /* instance */ 797c80476e4SDavid E. O'Brien NULL, /* realm */ 798c80476e4SDavid E. O'Brien pp, /* password */ 799c80476e4SDavid E. O'Brien 0, /* lifetime */ 800c80476e4SDavid E. O'Brien 0, 0, /* spare */ 801c80476e4SDavid E. O'Brien NULL) /* reason */ 802c80476e4SDavid E. O'Brien == 0) 803c80476e4SDavid E. O'Brien #endif /* AFS */ 804c80476e4SDavid E. O'Brien ) { 805c80476e4SDavid E. O'Brien (void) memset(pp, 0, PASSMAX); 806c80476e4SDavid E. O'Brien if (GettingInput && !just_signaled) { 807c80476e4SDavid E. O'Brien (void) Rawmode(); 808c80476e4SDavid E. O'Brien ClearLines(); 809c80476e4SDavid E. O'Brien ClearDisp(); 810c80476e4SDavid E. O'Brien Refresh(); 811c80476e4SDavid E. O'Brien } 812c80476e4SDavid E. O'Brien just_signaled = 0; 813c80476e4SDavid E. O'Brien return; 814c80476e4SDavid E. O'Brien } 815c80476e4SDavid E. O'Brien xprintf(CGETS(22, 2, "\nIncorrect passwd for %s\n"), pw->pw_name); 816c80476e4SDavid E. O'Brien } 817c80476e4SDavid E. O'Brien #endif /* NO_CRYPT */ 818c80476e4SDavid E. O'Brien auto_logout(0); 819c80476e4SDavid E. O'Brien USE(n); 820c80476e4SDavid E. O'Brien } 821c80476e4SDavid E. O'Brien 822c80476e4SDavid E. O'Brien 823c80476e4SDavid E. O'Brien static void 824c80476e4SDavid E. O'Brien auto_logout(n) 825c80476e4SDavid E. O'Brien int n; 826c80476e4SDavid E. O'Brien { 827c80476e4SDavid E. O'Brien USE(n); 828c80476e4SDavid E. O'Brien xprintf("auto-logout\n"); 829c80476e4SDavid E. O'Brien /* Don't leave the tty in raw mode */ 830c80476e4SDavid E. O'Brien if (editing) 831c80476e4SDavid E. O'Brien (void) Cookedmode(); 832c80476e4SDavid E. O'Brien (void) close(SHIN); 833c80476e4SDavid E. O'Brien set(STRlogout, Strsave(STRautomatic), VAR_READWRITE); 834c80476e4SDavid E. O'Brien child = 1; 835c80476e4SDavid E. O'Brien #ifdef TESLA 836c80476e4SDavid E. O'Brien do_logout = 1; 837c80476e4SDavid E. O'Brien #endif /* TESLA */ 838c80476e4SDavid E. O'Brien GettingInput = FALSE; /* make flush() work to write hist files. Huber*/ 839c80476e4SDavid E. O'Brien goodbye(NULL, NULL); 840c80476e4SDavid E. O'Brien } 841c80476e4SDavid E. O'Brien 842c80476e4SDavid E. O'Brien sigret_t 843c80476e4SDavid E. O'Brien /*ARGSUSED*/ 844c80476e4SDavid E. O'Brien alrmcatch(snum) 845c80476e4SDavid E. O'Brien int snum; 846c80476e4SDavid E. O'Brien { 847c80476e4SDavid E. O'Brien #ifdef UNRELSIGS 848c80476e4SDavid E. O'Brien if (snum) 849c80476e4SDavid E. O'Brien (void) sigset(SIGALRM, alrmcatch); 850c80476e4SDavid E. O'Brien #endif /* UNRELSIGS */ 851c80476e4SDavid E. O'Brien 852c80476e4SDavid E. O'Brien (*alm_fun)(0); 853c80476e4SDavid E. O'Brien 854c80476e4SDavid E. O'Brien setalarm(1); 855c80476e4SDavid E. O'Brien #ifndef SIGVOID 856c80476e4SDavid E. O'Brien return (snum); 857c80476e4SDavid E. O'Brien #endif /* !SIGVOID */ 858c80476e4SDavid E. O'Brien } 859c80476e4SDavid E. O'Brien 860c80476e4SDavid E. O'Brien /* 861c80476e4SDavid E. O'Brien * Karl Kleinpaste, 21oct1983. 862c80476e4SDavid E. O'Brien * Added precmd(), which checks for the alias 863c80476e4SDavid E. O'Brien * precmd in aliases. If it's there, the alias 864c80476e4SDavid E. O'Brien * is executed as a command. This is done 865c80476e4SDavid E. O'Brien * after mailchk() and just before print- 866c80476e4SDavid E. O'Brien * ing the prompt. Useful for things like printing 867c80476e4SDavid E. O'Brien * one's current directory just before each command. 868c80476e4SDavid E. O'Brien */ 869c80476e4SDavid E. O'Brien void 870c80476e4SDavid E. O'Brien precmd() 871c80476e4SDavid E. O'Brien { 872c80476e4SDavid E. O'Brien #ifdef BSDSIGS 873c80476e4SDavid E. O'Brien sigmask_t omask; 874c80476e4SDavid E. O'Brien 875c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 876c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 877c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 878c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 879c80476e4SDavid E. O'Brien if (precmd_active) { /* an error must have been caught */ 880c80476e4SDavid E. O'Brien aliasrun(2, STRunalias, STRprecmd); 881c80476e4SDavid E. O'Brien xprintf(CGETS(22, 3, "Faulty alias 'precmd' removed.\n")); 882c80476e4SDavid E. O'Brien goto leave; 883c80476e4SDavid E. O'Brien } 884c80476e4SDavid E. O'Brien precmd_active = 1; 885c80476e4SDavid E. O'Brien if (!whyles && adrof1(STRprecmd, &aliases)) 886c80476e4SDavid E. O'Brien aliasrun(1, STRprecmd, NULL); 887c80476e4SDavid E. O'Brien leave: 888c80476e4SDavid E. O'Brien precmd_active = 0; 889c80476e4SDavid E. O'Brien #ifdef BSDSIGS 890c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 891c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 892c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 893c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 894c80476e4SDavid E. O'Brien } 895c80476e4SDavid E. O'Brien 896c80476e4SDavid E. O'Brien void 897c80476e4SDavid E. O'Brien postcmd() 898c80476e4SDavid E. O'Brien { 899c80476e4SDavid E. O'Brien #ifdef BSDSIGS 900c80476e4SDavid E. O'Brien sigmask_t omask; 901c80476e4SDavid E. O'Brien 902c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 903c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 904c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 905c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 906c80476e4SDavid E. O'Brien if (postcmd_active) { /* an error must have been caught */ 907c80476e4SDavid E. O'Brien aliasrun(2, STRunalias, STRpostcmd); 908c80476e4SDavid E. O'Brien xprintf(CGETS(22, 3, "Faulty alias 'postcmd' removed.\n")); 909c80476e4SDavid E. O'Brien goto leave; 910c80476e4SDavid E. O'Brien } 911c80476e4SDavid E. O'Brien postcmd_active = 1; 912c80476e4SDavid E. O'Brien if (!whyles && adrof1(STRpostcmd, &aliases)) 913c80476e4SDavid E. O'Brien aliasrun(1, STRpostcmd, NULL); 914c80476e4SDavid E. O'Brien leave: 915c80476e4SDavid E. O'Brien postcmd_active = 0; 916c80476e4SDavid E. O'Brien #ifdef BSDSIGS 917c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 918c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 919c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 920c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 921c80476e4SDavid E. O'Brien } 922c80476e4SDavid E. O'Brien 923c80476e4SDavid E. O'Brien /* 924c80476e4SDavid E. O'Brien * Paul Placeway 11/24/87 Added cwd_cmd by hacking precmd() into 925c80476e4SDavid E. O'Brien * submission... Run every time $cwd is set (after it is set). Useful 926c80476e4SDavid E. O'Brien * for putting your machine and cwd (or anything else) in an xterm title 927c80476e4SDavid E. O'Brien * space. 928c80476e4SDavid E. O'Brien */ 929c80476e4SDavid E. O'Brien void 930c80476e4SDavid E. O'Brien cwd_cmd() 931c80476e4SDavid E. O'Brien { 932c80476e4SDavid E. O'Brien #ifdef BSDSIGS 933c80476e4SDavid E. O'Brien sigmask_t omask; 934c80476e4SDavid E. O'Brien 935c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 936c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 937c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 938c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 939c80476e4SDavid E. O'Brien if (cwdcmd_active) { /* an error must have been caught */ 940c80476e4SDavid E. O'Brien aliasrun(2, STRunalias, STRcwdcmd); 941c80476e4SDavid E. O'Brien xprintf(CGETS(22, 4, "Faulty alias 'cwdcmd' removed.\n")); 942c80476e4SDavid E. O'Brien goto leave; 943c80476e4SDavid E. O'Brien } 944c80476e4SDavid E. O'Brien cwdcmd_active = 1; 945c80476e4SDavid E. O'Brien if (!whyles && adrof1(STRcwdcmd, &aliases)) 946c80476e4SDavid E. O'Brien aliasrun(1, STRcwdcmd, NULL); 947c80476e4SDavid E. O'Brien leave: 948c80476e4SDavid E. O'Brien cwdcmd_active = 0; 949c80476e4SDavid E. O'Brien #ifdef BSDSIGS 950c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 951c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 952c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 953c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 954c80476e4SDavid E. O'Brien } 955c80476e4SDavid E. O'Brien 956c80476e4SDavid E. O'Brien /* 957c80476e4SDavid E. O'Brien * Joachim Hoenig 07/16/91 Added beep_cmd, run every time tcsh wishes 958c80476e4SDavid E. O'Brien * to beep the terminal bell. Useful for playing nice sounds instead. 959c80476e4SDavid E. O'Brien */ 960c80476e4SDavid E. O'Brien void 961c80476e4SDavid E. O'Brien beep_cmd() 962c80476e4SDavid E. O'Brien { 963c80476e4SDavid E. O'Brien #ifdef BSDSIGS 964c80476e4SDavid E. O'Brien sigmask_t omask; 965c80476e4SDavid E. O'Brien 966c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 967c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 968c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 969c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 970c80476e4SDavid E. O'Brien if (beepcmd_active) { /* an error must have been caught */ 971c80476e4SDavid E. O'Brien aliasrun(2, STRunalias, STRbeepcmd); 972c80476e4SDavid E. O'Brien xprintf(CGETS(22, 5, "Faulty alias 'beepcmd' removed.\n")); 973c80476e4SDavid E. O'Brien } 974c80476e4SDavid E. O'Brien else { 975c80476e4SDavid E. O'Brien beepcmd_active = 1; 976c80476e4SDavid E. O'Brien if (!whyles && adrof1(STRbeepcmd, &aliases)) 977c80476e4SDavid E. O'Brien aliasrun(1, STRbeepcmd, NULL); 978c80476e4SDavid E. O'Brien } 979c80476e4SDavid E. O'Brien beepcmd_active = 0; 980c80476e4SDavid E. O'Brien #ifdef BSDSIGS 981c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 982c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 983c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 984c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 985c80476e4SDavid E. O'Brien } 986c80476e4SDavid E. O'Brien 987c80476e4SDavid E. O'Brien 988c80476e4SDavid E. O'Brien /* 989c80476e4SDavid E. O'Brien * Karl Kleinpaste, 18 Jan 1984. 990c80476e4SDavid E. O'Brien * Added period_cmd(), which executes the alias "periodic" every 991c80476e4SDavid E. O'Brien * $tperiod minutes. Useful for occasional checking of msgs and such. 992c80476e4SDavid E. O'Brien */ 993c80476e4SDavid E. O'Brien void 994c80476e4SDavid E. O'Brien period_cmd() 995c80476e4SDavid E. O'Brien { 996c80476e4SDavid E. O'Brien register Char *vp; 997c80476e4SDavid E. O'Brien time_t t, interval; 998c80476e4SDavid E. O'Brien #ifdef BSDSIGS 999c80476e4SDavid E. O'Brien sigmask_t omask; 1000c80476e4SDavid E. O'Brien 1001c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIGINT)); 1002c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 1003c80476e4SDavid E. O'Brien (void) sighold(SIGINT); 1004c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 1005c80476e4SDavid E. O'Brien if (periodic_active) { /* an error must have been caught */ 1006c80476e4SDavid E. O'Brien aliasrun(2, STRunalias, STRperiodic); 1007c80476e4SDavid E. O'Brien xprintf(CGETS(22, 6, "Faulty alias 'periodic' removed.\n")); 1008c80476e4SDavid E. O'Brien goto leave; 1009c80476e4SDavid E. O'Brien } 1010c80476e4SDavid E. O'Brien periodic_active = 1; 1011c80476e4SDavid E. O'Brien if (!whyles && adrof1(STRperiodic, &aliases)) { 1012c80476e4SDavid E. O'Brien vp = varval(STRtperiod); 1013c80476e4SDavid E. O'Brien if (vp == STRNULL) { 1014c80476e4SDavid E. O'Brien aliasrun(1, STRperiodic, NULL); 1015c80476e4SDavid E. O'Brien goto leave; 1016c80476e4SDavid E. O'Brien } 1017c80476e4SDavid E. O'Brien interval = getn(vp); 1018c80476e4SDavid E. O'Brien (void) time(&t); 1019c80476e4SDavid E. O'Brien if (t - t_period >= interval * 60) { 1020c80476e4SDavid E. O'Brien t_period = t; 1021c80476e4SDavid E. O'Brien aliasrun(1, STRperiodic, NULL); 1022c80476e4SDavid E. O'Brien } 1023c80476e4SDavid E. O'Brien } 1024c80476e4SDavid E. O'Brien leave: 1025c80476e4SDavid E. O'Brien periodic_active = 0; 1026c80476e4SDavid E. O'Brien #ifdef BSDSIGS 1027c80476e4SDavid E. O'Brien (void) sigsetmask(omask); 1028c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 1029c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 1030c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 1031c80476e4SDavid E. O'Brien } 1032c80476e4SDavid E. O'Brien 1033c80476e4SDavid E. O'Brien /* 1034c80476e4SDavid E. O'Brien * Karl Kleinpaste, 21oct1983. 1035c80476e4SDavid E. O'Brien * Set up a one-word alias command, for use for special things. 1036c80476e4SDavid E. O'Brien * This code is based on the mainline of process(). 1037c80476e4SDavid E. O'Brien */ 1038c80476e4SDavid E. O'Brien void 1039c80476e4SDavid E. O'Brien aliasrun(cnt, s1, s2) 1040c80476e4SDavid E. O'Brien int cnt; 1041c80476e4SDavid E. O'Brien Char *s1, *s2; 1042c80476e4SDavid E. O'Brien { 1043c80476e4SDavid E. O'Brien struct wordent w, *new1, *new2; /* for holding alias name */ 1044c80476e4SDavid E. O'Brien struct command *t = NULL; 1045c80476e4SDavid E. O'Brien jmp_buf_t osetexit; 1046c80476e4SDavid E. O'Brien int status; 1047c80476e4SDavid E. O'Brien 1048c80476e4SDavid E. O'Brien getexit(osetexit); 1049c80476e4SDavid E. O'Brien if (seterr) { 1050c80476e4SDavid E. O'Brien xfree((ptr_t) seterr); 1051c80476e4SDavid E. O'Brien seterr = NULL; /* don't repeatedly print err msg. */ 1052c80476e4SDavid E. O'Brien } 1053c80476e4SDavid E. O'Brien w.word = STRNULL; 1054c80476e4SDavid E. O'Brien new1 = (struct wordent *) xcalloc(1, sizeof w); 1055c80476e4SDavid E. O'Brien new1->word = Strsave(s1); 1056c80476e4SDavid E. O'Brien if (cnt == 1) { 1057c80476e4SDavid E. O'Brien /* build a lex list with one word. */ 1058c80476e4SDavid E. O'Brien w.next = w.prev = new1; 1059c80476e4SDavid E. O'Brien new1->next = new1->prev = &w; 1060c80476e4SDavid E. O'Brien } 1061c80476e4SDavid E. O'Brien else { 1062c80476e4SDavid E. O'Brien /* build a lex list with two words. */ 1063c80476e4SDavid E. O'Brien new2 = (struct wordent *) xcalloc(1, sizeof w); 1064c80476e4SDavid E. O'Brien new2->word = Strsave(s2); 1065c80476e4SDavid E. O'Brien w.next = new2->prev = new1; 1066c80476e4SDavid E. O'Brien new1->next = w.prev = new2; 1067c80476e4SDavid E. O'Brien new1->prev = new2->next = &w; 1068c80476e4SDavid E. O'Brien } 1069c80476e4SDavid E. O'Brien 1070c80476e4SDavid E. O'Brien /* Save the old status */ 1071c80476e4SDavid E. O'Brien status = getn(varval(STRstatus)); 1072c80476e4SDavid E. O'Brien 1073c80476e4SDavid E. O'Brien /* expand aliases like process() does. */ 1074c80476e4SDavid E. O'Brien alias(&w); 1075c80476e4SDavid E. O'Brien /* build a syntax tree for the command. */ 1076c80476e4SDavid E. O'Brien t = syntax(w.next, &w, 0); 1077c80476e4SDavid E. O'Brien if (seterr) 1078c80476e4SDavid E. O'Brien stderror(ERR_OLD); 1079c80476e4SDavid E. O'Brien 1080c80476e4SDavid E. O'Brien psavejob(); 1081c80476e4SDavid E. O'Brien 1082c80476e4SDavid E. O'Brien 1083c80476e4SDavid E. O'Brien /* catch any errors here */ 1084c80476e4SDavid E. O'Brien if (setexit() == 0) 1085c80476e4SDavid E. O'Brien /* execute the parse tree. */ 1086c80476e4SDavid E. O'Brien /* 1087c80476e4SDavid E. O'Brien * From: Michael Schroeder <mlschroe@immd4.informatik.uni-erlangen.de> 1088c80476e4SDavid E. O'Brien * was execute(t, tpgrp); 1089c80476e4SDavid E. O'Brien */ 1090c80476e4SDavid E. O'Brien execute(t, tpgrp > 0 ? tpgrp : -1, NULL, NULL); 1091c80476e4SDavid E. O'Brien /* done. free the lex list and parse tree. */ 1092c80476e4SDavid E. O'Brien freelex(&w), freesyn(t); 1093c80476e4SDavid E. O'Brien if (haderr) { 1094c80476e4SDavid E. O'Brien haderr = 0; 1095c80476e4SDavid E. O'Brien /* 1096c80476e4SDavid E. O'Brien * Either precmd, or cwdcmd, or periodic had an error. Call it again so 1097c80476e4SDavid E. O'Brien * that it is removed 1098c80476e4SDavid E. O'Brien */ 1099c80476e4SDavid E. O'Brien if (precmd_active) 1100c80476e4SDavid E. O'Brien precmd(); 1101c80476e4SDavid E. O'Brien if (postcmd_active) 1102c80476e4SDavid E. O'Brien postcmd(); 1103c80476e4SDavid E. O'Brien #ifdef notdef 1104c80476e4SDavid E. O'Brien /* 1105c80476e4SDavid E. O'Brien * XXX: On the other hand, just interrupting them causes an error too. 1106c80476e4SDavid E. O'Brien * So if we hit ^C in the middle of cwdcmd or periodic the alias gets 1107c80476e4SDavid E. O'Brien * removed. We don't want that. Note that we want to remove precmd 1108c80476e4SDavid E. O'Brien * though, cause that could lead into an infinite loop. This should be 1109c80476e4SDavid E. O'Brien * fixed correctly, but then haderr should give us the whole exit 1110c80476e4SDavid E. O'Brien * status not just true or false. 1111c80476e4SDavid E. O'Brien */ 1112c80476e4SDavid E. O'Brien else if (cwdcmd_active) 1113c80476e4SDavid E. O'Brien cwd_cmd(); 1114c80476e4SDavid E. O'Brien else if (beepcmd_active) 1115c80476e4SDavid E. O'Brien beep_cmd(); 1116c80476e4SDavid E. O'Brien else if (periodic_active) 1117c80476e4SDavid E. O'Brien period_cmd(); 1118c80476e4SDavid E. O'Brien #endif /* notdef */ 1119c80476e4SDavid E. O'Brien } 1120c80476e4SDavid E. O'Brien /* reset the error catcher to the old place */ 1121c80476e4SDavid E. O'Brien resexit(osetexit); 1122c80476e4SDavid E. O'Brien prestjob(); 1123c80476e4SDavid E. O'Brien pendjob(); 1124c80476e4SDavid E. O'Brien /* Restore status */ 1125c80476e4SDavid E. O'Brien set(STRstatus, putn(status), VAR_READWRITE); 1126c80476e4SDavid E. O'Brien } 1127c80476e4SDavid E. O'Brien 1128c80476e4SDavid E. O'Brien void 1129c80476e4SDavid E. O'Brien setalarm(lck) 1130c80476e4SDavid E. O'Brien int lck; 1131c80476e4SDavid E. O'Brien { 1132c80476e4SDavid E. O'Brien struct varent *vp; 1133c80476e4SDavid E. O'Brien Char *cp; 1134c80476e4SDavid E. O'Brien unsigned alrm_time = 0, logout_time, lock_time; 1135c80476e4SDavid E. O'Brien time_t cl, nl, sched_dif; 1136c80476e4SDavid E. O'Brien 1137c80476e4SDavid E. O'Brien if ((vp = adrof(STRautologout)) != NULL) { 1138c80476e4SDavid E. O'Brien if ((cp = vp->vec[0]) != 0) { 1139c80476e4SDavid E. O'Brien if ((logout_time = (unsigned) atoi(short2str(cp)) * 60) > 0) { 1140c80476e4SDavid E. O'Brien alrm_time = logout_time; 1141c80476e4SDavid E. O'Brien alm_fun = auto_logout; 1142c80476e4SDavid E. O'Brien } 1143c80476e4SDavid E. O'Brien } 1144c80476e4SDavid E. O'Brien if ((cp = vp->vec[1]) != 0) { 1145c80476e4SDavid E. O'Brien if ((lock_time = (unsigned) atoi(short2str(cp)) * 60) > 0) { 1146c80476e4SDavid E. O'Brien if (lck) { 1147c80476e4SDavid E. O'Brien if (alrm_time == 0 || lock_time < alrm_time) { 1148c80476e4SDavid E. O'Brien alrm_time = lock_time; 1149c80476e4SDavid E. O'Brien alm_fun = auto_lock; 1150c80476e4SDavid E. O'Brien } 1151c80476e4SDavid E. O'Brien } 1152c80476e4SDavid E. O'Brien else /* lock_time always < alrm_time */ 1153c80476e4SDavid E. O'Brien if (alrm_time) 1154c80476e4SDavid E. O'Brien alrm_time -= lock_time; 1155c80476e4SDavid E. O'Brien } 1156c80476e4SDavid E. O'Brien } 1157c80476e4SDavid E. O'Brien } 1158c80476e4SDavid E. O'Brien if ((nl = sched_next()) != -1) { 1159c80476e4SDavid E. O'Brien (void) time(&cl); 1160c80476e4SDavid E. O'Brien sched_dif = nl > cl ? nl - cl : 0; 1161c80476e4SDavid E. O'Brien if ((alrm_time == 0) || ((unsigned) sched_dif < alrm_time)) { 1162c80476e4SDavid E. O'Brien alrm_time = ((unsigned) sched_dif) + 1; 1163c80476e4SDavid E. O'Brien alm_fun = sched_run; 1164c80476e4SDavid E. O'Brien } 1165c80476e4SDavid E. O'Brien } 1166c80476e4SDavid E. O'Brien (void) alarm(alrm_time); /* Autologout ON */ 1167c80476e4SDavid E. O'Brien } 1168c80476e4SDavid E. O'Brien 1169c80476e4SDavid E. O'Brien #undef RMDEBUG /* For now... */ 1170c80476e4SDavid E. O'Brien 1171c80476e4SDavid E. O'Brien void 1172c80476e4SDavid E. O'Brien rmstar(cp) 1173c80476e4SDavid E. O'Brien struct wordent *cp; 1174c80476e4SDavid E. O'Brien { 1175c80476e4SDavid E. O'Brien struct wordent *we, *args; 1176c80476e4SDavid E. O'Brien register struct wordent *tmp, *del; 1177c80476e4SDavid E. O'Brien 1178c80476e4SDavid E. O'Brien #ifdef RMDEBUG 1179c80476e4SDavid E. O'Brien static Char STRrmdebug[] = {'r', 'm', 'd', 'e', 'b', 'u', 'g', '\0'}; 1180c80476e4SDavid E. O'Brien Char *tag; 1181c80476e4SDavid E. O'Brien #endif /* RMDEBUG */ 1182c80476e4SDavid E. O'Brien Char *charac; 1183c80476e4SDavid E. O'Brien char c; 1184c80476e4SDavid E. O'Brien int ask, doit, star = 0, silent = 0; 1185c80476e4SDavid E. O'Brien 1186c80476e4SDavid E. O'Brien if (!adrof(STRrmstar)) 1187c80476e4SDavid E. O'Brien return; 1188c80476e4SDavid E. O'Brien #ifdef RMDEBUG 1189c80476e4SDavid E. O'Brien tag = varval(STRrmdebug); 1190c80476e4SDavid E. O'Brien #endif /* RMDEBUG */ 1191c80476e4SDavid E. O'Brien we = cp->next; 1192c80476e4SDavid E. O'Brien while (*we->word == ';' && we != cp) 1193c80476e4SDavid E. O'Brien we = we->next; 1194c80476e4SDavid E. O'Brien while (we != cp) { 1195c80476e4SDavid E. O'Brien #ifdef RMDEBUG 1196c80476e4SDavid E. O'Brien if (*tag) 1197c80476e4SDavid E. O'Brien xprintf(CGETS(22, 7, "parsing command line\n")); 1198c80476e4SDavid E. O'Brien #endif /* RMDEBUG */ 1199c80476e4SDavid E. O'Brien if (!Strcmp(we->word, STRrm)) { 1200c80476e4SDavid E. O'Brien args = we->next; 1201c80476e4SDavid E. O'Brien ask = (*args->word != '-'); 1202c80476e4SDavid E. O'Brien while (*args->word == '-' && !silent) { /* check options */ 1203c80476e4SDavid E. O'Brien for (charac = (args->word + 1); *charac && !silent; charac++) 1204c80476e4SDavid E. O'Brien silent = (*charac == 'i' || *charac == 'f'); 1205c80476e4SDavid E. O'Brien args = args->next; 1206c80476e4SDavid E. O'Brien } 1207c80476e4SDavid E. O'Brien ask = (ask || (!ask && !silent)); 1208c80476e4SDavid E. O'Brien if (ask) { 1209c80476e4SDavid E. O'Brien for (; !star && *args->word != ';' 1210c80476e4SDavid E. O'Brien && args != cp; args = args->next) 1211c80476e4SDavid E. O'Brien if (!Strcmp(args->word, STRstar)) 1212c80476e4SDavid E. O'Brien star = 1; 1213c80476e4SDavid E. O'Brien if (ask && star) { 1214c80476e4SDavid E. O'Brien xprintf(CGETS(22, 8, 1215c80476e4SDavid E. O'Brien "Do you really want to delete all files? [n/y] ")); 1216c80476e4SDavid E. O'Brien flush(); 1217c80476e4SDavid E. O'Brien (void) force_read(SHIN, &c, 1); 1218c80476e4SDavid E. O'Brien /* 1219c80476e4SDavid E. O'Brien * Perhaps we should use the yesexpr from the 1220c80476e4SDavid E. O'Brien * actual locale 1221c80476e4SDavid E. O'Brien */ 1222c80476e4SDavid E. O'Brien doit = (strchr(CGETS(22, 14, "Yy"), c) != NULL); 1223c80476e4SDavid E. O'Brien while (c != '\n' && force_read(SHIN, &c, 1) == 1) 1224c80476e4SDavid E. O'Brien continue; 1225c80476e4SDavid E. O'Brien if (!doit) { 1226c80476e4SDavid E. O'Brien /* remove the command instead */ 1227c80476e4SDavid E. O'Brien #ifdef RMDEBUG 1228c80476e4SDavid E. O'Brien if (*tag) 1229c80476e4SDavid E. O'Brien xprintf(CGETS(22, 9, 1230c80476e4SDavid E. O'Brien "skipping deletion of files!\n")); 1231c80476e4SDavid E. O'Brien #endif /* RMDEBUG */ 1232c80476e4SDavid E. O'Brien for (tmp = we; 1233c80476e4SDavid E. O'Brien *tmp->word != '\n' && 1234c80476e4SDavid E. O'Brien *tmp->word != ';' && tmp != cp;) { 1235c80476e4SDavid E. O'Brien tmp->prev->next = tmp->next; 1236c80476e4SDavid E. O'Brien tmp->next->prev = tmp->prev; 1237c80476e4SDavid E. O'Brien xfree((ptr_t) tmp->word); 1238c80476e4SDavid E. O'Brien del = tmp; 1239c80476e4SDavid E. O'Brien tmp = tmp->next; 1240c80476e4SDavid E. O'Brien xfree((ptr_t) del); 1241c80476e4SDavid E. O'Brien } 1242c80476e4SDavid E. O'Brien if (*tmp->word == ';') { 1243c80476e4SDavid E. O'Brien tmp->prev->next = tmp->next; 1244c80476e4SDavid E. O'Brien tmp->next->prev = tmp->prev; 1245c80476e4SDavid E. O'Brien xfree((ptr_t) tmp->word); 1246c80476e4SDavid E. O'Brien del = tmp; 1247c80476e4SDavid E. O'Brien xfree((ptr_t) del); 1248c80476e4SDavid E. O'Brien } 1249c80476e4SDavid E. O'Brien } 1250c80476e4SDavid E. O'Brien } 1251c80476e4SDavid E. O'Brien } 1252c80476e4SDavid E. O'Brien } 1253c80476e4SDavid E. O'Brien for (we = we->next; 1254c80476e4SDavid E. O'Brien *we->word != ';' && we != cp; 1255c80476e4SDavid E. O'Brien we = we->next) 1256c80476e4SDavid E. O'Brien continue; 1257c80476e4SDavid E. O'Brien if (*we->word == ';') 1258c80476e4SDavid E. O'Brien we = we->next; 1259c80476e4SDavid E. O'Brien } 1260c80476e4SDavid E. O'Brien #ifdef RMDEBUG 1261c80476e4SDavid E. O'Brien if (*tag) { 1262c80476e4SDavid E. O'Brien xprintf(CGETS(22, 10, "command line now is:\n")); 1263c80476e4SDavid E. O'Brien for (we = cp->next; we != cp; we = we->next) 1264c80476e4SDavid E. O'Brien xprintf("%S ", we->word); 1265c80476e4SDavid E. O'Brien } 1266c80476e4SDavid E. O'Brien #endif /* RMDEBUG */ 1267c80476e4SDavid E. O'Brien return; 1268c80476e4SDavid E. O'Brien } 1269c80476e4SDavid E. O'Brien 1270c80476e4SDavid E. O'Brien #ifdef BSDJOBS 1271c80476e4SDavid E. O'Brien /* Check if command is in continue list 1272c80476e4SDavid E. O'Brien and do a "aliasing" if it exists as a job in background */ 1273c80476e4SDavid E. O'Brien 1274c80476e4SDavid E. O'Brien #undef CNDEBUG /* For now */ 1275c80476e4SDavid E. O'Brien void 1276c80476e4SDavid E. O'Brien continue_jobs(cp) 1277c80476e4SDavid E. O'Brien struct wordent *cp; 1278c80476e4SDavid E. O'Brien { 1279c80476e4SDavid E. O'Brien struct wordent *we; 1280c80476e4SDavid E. O'Brien register struct process *pp, *np; 1281c80476e4SDavid E. O'Brien Char *cmd, *continue_list, *continue_args_list; 1282c80476e4SDavid E. O'Brien 1283c80476e4SDavid E. O'Brien #ifdef CNDEBUG 1284c80476e4SDavid E. O'Brien Char *tag; 1285c80476e4SDavid E. O'Brien static Char STRcndebug[] = 1286c80476e4SDavid E. O'Brien {'c', 'n', 'd', 'e', 'b', 'u', 'g', '\0'}; 1287c80476e4SDavid E. O'Brien #endif /* CNDEBUG */ 1288c80476e4SDavid E. O'Brien bool in_cont_list, in_cont_arg_list; 1289c80476e4SDavid E. O'Brien 1290c80476e4SDavid E. O'Brien 1291c80476e4SDavid E. O'Brien #ifdef CNDEBUG 1292c80476e4SDavid E. O'Brien tag = varval(STRcndebug); 1293c80476e4SDavid E. O'Brien #endif /* CNDEBUG */ 1294c80476e4SDavid E. O'Brien continue_list = varval(STRcontinue); 1295c80476e4SDavid E. O'Brien continue_args_list = varval(STRcontinue_args); 1296c80476e4SDavid E. O'Brien if (*continue_list == '\0' && *continue_args_list == '\0') 1297c80476e4SDavid E. O'Brien return; 1298c80476e4SDavid E. O'Brien 1299c80476e4SDavid E. O'Brien we = cp->next; 1300c80476e4SDavid E. O'Brien while (*we->word == ';' && we != cp) 1301c80476e4SDavid E. O'Brien we = we->next; 1302c80476e4SDavid E. O'Brien while (we != cp) { 1303c80476e4SDavid E. O'Brien #ifdef CNDEBUG 1304c80476e4SDavid E. O'Brien if (*tag) 1305c80476e4SDavid E. O'Brien xprintf(CGETS(22, 11, "parsing command line\n")); 1306c80476e4SDavid E. O'Brien #endif /* CNDEBUG */ 1307c80476e4SDavid E. O'Brien cmd = we->word; 1308c80476e4SDavid E. O'Brien in_cont_list = inlist(continue_list, cmd); 1309c80476e4SDavid E. O'Brien in_cont_arg_list = inlist(continue_args_list, cmd); 1310c80476e4SDavid E. O'Brien if (in_cont_list || in_cont_arg_list) { 1311c80476e4SDavid E. O'Brien #ifdef CNDEBUG 1312c80476e4SDavid E. O'Brien if (*tag) 1313c80476e4SDavid E. O'Brien xprintf(CGETS(22, 12, "in one of the lists\n")); 1314c80476e4SDavid E. O'Brien #endif /* CNDEBUG */ 1315c80476e4SDavid E. O'Brien np = NULL; 1316c80476e4SDavid E. O'Brien for (pp = proclist.p_next; pp; pp = pp->p_next) { 1317c80476e4SDavid E. O'Brien if (prefix(cmd, pp->p_command)) { 1318c80476e4SDavid E. O'Brien if (pp->p_index) { 1319c80476e4SDavid E. O'Brien np = pp; 1320c80476e4SDavid E. O'Brien break; 1321c80476e4SDavid E. O'Brien } 1322c80476e4SDavid E. O'Brien } 1323c80476e4SDavid E. O'Brien } 1324c80476e4SDavid E. O'Brien if (np) { 1325c80476e4SDavid E. O'Brien insert(we, in_cont_arg_list); 1326c80476e4SDavid E. O'Brien } 1327c80476e4SDavid E. O'Brien } 1328c80476e4SDavid E. O'Brien for (we = we->next; 1329c80476e4SDavid E. O'Brien *we->word != ';' && we != cp; 1330c80476e4SDavid E. O'Brien we = we->next) 1331c80476e4SDavid E. O'Brien continue; 1332c80476e4SDavid E. O'Brien if (*we->word == ';') 1333c80476e4SDavid E. O'Brien we = we->next; 1334c80476e4SDavid E. O'Brien } 1335c80476e4SDavid E. O'Brien #ifdef CNDEBUG 1336c80476e4SDavid E. O'Brien if (*tag) { 1337c80476e4SDavid E. O'Brien xprintf(CGETS(22, 13, "command line now is:\n")); 1338c80476e4SDavid E. O'Brien for (we = cp->next; we != cp; we = we->next) 1339c80476e4SDavid E. O'Brien xprintf("%S ", we->word); 1340c80476e4SDavid E. O'Brien } 1341c80476e4SDavid E. O'Brien #endif /* CNDEBUG */ 1342c80476e4SDavid E. O'Brien return; 1343c80476e4SDavid E. O'Brien } 1344c80476e4SDavid E. O'Brien 1345c80476e4SDavid E. O'Brien /* The actual "aliasing" of for backgrounds() is done here 1346c80476e4SDavid E. O'Brien with the aid of insert_we(). */ 1347c80476e4SDavid E. O'Brien static void 1348c80476e4SDavid E. O'Brien insert(pl, file_args) 1349c80476e4SDavid E. O'Brien struct wordent *pl; 1350c80476e4SDavid E. O'Brien bool file_args; 1351c80476e4SDavid E. O'Brien { 1352c80476e4SDavid E. O'Brien struct wordent *now, *last; 1353c80476e4SDavid E. O'Brien Char *cmd, *bcmd, *cp1, *cp2; 1354c80476e4SDavid E. O'Brien int cmd_len; 1355c80476e4SDavid E. O'Brien Char *pause = STRunderpause; 1356c80476e4SDavid E. O'Brien int p_len = (int) Strlen(pause); 1357c80476e4SDavid E. O'Brien 1358c80476e4SDavid E. O'Brien cmd_len = (int) Strlen(pl->word); 1359c80476e4SDavid E. O'Brien cmd = (Char *) xcalloc(1, (size_t) ((cmd_len + 1) * sizeof(Char))); 1360c80476e4SDavid E. O'Brien (void) Strcpy(cmd, pl->word); 1361c80476e4SDavid E. O'Brien /* Do insertions at beginning, first replace command word */ 1362c80476e4SDavid E. O'Brien 1363c80476e4SDavid E. O'Brien if (file_args) { 1364c80476e4SDavid E. O'Brien now = pl; 1365c80476e4SDavid E. O'Brien xfree((ptr_t) now->word); 1366c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) (5 * sizeof(Char))); 1367c80476e4SDavid E. O'Brien (void) Strcpy(now->word, STRecho); 1368c80476e4SDavid E. O'Brien 1369c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) sizeof(struct wordent)); 1370c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) (6 * sizeof(Char))); 1371c80476e4SDavid E. O'Brien (void) Strcpy(now->word, STRbackqpwd); 1372c80476e4SDavid E. O'Brien insert_we(now, pl); 1373c80476e4SDavid E. O'Brien 1374c80476e4SDavid E. O'Brien for (last = now; *last->word != '\n' && *last->word != ';'; 1375c80476e4SDavid E. O'Brien last = last->next) 1376c80476e4SDavid E. O'Brien continue; 1377c80476e4SDavid E. O'Brien 1378c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) sizeof(struct wordent)); 1379c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) (2 * sizeof(Char))); 1380c80476e4SDavid E. O'Brien (void) Strcpy(now->word, STRgt); 1381c80476e4SDavid E. O'Brien insert_we(now, last->prev); 1382c80476e4SDavid E. O'Brien 1383c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) sizeof(struct wordent)); 1384c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) (2 * sizeof(Char))); 1385c80476e4SDavid E. O'Brien (void) Strcpy(now->word, STRbang); 1386c80476e4SDavid E. O'Brien insert_we(now, last->prev); 1387c80476e4SDavid E. O'Brien 1388c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) sizeof(struct wordent)); 1389c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) cmd_len + p_len + 4); 1390c80476e4SDavid E. O'Brien cp1 = now->word; 1391c80476e4SDavid E. O'Brien cp2 = cmd; 1392c80476e4SDavid E. O'Brien *cp1++ = '~'; 1393c80476e4SDavid E. O'Brien *cp1++ = '/'; 1394c80476e4SDavid E. O'Brien *cp1++ = '.'; 1395c80476e4SDavid E. O'Brien while ((*cp1++ = *cp2++) != '\0') 1396c80476e4SDavid E. O'Brien continue; 1397c80476e4SDavid E. O'Brien cp1--; 1398c80476e4SDavid E. O'Brien cp2 = pause; 1399c80476e4SDavid E. O'Brien while ((*cp1++ = *cp2++) != '\0') 1400c80476e4SDavid E. O'Brien continue; 1401c80476e4SDavid E. O'Brien insert_we(now, last->prev); 1402c80476e4SDavid E. O'Brien 1403c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) sizeof(struct wordent)); 1404c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, (size_t) (2 * sizeof(Char))); 1405c80476e4SDavid E. O'Brien (void) Strcpy(now->word, STRsemi); 1406c80476e4SDavid E. O'Brien insert_we(now, last->prev); 1407c80476e4SDavid E. O'Brien bcmd = (Char *) xcalloc(1, (size_t) ((cmd_len + 2) * sizeof(Char))); 1408c80476e4SDavid E. O'Brien cp1 = bcmd; 1409c80476e4SDavid E. O'Brien cp2 = cmd; 1410c80476e4SDavid E. O'Brien *cp1++ = '%'; 1411c80476e4SDavid E. O'Brien while ((*cp1++ = *cp2++) != '\0') 1412c80476e4SDavid E. O'Brien continue; 1413c80476e4SDavid E. O'Brien now = (struct wordent *) xcalloc(1, (size_t) (sizeof(struct wordent))); 1414c80476e4SDavid E. O'Brien now->word = bcmd; 1415c80476e4SDavid E. O'Brien insert_we(now, last->prev); 1416c80476e4SDavid E. O'Brien } 1417c80476e4SDavid E. O'Brien else { 1418c80476e4SDavid E. O'Brien struct wordent *del; 1419c80476e4SDavid E. O'Brien 1420c80476e4SDavid E. O'Brien now = pl; 1421c80476e4SDavid E. O'Brien xfree((ptr_t) now->word); 1422c80476e4SDavid E. O'Brien now->word = (Char *) xcalloc(1, 1423c80476e4SDavid E. O'Brien (size_t) ((cmd_len + 2) * sizeof(Char))); 1424c80476e4SDavid E. O'Brien cp1 = now->word; 1425c80476e4SDavid E. O'Brien cp2 = cmd; 1426c80476e4SDavid E. O'Brien *cp1++ = '%'; 1427c80476e4SDavid E. O'Brien while ((*cp1++ = *cp2++) != '\0') 1428c80476e4SDavid E. O'Brien continue; 1429c80476e4SDavid E. O'Brien for (now = now->next; 1430c80476e4SDavid E. O'Brien *now->word != '\n' && *now->word != ';' && now != pl;) { 1431c80476e4SDavid E. O'Brien now->prev->next = now->next; 1432c80476e4SDavid E. O'Brien now->next->prev = now->prev; 1433c80476e4SDavid E. O'Brien xfree((ptr_t) now->word); 1434c80476e4SDavid E. O'Brien del = now; 1435c80476e4SDavid E. O'Brien now = now->next; 1436c80476e4SDavid E. O'Brien xfree((ptr_t) del); 1437c80476e4SDavid E. O'Brien } 1438c80476e4SDavid E. O'Brien } 1439c80476e4SDavid E. O'Brien } 1440c80476e4SDavid E. O'Brien 1441c80476e4SDavid E. O'Brien static void 1442c80476e4SDavid E. O'Brien insert_we(new, where) 1443c80476e4SDavid E. O'Brien struct wordent *new, *where; 1444c80476e4SDavid E. O'Brien { 1445c80476e4SDavid E. O'Brien 1446c80476e4SDavid E. O'Brien new->prev = where; 1447c80476e4SDavid E. O'Brien new->next = where->next; 1448c80476e4SDavid E. O'Brien where->next = new; 1449c80476e4SDavid E. O'Brien new->next->prev = new; 1450c80476e4SDavid E. O'Brien } 1451c80476e4SDavid E. O'Brien 1452c80476e4SDavid E. O'Brien static int 1453c80476e4SDavid E. O'Brien inlist(list, name) 1454c80476e4SDavid E. O'Brien Char *list, *name; 1455c80476e4SDavid E. O'Brien { 1456c80476e4SDavid E. O'Brien register Char *l, *n; 1457c80476e4SDavid E. O'Brien 1458c80476e4SDavid E. O'Brien l = list; 1459c80476e4SDavid E. O'Brien n = name; 1460c80476e4SDavid E. O'Brien 1461c80476e4SDavid E. O'Brien while (*l && *n) { 1462c80476e4SDavid E. O'Brien if (*l == *n) { 1463c80476e4SDavid E. O'Brien l++; 1464c80476e4SDavid E. O'Brien n++; 1465c80476e4SDavid E. O'Brien if (*n == '\0' && (*l == ' ' || *l == '\0')) 1466c80476e4SDavid E. O'Brien return (1); 1467c80476e4SDavid E. O'Brien else 1468c80476e4SDavid E. O'Brien continue; 1469c80476e4SDavid E. O'Brien } 1470c80476e4SDavid E. O'Brien else { 1471c80476e4SDavid E. O'Brien while (*l && *l != ' ') 1472c80476e4SDavid E. O'Brien l++; /* skip to blank */ 1473c80476e4SDavid E. O'Brien while (*l && *l == ' ') 1474c80476e4SDavid E. O'Brien l++; /* and find first nonblank character */ 1475c80476e4SDavid E. O'Brien n = name; 1476c80476e4SDavid E. O'Brien } 1477c80476e4SDavid E. O'Brien } 1478c80476e4SDavid E. O'Brien return (0); 1479c80476e4SDavid E. O'Brien } 1480c80476e4SDavid E. O'Brien 1481c80476e4SDavid E. O'Brien #endif /* BSDJOBS */ 1482c80476e4SDavid E. O'Brien 1483c80476e4SDavid E. O'Brien 1484c80476e4SDavid E. O'Brien /* 1485c80476e4SDavid E. O'Brien * Implement a small cache for tilde names. This is used primarily 1486c80476e4SDavid E. O'Brien * to expand tilde names to directories, but also 1487c80476e4SDavid E. O'Brien * we can find users from their home directories for the tilde 1488c80476e4SDavid E. O'Brien * prompt, on machines where yp lookup is slow this can be a big win... 1489c80476e4SDavid E. O'Brien * As with any cache this can run out of sync, rehash can sync it again. 1490c80476e4SDavid E. O'Brien */ 1491c80476e4SDavid E. O'Brien static struct tildecache { 1492c80476e4SDavid E. O'Brien Char *user; 1493c80476e4SDavid E. O'Brien Char *home; 1494c80476e4SDavid E. O'Brien int hlen; 1495c80476e4SDavid E. O'Brien } *tcache = NULL; 1496c80476e4SDavid E. O'Brien 1497c80476e4SDavid E. O'Brien #define TILINCR 10 1498c80476e4SDavid E. O'Brien int tlength = 0; 1499c80476e4SDavid E. O'Brien static int tsize = TILINCR; 1500c80476e4SDavid E. O'Brien 1501c80476e4SDavid E. O'Brien static int 1502c80476e4SDavid E. O'Brien tildecompare(p1, p2) 1503c80476e4SDavid E. O'Brien struct tildecache *p1, *p2; 1504c80476e4SDavid E. O'Brien { 1505c80476e4SDavid E. O'Brien return Strcmp(p1->user, p2->user); 1506c80476e4SDavid E. O'Brien } 1507c80476e4SDavid E. O'Brien 1508c80476e4SDavid E. O'Brien static Char * 1509c80476e4SDavid E. O'Brien gethomedir(us) 1510c80476e4SDavid E. O'Brien Char *us; 1511c80476e4SDavid E. O'Brien { 1512c80476e4SDavid E. O'Brien register struct passwd *pp; 1513c80476e4SDavid E. O'Brien #ifdef HESIOD 1514c80476e4SDavid E. O'Brien char **res, **res1, *cp; 1515c80476e4SDavid E. O'Brien Char *rp; 1516c80476e4SDavid E. O'Brien #endif /* HESIOD */ 1517c80476e4SDavid E. O'Brien 1518c80476e4SDavid E. O'Brien pp = getpwnam(short2str(us)); 1519c80476e4SDavid E. O'Brien #ifdef YPBUGS 1520c80476e4SDavid E. O'Brien fix_yp_bugs(); 1521c80476e4SDavid E. O'Brien #endif /* YPBUGS */ 1522c80476e4SDavid E. O'Brien if (pp != NULL) 1523c80476e4SDavid E. O'Brien return Strsave(str2short(pp->pw_dir)); 1524c80476e4SDavid E. O'Brien #ifdef HESIOD 1525c80476e4SDavid E. O'Brien res = hes_resolve(short2str(us), "filsys"); 1526c80476e4SDavid E. O'Brien rp = 0; 1527c80476e4SDavid E. O'Brien if (res != 0) { 1528c80476e4SDavid E. O'Brien extern char *strtok(); 1529c80476e4SDavid E. O'Brien if ((*res) != 0) { 1530c80476e4SDavid E. O'Brien /* 1531c80476e4SDavid E. O'Brien * Look at the first token to determine how to interpret 1532c80476e4SDavid E. O'Brien * the rest of it. 1533c80476e4SDavid E. O'Brien * Yes, strtok is evil (it's not thread-safe), but it's also 1534c80476e4SDavid E. O'Brien * easy to use. 1535c80476e4SDavid E. O'Brien */ 1536c80476e4SDavid E. O'Brien cp = strtok(*res, " "); 1537c80476e4SDavid E. O'Brien if (strcmp(cp, "AFS") == 0) { 1538c80476e4SDavid E. O'Brien /* next token is AFS pathname.. */ 1539c80476e4SDavid E. O'Brien cp = strtok(NULL, " "); 1540c80476e4SDavid E. O'Brien if (cp != NULL) 1541c80476e4SDavid E. O'Brien rp = Strsave(str2short(cp)); 1542c80476e4SDavid E. O'Brien } else if (strcmp(cp, "NFS") == 0) { 1543c80476e4SDavid E. O'Brien cp = NULL; 1544c80476e4SDavid E. O'Brien if ((strtok(NULL, " ")) && /* skip remote pathname */ 1545c80476e4SDavid E. O'Brien (strtok(NULL, " ")) && /* skip host */ 1546c80476e4SDavid E. O'Brien (strtok(NULL, " ")) && /* skip mode */ 1547c80476e4SDavid E. O'Brien (cp = strtok(NULL, " "))) { 1548c80476e4SDavid E. O'Brien rp = Strsave(str2short(cp)); 1549c80476e4SDavid E. O'Brien } 1550c80476e4SDavid E. O'Brien } 1551c80476e4SDavid E. O'Brien } 1552c80476e4SDavid E. O'Brien for (res1 = res; *res1; res1++) 1553c80476e4SDavid E. O'Brien free(*res1); 1554c80476e4SDavid E. O'Brien return rp; 1555c80476e4SDavid E. O'Brien } 1556c80476e4SDavid E. O'Brien #endif /* HESIOD */ 1557c80476e4SDavid E. O'Brien return NULL; 1558c80476e4SDavid E. O'Brien } 1559c80476e4SDavid E. O'Brien 1560c80476e4SDavid E. O'Brien Char * 1561c80476e4SDavid E. O'Brien gettilde(us) 1562c80476e4SDavid E. O'Brien Char *us; 1563c80476e4SDavid E. O'Brien { 1564c80476e4SDavid E. O'Brien struct tildecache *bp1, *bp2, *bp; 1565c80476e4SDavid E. O'Brien Char *hd; 1566c80476e4SDavid E. O'Brien 1567c80476e4SDavid E. O'Brien /* Ignore NIS special names */ 1568c80476e4SDavid E. O'Brien if (*us == '+' || *us == '-') 1569c80476e4SDavid E. O'Brien return NULL; 1570c80476e4SDavid E. O'Brien 1571c80476e4SDavid E. O'Brien if (tcache == NULL) 1572c80476e4SDavid E. O'Brien tcache = (struct tildecache *) xmalloc((size_t) (TILINCR * 1573c80476e4SDavid E. O'Brien sizeof(struct tildecache))); 1574c80476e4SDavid E. O'Brien /* 1575c80476e4SDavid E. O'Brien * Binary search 1576c80476e4SDavid E. O'Brien */ 1577c80476e4SDavid E. O'Brien for (bp1 = tcache, bp2 = tcache + tlength; bp1 < bp2;) { 1578c80476e4SDavid E. O'Brien register int i; 1579c80476e4SDavid E. O'Brien 1580c80476e4SDavid E. O'Brien bp = bp1 + ((bp2 - bp1) >> 1); 1581c80476e4SDavid E. O'Brien if ((i = *us - *bp->user) == 0 && (i = Strcmp(us, bp->user)) == 0) 1582c80476e4SDavid E. O'Brien return (bp->home); 1583c80476e4SDavid E. O'Brien if (i < 0) 1584c80476e4SDavid E. O'Brien bp2 = bp; 1585c80476e4SDavid E. O'Brien else 1586c80476e4SDavid E. O'Brien bp1 = bp + 1; 1587c80476e4SDavid E. O'Brien } 1588c80476e4SDavid E. O'Brien /* 1589c80476e4SDavid E. O'Brien * Not in the cache, try to get it from the passwd file 1590c80476e4SDavid E. O'Brien */ 1591c80476e4SDavid E. O'Brien hd = gethomedir(us); 1592c80476e4SDavid E. O'Brien if (hd == NULL) 1593c80476e4SDavid E. O'Brien return NULL; 1594c80476e4SDavid E. O'Brien 1595c80476e4SDavid E. O'Brien /* 1596c80476e4SDavid E. O'Brien * Update the cache 1597c80476e4SDavid E. O'Brien */ 1598c80476e4SDavid E. O'Brien tcache[tlength].user = Strsave(us); 1599c80476e4SDavid E. O'Brien tcache[tlength].home = hd; 1600c80476e4SDavid E. O'Brien tcache[tlength++].hlen = (int) Strlen(hd); 1601c80476e4SDavid E. O'Brien 1602c80476e4SDavid E. O'Brien qsort((ptr_t) tcache, (size_t) tlength, sizeof(struct tildecache), 1603c80476e4SDavid E. O'Brien (int (*) __P((const void *, const void *))) tildecompare); 1604c80476e4SDavid E. O'Brien 1605c80476e4SDavid E. O'Brien if (tlength == tsize) { 1606c80476e4SDavid E. O'Brien tsize += TILINCR; 1607c80476e4SDavid E. O'Brien tcache = (struct tildecache *) xrealloc((ptr_t) tcache, 1608c80476e4SDavid E. O'Brien (size_t) (tsize * 1609c80476e4SDavid E. O'Brien sizeof(struct tildecache))); 1610c80476e4SDavid E. O'Brien } 1611c80476e4SDavid E. O'Brien return (hd); 1612c80476e4SDavid E. O'Brien } 1613c80476e4SDavid E. O'Brien 1614c80476e4SDavid E. O'Brien /* 1615c80476e4SDavid E. O'Brien * Return the username if the directory path passed contains a 1616c80476e4SDavid E. O'Brien * user's home directory in the tilde cache, otherwise return NULL 1617c80476e4SDavid E. O'Brien * hm points to the place where the path became different. 1618c80476e4SDavid E. O'Brien * Special case: Our own home directory. 1619c80476e4SDavid E. O'Brien * If we are passed a null pointer, then we flush the cache. 1620c80476e4SDavid E. O'Brien */ 1621c80476e4SDavid E. O'Brien Char * 1622c80476e4SDavid E. O'Brien getusername(hm) 1623c80476e4SDavid E. O'Brien Char **hm; 1624c80476e4SDavid E. O'Brien { 1625c80476e4SDavid E. O'Brien Char *h, *p; 1626c80476e4SDavid E. O'Brien int i, j; 1627c80476e4SDavid E. O'Brien 1628c80476e4SDavid E. O'Brien if (hm == NULL) { 1629c80476e4SDavid E. O'Brien for (i = 0; i < tlength; i++) { 1630c80476e4SDavid E. O'Brien xfree((ptr_t) tcache[i].home); 1631c80476e4SDavid E. O'Brien xfree((ptr_t) tcache[i].user); 1632c80476e4SDavid E. O'Brien } 1633c80476e4SDavid E. O'Brien xfree((ptr_t) tcache); 1634c80476e4SDavid E. O'Brien tlength = 0; 1635c80476e4SDavid E. O'Brien tsize = TILINCR; 1636c80476e4SDavid E. O'Brien tcache = NULL; 1637c80476e4SDavid E. O'Brien return NULL; 1638c80476e4SDavid E. O'Brien } 1639c80476e4SDavid E. O'Brien if (((h = varval(STRhome)) != STRNULL) && 1640c80476e4SDavid E. O'Brien (Strncmp(p = *hm, h, (size_t) (j = (int) Strlen(h))) == 0) && 1641c80476e4SDavid E. O'Brien (p[j] == '/' || p[j] == '\0')) { 1642c80476e4SDavid E. O'Brien *hm = &p[j]; 1643c80476e4SDavid E. O'Brien return STRNULL; 1644c80476e4SDavid E. O'Brien } 1645c80476e4SDavid E. O'Brien for (i = 0; i < tlength; i++) 1646c80476e4SDavid E. O'Brien if ((Strncmp(p = *hm, tcache[i].home, (size_t) 1647c80476e4SDavid E. O'Brien (j = tcache[i].hlen)) == 0) && (p[j] == '/' || p[j] == '\0')) { 1648c80476e4SDavid E. O'Brien *hm = &p[j]; 1649c80476e4SDavid E. O'Brien return tcache[i].user; 1650c80476e4SDavid E. O'Brien } 1651c80476e4SDavid E. O'Brien return NULL; 1652c80476e4SDavid E. O'Brien } 1653c80476e4SDavid E. O'Brien 1654c80476e4SDavid E. O'Brien #ifdef OBSOLETE 1655c80476e4SDavid E. O'Brien /* 1656c80476e4SDavid E. O'Brien * PWP: read a bunch of aliases out of a file QUICKLY. The format 1657c80476e4SDavid E. O'Brien * is almost the same as the result of saying "alias > FILE", except 1658c80476e4SDavid E. O'Brien * that saying "aliases > FILE" does not expand non-letters to printable 1659c80476e4SDavid E. O'Brien * sequences. 1660c80476e4SDavid E. O'Brien */ 1661c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1662c80476e4SDavid E. O'Brien void 1663c80476e4SDavid E. O'Brien doaliases(v, c) 1664c80476e4SDavid E. O'Brien Char **v; 1665c80476e4SDavid E. O'Brien struct command *c; 1666c80476e4SDavid E. O'Brien { 1667c80476e4SDavid E. O'Brien jmp_buf_t oldexit; 1668c80476e4SDavid E. O'Brien Char **vec, *lp; 1669c80476e4SDavid E. O'Brien int fd; 1670c80476e4SDavid E. O'Brien Char buf[BUFSIZE], line[BUFSIZE]; 1671c80476e4SDavid E. O'Brien char tbuf[BUFSIZE + 1], *tmp; 1672c80476e4SDavid E. O'Brien extern bool output_raw; /* PWP: in sh.print.c */ 1673c80476e4SDavid E. O'Brien 1674c80476e4SDavid E. O'Brien USE(c); 1675c80476e4SDavid E. O'Brien v++; 1676c80476e4SDavid E. O'Brien if (*v == 0) { 1677c80476e4SDavid E. O'Brien output_raw = 1; 1678c80476e4SDavid E. O'Brien plist(&aliases, VAR_ALL); 1679c80476e4SDavid E. O'Brien output_raw = 0; 1680c80476e4SDavid E. O'Brien return; 1681c80476e4SDavid E. O'Brien } 1682c80476e4SDavid E. O'Brien 1683c80476e4SDavid E. O'Brien gflag = 0, tglob(v); 1684c80476e4SDavid E. O'Brien if (gflag) { 1685c80476e4SDavid E. O'Brien v = globall(v); 1686c80476e4SDavid E. O'Brien if (v == 0) 1687c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_NOMATCH); 1688c80476e4SDavid E. O'Brien } 1689c80476e4SDavid E. O'Brien else { 1690c80476e4SDavid E. O'Brien v = gargv = saveblk(v); 1691c80476e4SDavid E. O'Brien trim(v); 1692c80476e4SDavid E. O'Brien } 1693c80476e4SDavid E. O'Brien 1694c80476e4SDavid E. O'Brien if ((fd = open(tmp = short2str(*v), O_RDONLY)) < 0) 1695c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_SYSTEM, tmp, strerror(errno)); 1696c80476e4SDavid E. O'Brien 1697c80476e4SDavid E. O'Brien getexit(oldexit); 1698c80476e4SDavid E. O'Brien if (setexit() == 0) { 1699c80476e4SDavid E. O'Brien for (;;) { 1700c80476e4SDavid E. O'Brien Char *p = NULL; 1701c80476e4SDavid E. O'Brien int n = 0; 1702c80476e4SDavid E. O'Brien lp = line; 1703c80476e4SDavid E. O'Brien for (;;) { 1704c80476e4SDavid E. O'Brien if (n <= 0) { 1705c80476e4SDavid E. O'Brien int i; 1706c80476e4SDavid E. O'Brien 1707c80476e4SDavid E. O'Brien if ((n = read(fd, tbuf, BUFSIZE)) <= 0) { 1708c80476e4SDavid E. O'Brien #ifdef convex 1709c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, progname, strerror(errno)); 1710c80476e4SDavid E. O'Brien #endif /* convex */ 1711c80476e4SDavid E. O'Brien goto eof; 1712c80476e4SDavid E. O'Brien } 1713c80476e4SDavid E. O'Brien for (i = 0; i < n; i++) 1714c80476e4SDavid E. O'Brien buf[i] = (Char) tbuf[i]; 1715c80476e4SDavid E. O'Brien p = buf; 1716c80476e4SDavid E. O'Brien } 1717c80476e4SDavid E. O'Brien n--; 1718c80476e4SDavid E. O'Brien if ((*lp++ = *p++) == '\n') { 1719c80476e4SDavid E. O'Brien lp[-1] = '\0'; 1720c80476e4SDavid E. O'Brien break; 1721c80476e4SDavid E. O'Brien } 1722c80476e4SDavid E. O'Brien } 1723c80476e4SDavid E. O'Brien for (lp = line; *lp; lp++) { 1724c80476e4SDavid E. O'Brien if (isspc(*lp)) { 1725c80476e4SDavid E. O'Brien *lp++ = '\0'; 1726c80476e4SDavid E. O'Brien while (isspc(*lp)) 1727c80476e4SDavid E. O'Brien lp++; 1728c80476e4SDavid E. O'Brien vec = (Char **) xmalloc((size_t) 1729c80476e4SDavid E. O'Brien (2 * sizeof(Char **))); 1730c80476e4SDavid E. O'Brien vec[0] = Strsave(lp); 1731c80476e4SDavid E. O'Brien vec[1] = NULL; 1732c80476e4SDavid E. O'Brien setq(strip(line), vec, &aliases, VAR_READWRITE); 1733c80476e4SDavid E. O'Brien break; 1734c80476e4SDavid E. O'Brien } 1735c80476e4SDavid E. O'Brien } 1736c80476e4SDavid E. O'Brien } 1737c80476e4SDavid E. O'Brien } 1738c80476e4SDavid E. O'Brien 1739c80476e4SDavid E. O'Brien eof: 1740c80476e4SDavid E. O'Brien (void) close(fd); 1741c80476e4SDavid E. O'Brien tw_cmd_free(); 1742c80476e4SDavid E. O'Brien if (gargv) 1743c80476e4SDavid E. O'Brien blkfree(gargv), gargv = 0; 1744c80476e4SDavid E. O'Brien resexit(oldexit); 1745c80476e4SDavid E. O'Brien } 1746c80476e4SDavid E. O'Brien #endif /* OBSOLETE */ 1747c80476e4SDavid E. O'Brien 1748c80476e4SDavid E. O'Brien 1749c80476e4SDavid E. O'Brien /* 1750c80476e4SDavid E. O'Brien * set the shell-level var to 1 or apply change to it. 1751c80476e4SDavid E. O'Brien */ 1752c80476e4SDavid E. O'Brien void 1753c80476e4SDavid E. O'Brien shlvl(val) 1754c80476e4SDavid E. O'Brien int val; 1755c80476e4SDavid E. O'Brien { 1756c80476e4SDavid E. O'Brien char *cp; 1757c80476e4SDavid E. O'Brien 1758c80476e4SDavid E. O'Brien if ((cp = getenv("SHLVL")) != NULL) { 1759c80476e4SDavid E. O'Brien 1760c80476e4SDavid E. O'Brien if (loginsh) 1761c80476e4SDavid E. O'Brien val = 1; 1762c80476e4SDavid E. O'Brien else 1763c80476e4SDavid E. O'Brien val += atoi(cp); 1764c80476e4SDavid E. O'Brien 1765c80476e4SDavid E. O'Brien if (val <= 0) { 1766c80476e4SDavid E. O'Brien if (adrof(STRshlvl) != NULL) 1767c80476e4SDavid E. O'Brien unsetv(STRshlvl); 1768c80476e4SDavid E. O'Brien Unsetenv(STRKSHLVL); 1769c80476e4SDavid E. O'Brien } 1770c80476e4SDavid E. O'Brien else { 1771c80476e4SDavid E. O'Brien Char buff[BUFSIZE]; 1772c80476e4SDavid E. O'Brien 1773c80476e4SDavid E. O'Brien (void) Itoa(val, buff, 0, 0); 1774c80476e4SDavid E. O'Brien set(STRshlvl, Strsave(buff), VAR_READWRITE); 1775c80476e4SDavid E. O'Brien tsetenv(STRKSHLVL, buff); 1776c80476e4SDavid E. O'Brien } 1777c80476e4SDavid E. O'Brien } 1778c80476e4SDavid E. O'Brien else { 1779c80476e4SDavid E. O'Brien set(STRshlvl, SAVE("1"), VAR_READWRITE); 1780c80476e4SDavid E. O'Brien tsetenv(STRKSHLVL, str2short("1")); 1781c80476e4SDavid E. O'Brien } 1782c80476e4SDavid E. O'Brien } 1783c80476e4SDavid E. O'Brien 1784c80476e4SDavid E. O'Brien 1785c80476e4SDavid E. O'Brien /* fixio(): 1786c80476e4SDavid E. O'Brien * Try to recover from a read error 1787c80476e4SDavid E. O'Brien */ 1788c80476e4SDavid E. O'Brien int 1789c80476e4SDavid E. O'Brien fixio(fd, e) 1790c80476e4SDavid E. O'Brien int fd, e; 1791c80476e4SDavid E. O'Brien { 1792c80476e4SDavid E. O'Brien switch (e) { 1793c80476e4SDavid E. O'Brien case -1: /* Make sure that the code is reachable */ 1794c80476e4SDavid E. O'Brien 1795c80476e4SDavid E. O'Brien #ifdef EWOULDBLOCK 1796c80476e4SDavid E. O'Brien case EWOULDBLOCK: 1797c80476e4SDavid E. O'Brien # define FDRETRY 1798c80476e4SDavid E. O'Brien #endif /* EWOULDBLOCK */ 1799c80476e4SDavid E. O'Brien 1800c80476e4SDavid E. O'Brien #if defined(POSIX) && defined(EAGAIN) 1801c80476e4SDavid E. O'Brien # if !defined(EWOULDBLOCK) || EWOULDBLOCK != EAGAIN 1802c80476e4SDavid E. O'Brien case EAGAIN: 1803c80476e4SDavid E. O'Brien # define FDRETRY 1804c80476e4SDavid E. O'Brien # endif /* !EWOULDBLOCK || EWOULDBLOCK != EAGAIN */ 1805c80476e4SDavid E. O'Brien #endif /* POSIX && EAGAIN */ 1806c80476e4SDavid E. O'Brien 1807c80476e4SDavid E. O'Brien e = 0; 1808c80476e4SDavid E. O'Brien #ifdef FDRETRY 1809c80476e4SDavid E. O'Brien # ifdef F_SETFL 1810c80476e4SDavid E. O'Brien /* 1811c80476e4SDavid E. O'Brien * Great! we have on suns 3 flavors and 5 names... 1812c80476e4SDavid E. O'Brien * I hope that will cover everything. 1813c80476e4SDavid E. O'Brien * I added some more defines... many systems have different defines. 1814c80476e4SDavid E. O'Brien * Rather than dealing with getting the right includes, we'll just 1815c80476e4SDavid E. O'Brien * cover all the known possibilities here. -- sterling@netcom.com 1816c80476e4SDavid E. O'Brien */ 1817c80476e4SDavid E. O'Brien # ifndef O_NONBLOCK 1818c80476e4SDavid E. O'Brien # define O_NONBLOCK 0 1819c80476e4SDavid E. O'Brien # endif /* O_NONBLOCK */ 1820c80476e4SDavid E. O'Brien # ifndef O_NDELAY 1821c80476e4SDavid E. O'Brien # define O_NDELAY 0 1822c80476e4SDavid E. O'Brien # endif /* O_NDELAY */ 1823c80476e4SDavid E. O'Brien # ifndef FNBIO 1824c80476e4SDavid E. O'Brien # define FNBIO 0 1825c80476e4SDavid E. O'Brien # endif /* FNBIO */ 1826c80476e4SDavid E. O'Brien # ifndef _FNBIO 1827c80476e4SDavid E. O'Brien # define _FNBIO 0 1828c80476e4SDavid E. O'Brien # endif /* _FNBIO */ 1829c80476e4SDavid E. O'Brien # ifndef FNONBIO 1830c80476e4SDavid E. O'Brien # define FNONBIO 0 1831c80476e4SDavid E. O'Brien # endif /* FNONBIO */ 1832c80476e4SDavid E. O'Brien # ifndef FNONBLOCK 1833c80476e4SDavid E. O'Brien # define FNONBLOCK 0 1834c80476e4SDavid E. O'Brien # endif /* FNONBLOCK */ 1835c80476e4SDavid E. O'Brien # ifndef _FNONBLOCK 1836c80476e4SDavid E. O'Brien # define _FNONBLOCK 0 1837c80476e4SDavid E. O'Brien # endif /* _FNONBLOCK */ 1838c80476e4SDavid E. O'Brien # ifndef FNDELAY 1839c80476e4SDavid E. O'Brien # define FNDELAY 0 1840c80476e4SDavid E. O'Brien # endif /* FNDELAY */ 1841c80476e4SDavid E. O'Brien # ifndef _FNDELAY 1842c80476e4SDavid E. O'Brien # define _FNDELAY 0 1843c80476e4SDavid E. O'Brien # endif /* _FNDELAY */ 1844c80476e4SDavid E. O'Brien # ifndef FNDLEAY /* Some linux versions have this typo */ 1845c80476e4SDavid E. O'Brien # define FNDLEAY 0 1846c80476e4SDavid E. O'Brien # endif /* FNDLEAY */ 1847c80476e4SDavid E. O'Brien if ((e = fcntl(fd, F_GETFL, 0)) == -1) 1848c80476e4SDavid E. O'Brien return -1; 1849c80476e4SDavid E. O'Brien 1850c80476e4SDavid E. O'Brien e &= ~(O_NDELAY|O_NONBLOCK|FNBIO|_FNBIO|FNONBIO|FNONBLOCK|_FNONBLOCK| 1851c80476e4SDavid E. O'Brien FNDELAY|_FNDELAY|FNDLEAY); /* whew! */ 1852c80476e4SDavid E. O'Brien if (fcntl(fd, F_SETFL, e) == -1) 1853c80476e4SDavid E. O'Brien return -1; 1854c80476e4SDavid E. O'Brien else 1855c80476e4SDavid E. O'Brien e = 1; 1856c80476e4SDavid E. O'Brien # endif /* F_SETFL */ 1857c80476e4SDavid E. O'Brien 1858c80476e4SDavid E. O'Brien # ifdef FIONBIO 1859c80476e4SDavid E. O'Brien e = 0; 1860c80476e4SDavid E. O'Brien if (ioctl(fd, FIONBIO, (ioctl_t) &e) == -1) 1861c80476e4SDavid E. O'Brien return -1; 1862c80476e4SDavid E. O'Brien else 1863c80476e4SDavid E. O'Brien e = 1; 1864c80476e4SDavid E. O'Brien # endif /* FIONBIO */ 1865c80476e4SDavid E. O'Brien 1866c80476e4SDavid E. O'Brien #endif /* FDRETRY */ 1867c80476e4SDavid E. O'Brien return e ? 0 : -1; 1868c80476e4SDavid E. O'Brien 1869c80476e4SDavid E. O'Brien case EINTR: 1870c80476e4SDavid E. O'Brien return 0; 1871c80476e4SDavid E. O'Brien 1872c80476e4SDavid E. O'Brien default: 1873c80476e4SDavid E. O'Brien return -1; 1874c80476e4SDavid E. O'Brien } 1875c80476e4SDavid E. O'Brien } 1876c80476e4SDavid E. O'Brien 1877c80476e4SDavid E. O'Brien /* collate(): 1878c80476e4SDavid E. O'Brien * String collation 1879c80476e4SDavid E. O'Brien */ 1880c80476e4SDavid E. O'Brien int 1881c80476e4SDavid E. O'Brien collate(a, b) 1882c80476e4SDavid E. O'Brien const Char *a; 1883c80476e4SDavid E. O'Brien const Char *b; 1884c80476e4SDavid E. O'Brien { 1885c80476e4SDavid E. O'Brien int rv; 1886c80476e4SDavid E. O'Brien #ifdef SHORT_STRINGS 1887c80476e4SDavid E. O'Brien /* This strips the quote bit as a side effect */ 1888c80476e4SDavid E. O'Brien char *sa = strsave(short2str(a)); 1889c80476e4SDavid E. O'Brien char *sb = strsave(short2str(b)); 1890c80476e4SDavid E. O'Brien #else 1891c80476e4SDavid E. O'Brien char *sa = strip(strsave(a)); 1892c80476e4SDavid E. O'Brien char *sb = strip(strsave(b)); 1893c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */ 1894c80476e4SDavid E. O'Brien 1895c80476e4SDavid E. O'Brien #if defined(NLS) && !defined(NOSTRCOLL) 1896c80476e4SDavid E. O'Brien errno = 0; /* strcoll sets errno, another brain-damage */ 1897c80476e4SDavid E. O'Brien 1898c80476e4SDavid E. O'Brien rv = strcoll(sa, sb); 1899c80476e4SDavid E. O'Brien 1900c80476e4SDavid E. O'Brien /* 1901c80476e4SDavid E. O'Brien * We should be checking for errno != 0, but some systems 1902c80476e4SDavid E. O'Brien * forget to reset errno to 0. So we only check for the 1903c80476e4SDavid E. O'Brien * only documented valid errno value for strcoll [EINVAL] 1904c80476e4SDavid E. O'Brien */ 1905c80476e4SDavid E. O'Brien if (errno == EINVAL) { 1906c80476e4SDavid E. O'Brien xfree((ptr_t) sa); 1907c80476e4SDavid E. O'Brien xfree((ptr_t) sb); 1908c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, "strcoll", strerror(errno)); 1909c80476e4SDavid E. O'Brien } 1910c80476e4SDavid E. O'Brien #else 1911c80476e4SDavid E. O'Brien rv = strcmp(sa, sb); 1912c80476e4SDavid E. O'Brien #endif /* NLS && !NOSTRCOLL */ 1913c80476e4SDavid E. O'Brien 1914c80476e4SDavid E. O'Brien xfree((ptr_t) sa); 1915c80476e4SDavid E. O'Brien xfree((ptr_t) sb); 1916c80476e4SDavid E. O'Brien 1917c80476e4SDavid E. O'Brien return rv; 1918c80476e4SDavid E. O'Brien } 1919c80476e4SDavid E. O'Brien 1920c80476e4SDavid E. O'Brien #ifdef HASHBANG 1921c80476e4SDavid E. O'Brien /* 1922c80476e4SDavid E. O'Brien * From: peter@zeus.dialix.oz.au (Peter Wemm) 1923c80476e4SDavid E. O'Brien * If exec() fails look first for a #! [word] [word] .... 1924c80476e4SDavid E. O'Brien * If it is, splice the header into the argument list and retry. 1925c80476e4SDavid E. O'Brien */ 1926c80476e4SDavid E. O'Brien #define HACKBUFSZ 1024 /* Max chars in #! vector */ 1927c80476e4SDavid E. O'Brien #define HACKVECSZ 128 /* Max words in #! vector */ 1928c80476e4SDavid E. O'Brien int 1929c80476e4SDavid E. O'Brien hashbang(fd, vp) 1930c80476e4SDavid E. O'Brien int fd; 1931c80476e4SDavid E. O'Brien Char ***vp; 1932c80476e4SDavid E. O'Brien { 1933c80476e4SDavid E. O'Brien unsigned char lbuf[HACKBUFSZ]; 1934c80476e4SDavid E. O'Brien char *sargv[HACKVECSZ]; 1935c80476e4SDavid E. O'Brien unsigned char *p, *ws; 1936c80476e4SDavid E. O'Brien int sargc = 0; 1937c80476e4SDavid E. O'Brien #ifdef WINNT 1938c80476e4SDavid E. O'Brien int fw = 0; /* found at least one word */ 1939c80476e4SDavid E. O'Brien int first_word = 0; 1940c80476e4SDavid E. O'Brien #endif /* WINNT */ 1941c80476e4SDavid E. O'Brien 1942c80476e4SDavid E. O'Brien if (read(fd, (char *) lbuf, HACKBUFSZ) <= 0) 1943c80476e4SDavid E. O'Brien return -1; 1944c80476e4SDavid E. O'Brien 1945c80476e4SDavid E. O'Brien ws = 0; /* word started = 0 */ 1946c80476e4SDavid E. O'Brien 1947c80476e4SDavid E. O'Brien for (p = lbuf; p < &lbuf[HACKBUFSZ]; ) 1948c80476e4SDavid E. O'Brien switch (*p) { 1949c80476e4SDavid E. O'Brien case ' ': 1950c80476e4SDavid E. O'Brien case '\t': 1951c80476e4SDavid E. O'Brien #ifdef WINNT 1952c80476e4SDavid E. O'Brien case '\r': 1953c80476e4SDavid E. O'Brien #endif /* WINNT */ 1954c80476e4SDavid E. O'Brien if (ws) { /* a blank after a word.. save it */ 1955c80476e4SDavid E. O'Brien *p = '\0'; 1956c80476e4SDavid E. O'Brien #ifndef WINNT 1957c80476e4SDavid E. O'Brien if (sargc < HACKVECSZ - 1) 1958c80476e4SDavid E. O'Brien sargv[sargc++] = ws; 1959c80476e4SDavid E. O'Brien ws = NULL; 1960c80476e4SDavid E. O'Brien #else /* WINNT */ 1961c80476e4SDavid E. O'Brien if (sargc < HACKVECSZ - 1) { 1962c80476e4SDavid E. O'Brien sargv[sargc] = first_word ? NULL: hb_subst(ws); 1963c80476e4SDavid E. O'Brien if (sargv[sargc] == NULL) 1964c80476e4SDavid E. O'Brien sargv[sargc] = ws; 1965c80476e4SDavid E. O'Brien sargc++; 1966c80476e4SDavid E. O'Brien } 1967c80476e4SDavid E. O'Brien ws = NULL; 1968c80476e4SDavid E. O'Brien fw = 1; 1969c80476e4SDavid E. O'Brien first_word = 1; 1970c80476e4SDavid E. O'Brien #endif /* WINNT */ 1971c80476e4SDavid E. O'Brien } 1972c80476e4SDavid E. O'Brien p++; 1973c80476e4SDavid E. O'Brien continue; 1974c80476e4SDavid E. O'Brien 1975c80476e4SDavid E. O'Brien case '\0': /* Whoa!! what the hell happened */ 1976c80476e4SDavid E. O'Brien return -1; 1977c80476e4SDavid E. O'Brien 1978c80476e4SDavid E. O'Brien case '\n': /* The end of the line. */ 1979c80476e4SDavid E. O'Brien if ( 1980c80476e4SDavid E. O'Brien #ifdef WINNT 1981c80476e4SDavid E. O'Brien fw || 1982c80476e4SDavid E. O'Brien #endif /* WINNT */ 1983c80476e4SDavid E. O'Brien ws) { /* terminate the last word */ 1984c80476e4SDavid E. O'Brien *p = '\0'; 1985c80476e4SDavid E. O'Brien #ifndef WINNT 1986c80476e4SDavid E. O'Brien if (sargc < HACKVECSZ - 1) 1987c80476e4SDavid E. O'Brien sargv[sargc++] = ws; 1988c80476e4SDavid E. O'Brien #else /* WINNT */ 1989c80476e4SDavid E. O'Brien if (sargc < HACKVECSZ - 1) { /* deal with the 1-word case */ 1990c80476e4SDavid E. O'Brien sargv[sargc] = first_word? NULL : hb_subst(ws); 1991c80476e4SDavid E. O'Brien if (sargv[sargc] == NULL) 1992c80476e4SDavid E. O'Brien sargv[sargc] = ws; 1993c80476e4SDavid E. O'Brien sargc++; 1994c80476e4SDavid E. O'Brien } 1995c80476e4SDavid E. O'Brien #endif /* !WINNT */ 1996c80476e4SDavid E. O'Brien } 1997c80476e4SDavid E. O'Brien sargv[sargc] = NULL; 1998c80476e4SDavid E. O'Brien ws = NULL; 1999c80476e4SDavid E. O'Brien if (sargc > 0) { 2000c80476e4SDavid E. O'Brien *vp = blk2short(sargv); 2001c80476e4SDavid E. O'Brien return 0; 2002c80476e4SDavid E. O'Brien } 2003c80476e4SDavid E. O'Brien else 2004c80476e4SDavid E. O'Brien return -1; 2005c80476e4SDavid E. O'Brien 2006c80476e4SDavid E. O'Brien default: 2007c80476e4SDavid E. O'Brien if (!ws) /* Start a new word? */ 2008c80476e4SDavid E. O'Brien ws = p; 2009c80476e4SDavid E. O'Brien p++; 2010c80476e4SDavid E. O'Brien break; 2011c80476e4SDavid E. O'Brien } 2012c80476e4SDavid E. O'Brien return -1; 2013c80476e4SDavid E. O'Brien } 2014c80476e4SDavid E. O'Brien #endif /* HASHBANG */ 2015c80476e4SDavid E. O'Brien 2016c80476e4SDavid E. O'Brien #ifdef REMOTEHOST 2017c80476e4SDavid E. O'Brien 2018c80476e4SDavid E. O'Brien static sigret_t 2019c80476e4SDavid E. O'Brien palarm(snum) 2020c80476e4SDavid E. O'Brien int snum; 2021c80476e4SDavid E. O'Brien { 2022c80476e4SDavid E. O'Brien USE(snum); 2023c80476e4SDavid E. O'Brien #ifdef UNRELSIGS 2024c80476e4SDavid E. O'Brien if (snum) 2025c80476e4SDavid E. O'Brien (void) sigset(snum, SIG_IGN); 2026c80476e4SDavid E. O'Brien #endif /* UNRELSIGS */ 2027c80476e4SDavid E. O'Brien (void) alarm(0); 2028c80476e4SDavid E. O'Brien reset(); 2029c80476e4SDavid E. O'Brien 2030c80476e4SDavid E. O'Brien #ifndef SIGVOID 2031c80476e4SDavid E. O'Brien return (snum); 2032c80476e4SDavid E. O'Brien #endif 2033c80476e4SDavid E. O'Brien } 2034c80476e4SDavid E. O'Brien 2035c80476e4SDavid E. O'Brien 2036c80476e4SDavid E. O'Brien static void 2037c80476e4SDavid E. O'Brien getremotehost() 2038c80476e4SDavid E. O'Brien { 2039c80476e4SDavid E. O'Brien const char *host = NULL; 2040c80476e4SDavid E. O'Brien struct hostent* hp; 2041c80476e4SDavid E. O'Brien struct sockaddr_in saddr; 2042c80476e4SDavid E. O'Brien int len = sizeof(struct sockaddr_in); 2043c80476e4SDavid E. O'Brien #if defined(UTHOST) && !defined(HAVENOUTMP) 2044c80476e4SDavid E. O'Brien char *sptr = NULL; 2045c80476e4SDavid E. O'Brien #endif 2046c80476e4SDavid E. O'Brien 2047c80476e4SDavid E. O'Brien if (getpeername(SHIN, (struct sockaddr *) &saddr, &len) != -1) { 2048c80476e4SDavid E. O'Brien #if 0 2049c80476e4SDavid E. O'Brien if ((hp = gethostbyaddr((char *)&saddr.sin_addr, sizeof(struct in_addr), 2050c80476e4SDavid E. O'Brien AF_INET)) != NULL) 2051c80476e4SDavid E. O'Brien host = hp->h_name; 2052c80476e4SDavid E. O'Brien else 2053c80476e4SDavid E. O'Brien #endif 2054c80476e4SDavid E. O'Brien host = inet_ntoa(saddr.sin_addr); 2055c80476e4SDavid E. O'Brien } 2056c80476e4SDavid E. O'Brien #if defined(UTHOST) && !defined(HAVENOUTMP) 2057c80476e4SDavid E. O'Brien else { 2058c80476e4SDavid E. O'Brien char *ptr; 2059c80476e4SDavid E. O'Brien char *name = utmphost(); 2060c80476e4SDavid E. O'Brien /* Avoid empty names and local X displays */ 2061c80476e4SDavid E. O'Brien if (name != NULL && *name != '\0' && *name != ':') { 2062c80476e4SDavid E. O'Brien /* Look for host:display.screen */ 2063c80476e4SDavid E. O'Brien if ((sptr = strchr(name, ':')) != NULL) 2064c80476e4SDavid E. O'Brien *sptr = '\0'; 2065c80476e4SDavid E. O'Brien /* Leave IP address as is */ 2066c80476e4SDavid E. O'Brien if (isdigit(*name)) 2067c80476e4SDavid E. O'Brien host = name; 2068c80476e4SDavid E. O'Brien else { 2069c80476e4SDavid E. O'Brien if (sptr != name) { 2070c80476e4SDavid E. O'Brien if ((hp = gethostbyname(name)) == NULL) { 2071c80476e4SDavid E. O'Brien /* Try again eliminating the trailing domain */ 2072c80476e4SDavid E. O'Brien if ((ptr = strchr(name, '.')) != NULL) { 2073c80476e4SDavid E. O'Brien *ptr = '\0'; 2074c80476e4SDavid E. O'Brien if ((hp = gethostbyname(name)) != NULL) 2075c80476e4SDavid E. O'Brien host = hp->h_name; 2076c80476e4SDavid E. O'Brien *ptr = '.'; 2077c80476e4SDavid E. O'Brien } 2078c80476e4SDavid E. O'Brien } 2079c80476e4SDavid E. O'Brien else 2080c80476e4SDavid E. O'Brien host = hp->h_name; 2081c80476e4SDavid E. O'Brien } 2082c80476e4SDavid E. O'Brien } 2083c80476e4SDavid E. O'Brien } 2084c80476e4SDavid E. O'Brien } 2085c80476e4SDavid E. O'Brien #endif 2086c80476e4SDavid E. O'Brien 2087c80476e4SDavid E. O'Brien if (host) 2088c80476e4SDavid E. O'Brien tsetenv(STRREMOTEHOST, str2short(host)); 2089c80476e4SDavid E. O'Brien 2090c80476e4SDavid E. O'Brien #if defined(UTHOST) && !defined(HAVENOUTMP) 2091c80476e4SDavid E. O'Brien if (sptr) 2092c80476e4SDavid E. O'Brien *sptr = ':'; 2093c80476e4SDavid E. O'Brien #endif 2094c80476e4SDavid E. O'Brien } 2095c80476e4SDavid E. O'Brien 2096c80476e4SDavid E. O'Brien 2097c80476e4SDavid E. O'Brien /* 2098c80476e4SDavid E. O'Brien * From: <lesv@ppvku.ericsson.se> (Lennart Svensson) 2099c80476e4SDavid E. O'Brien */ 2100c80476e4SDavid E. O'Brien void 2101c80476e4SDavid E. O'Brien remotehost() 2102c80476e4SDavid E. O'Brien { 2103c80476e4SDavid E. O'Brien /* Don't get stuck if the resolver does not work! */ 2104c80476e4SDavid E. O'Brien signalfun_t osig = sigset(SIGALRM, palarm); 2105c80476e4SDavid E. O'Brien 2106c80476e4SDavid E. O'Brien jmp_buf_t osetexit; 2107c80476e4SDavid E. O'Brien getexit(osetexit); 2108c80476e4SDavid E. O'Brien 2109c80476e4SDavid E. O'Brien (void) alarm(2); 2110c80476e4SDavid E. O'Brien 2111c80476e4SDavid E. O'Brien if (setexit() == 0) 2112c80476e4SDavid E. O'Brien getremotehost(); 2113c80476e4SDavid E. O'Brien 2114c80476e4SDavid E. O'Brien resexit(osetexit); 2115c80476e4SDavid E. O'Brien 2116c80476e4SDavid E. O'Brien (void) alarm(0); 2117c80476e4SDavid E. O'Brien (void) sigset(SIGALRM, osig); 2118c80476e4SDavid E. O'Brien 2119c80476e4SDavid E. O'Brien #ifdef YPBUGS 2120c80476e4SDavid E. O'Brien /* From: casper@fwi.uva.nl (Casper H.S. Dik), for Solaris 2.3 */ 2121c80476e4SDavid E. O'Brien fix_yp_bugs(); 2122c80476e4SDavid E. O'Brien #endif /* YPBUGS */ 2123c80476e4SDavid E. O'Brien 2124c80476e4SDavid E. O'Brien } 2125c80476e4SDavid E. O'Brien #endif /* REMOTEHOST */ 2126