usr/src/cmd/sh/main.c
author chin
Tue, 13 Sep 2005 20:06:11 -0700
changeset 528 b9644e88fdfe
parent 527 cb400a149efa
child 2256 a9ca1c675600
permissions -rw-r--r--
6268998 cmd/sh and gcc don't get along (fix cstyle) 6277636 *sh* can crash if it creates too many temporary files (fix cstyle)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * UNIX shell
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include	"defs.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include	"sym.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include	"timeout.h"
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    41
#include	<stdio.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include	<sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include	<sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include	<sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include	"dup.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include	"sh_policy.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#ifdef RES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include	<sgtty.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
pid_t mypid, mypgid, mysid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
static BOOL	beenhere = FALSE;
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    55
unsigned char	tmpout[TMPOUTSZ];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
struct fileblk	stdfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
struct fileblk *standin = &stdfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
int mailchk = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static unsigned char	*mailp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static long	*mod_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static BOOL login_shell = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#if vax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
char **execargs = (char **)(0x7ffffffc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#if pdp11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
char **execargs = (char **)(-2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    73
static void	exfile();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
extern unsigned char 	*simple();
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    75
static void Ldup(int, int);
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    76
void settmp(void);
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    77
void chkmail(void);
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    78
void setmail(unsigned char *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    80
int
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    81
main(int c, char *v[], char *e[])
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
{
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    83
	int		rflag = ttyflg;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	int		rsflag = 1;	/* local restricted flag */
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
    85
	unsigned char	*flagc = flagadr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	struct namnod	*n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	mypid = getpid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	mypgid = getpgid(mypid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	mysid = getsid(mypid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	 * Do locale processing only if /usr is mounted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	localedir_exists = (access(localedir, F_OK) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	 * initialize storage allocation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if (stakbot == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	addblok((unsigned)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	 * If the first character of the last path element of v[0] is "-"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	 * (ex. -sh, or /bin/-sh), this is a login shell
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	if (*simple(v[0]) == '-') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		signal(SIGXCPU, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		signal(SIGXFSZ, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		 * As the previous comment states, this is a login shell.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		 * Therefore, we set the login_shell flag to explicitly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		 * indicate this condition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		login_shell = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	stdsigs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	 * set names from userenv
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	setup_env();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	 * LC_MESSAGES is set here so that early error messages will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	 * come out in the right style.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	 * Note that LC_CTYPE is done later on and is *not*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	 * taken from the previous environ
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	 * Do locale processing only if /usr is mounted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	if (localedir_exists)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
#if !defined(TEXT_DOMAIN)	/* Should be defined by cc -D */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
#define	TEXT_DOMAIN "SYS_TEST"	/* Use this only if it weren't */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	(void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	 * This is a profile shell if the simple name of argv[0] is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	 * pfsh or -pfsh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	if (c > 0 && (eq("pfsh", simple(*v)) || eq("-pfsh", simple(*v)))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		flags |= pfshflg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		secpolicy_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	 * 'rsflag' is zero if SHELL variable is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	 *  set in environment and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	 *  the simple file part of the value.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	 *  is rsh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	 */
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   161
	if (n = findnam("SHELL")) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		if (eq("rsh", simple(n->namval)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			rsflag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	 * a shell is also restricted if the simple name of argv(0) is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	 * rsh or -rsh in its simple name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
#ifndef RES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	if (c > 0 && (eq("rsh", simple(*v)) || eq("-rsh", simple(*v))))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		rflag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	if (eq("jsh", simple(*v)) || eq("-jsh", simple(*v)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		flags |= monitorflg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	hcreate();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	set_dotpath();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	 * look for options
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	 * dolc is $#
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	dolc = options(c, v);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   191
	if (dolc < 2) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		flags |= stdflg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			while (*flagc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
				flagc++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
			*flagc++ = STDFLG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			*flagc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	if ((flags & stdflg) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		dolc--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	if ((flags & privflg) == 0) {
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   205
		uid_t euid;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   206
		gid_t egid;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   207
		uid_t ruid;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   208
		gid_t rgid;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		 * Determine all of the user's id #'s for this process and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		 * then decide if this shell is being entered as a result
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		 * of a fork/exec.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		 * If the effective uid/gid do NOT match and the euid/egid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		 * is < 100 and the egid is NOT 1, reset the uid and gid to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		 * the user originally calling this process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		euid = geteuid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		ruid = getuid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		egid = getegid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		rgid = getgid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		if ((euid != ruid) && (euid < 100))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			setuid(ruid);   /* reset the uid to the orig user */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		if ((egid != rgid) && ((egid < 100) && (egid != 1)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			setgid(rgid);   /* reset the gid to the orig user */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	dolv = (unsigned char **)v + c - dolc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	dolc--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * return here for shell file execution
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 * but not for parenthesis subshells
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	if (setjmp(subshell)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		freejobs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		flags |= subsh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	 * number of positional parameters
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	replace(&cmdadr, dolv[0]);	/* cmdadr is $0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	 * set pidname '$$'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	assnum(&pidadr, (long)mypid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	 * set up temp file names
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	settmp();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	 * default internal field separators
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	 * Do not allow importing of IFS from parent shell.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	 * setup_env() may have set anything from parent shell to IFS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	 * Always set the default ifs to IFS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	 */
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   261
	assign(&ifsnod, (unsigned char *)sptbnl);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	dfault(&mchknod, MAILCHECK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	mailchk = stoi(mchknod.namval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	/* initialize OPTIND for getopt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	n = lookup("OPTIND");
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   269
	assign(n, (unsigned char *)"1");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	 * make sure that option parsing starts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	 * at first character
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	_sp = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	/* initialize multibyte information */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	setwidth();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	if ((beenhere++) == FALSE)	/* ? profile */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		if ((login_shell == TRUE) && (flags & privflg) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
			/* system profile */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
#ifndef RES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
			if ((input = pathopen(nullstr, sysprofile)) >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
				exfile(rflag);		/* file exists */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
			/* user profile */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   293
			if ((input = pathopen(homenod.namval, profile)) >= 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
				exfile(rflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
				flags &= ~ttyflg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		if (rsflag == 0 || rflag == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			if ((flags & rshflg) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
				while (*flagc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
					flagc++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
				*flagc++ = 'r';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
				*flagc = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
			flags |= rshflg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		 * open input file if specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		 */
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   311
		if (comdiv) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
			estabf(comdiv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
			input = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
			if (flags & stdflg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
				input = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			 * If the command file specified by 'cmdadr'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			 * doesn't exist, chkopen() will fail calling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			 * exitsh(). If this is a login shell and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			 * the $HOME/.profile file does not exist, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
			 * above statement "flags &= ~ttyflg" does not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
			 * get executed and this makes exitsh() call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
			 * longjmp() instead of exiting. longjmp() will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			 * return to the location specified by the last
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
			 * active jmpbuffer, which is the one set up in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
			 * the function exfile() called after the system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			 * profile file is executed (see lines above).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
			 * This would cause an infinite loop, because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
			 * chkopen() will continue to fail and exitsh()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
			 * to call longjmp(). To make exitsh() exit instead
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
			 * of calling longjmp(), we then set the flag forcexit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
			 * at this stage.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
				flags |= forcexit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
				input = chkopen(cmdadr, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
				flags &= ~forcexit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
#ifdef ACCT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
			if (input != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
				preacct(cmdadr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			comdiv--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
#ifdef pdp11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		*execargs = (char *)dolv;	/* for `ps' cmd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	exfile(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	done(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   361
static void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   362
exfile(int prof)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	time_t	mailtime = 0;	/* Must not be a register variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	time_t 	curtime = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	 * move input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	 */
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   370
	if (input > 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		Ldup(input, INIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		input = INIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	setmode(prof);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   378
	if (setjmp(errshell) && prof) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		close(input);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		(void) endjobs(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	 * error return here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	loopcnt = peekc = peekn = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	fndef = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	nohash = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	iopend = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	if (input >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		initf(input);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	 * command loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	 */
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   397
	for (;;) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		tdystak(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		stakchk();	/* may reduce sbrk */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		exitset();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   402
		if ((flags & prompt) && standin->fstak == 0 && !eof) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   404
			if (mailp) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
				time(&curtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   407
				if ((curtime - mailtime) >= mailchk) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
					chkmail();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
					mailtime = curtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			/* necessary to print jobs in a timely manner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
			if (trapnote & TRAPSET)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
				chktrap();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
			prs(ps1nod.namval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
#ifdef TIME_OUT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
			alarm(TIMEOUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		trapnote = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		peekc = readwc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		if (eof) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
			if (endjobs(JOB_STOPPED))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
			eof = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
#ifdef TIME_OUT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		alarm(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		{
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   438
			struct trenod *t;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
			t = cmd(NL, MTFLG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
			if (t == NULL && flags & ttyflg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
				freejobs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
				execute(t, 0, eflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
		eof |= (flags & oneflg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   451
void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   452
chkpr(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	if ((flags & prompt) && standin->fstak == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		prs(ps2nod.namval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   458
void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   459
settmp(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
{
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   461
	int len;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	serial = 0;
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   463
	if ((len = snprintf((char *)tmpout, TMPOUTSZ, "/tmp/sh%u", mypid)) >=
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   464
	    TMPOUTSZ) {
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   465
		/*
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   466
		 * TMPOUTSZ should be big enough, but if it isn't,
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   467
		 * we'll at least try to create tmp files with
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   468
		 * a truncated tmpfile name at tmpout.
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   469
		 */
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   470
		tmpout_offset = TMPOUTSZ - 1;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   471
	} else {
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   472
		tmpout_offset = len;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   473
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   476
static void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   477
Ldup(int fa, int fb)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
#ifdef RES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	dup(fa | DUPFLG, fb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	close(fa);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	ioctl(fb, FIOCLEX, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	if (fa >= 0) {
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   488
		if (fa != fb) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
			close(fb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
			fcntl(fa, 0, fb); /* normal dup */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			close(fa);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		fcntl(fb, 2, 1);	/* autoclose for fb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   499
void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   500
chkmail(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
{
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   502
	unsigned char 	*s = mailp;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   503
	unsigned char	*save;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	long	*ptr = mod_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	unsigned char	*start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	BOOL	flg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	struct stat	statb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	while (*s) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		start = s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		save = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		flg = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		while (*s) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
			if (*s != COLON) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
				if (*s == '%' && save == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
					save = s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
				s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
				flg = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
				*s = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		if (save)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
			*save = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		if (*start && stat((const char *)start, &statb) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
			if (statb.st_size && *ptr &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
			    statb.st_mtime != *ptr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
				if (save) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
					prs(save+1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
					newline();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
					prs(mailmsg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
			*ptr = statb.st_mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		} else if (*ptr == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
			*ptr = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		if (save)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
			*save = '%';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
		if (flg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
			*s++ = COLON;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		ptr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   554
void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   555
setmail(unsigned char *mailpath)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
{
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   557
	unsigned char	*s = mailpath;
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   558
	int 		cnt = 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	long	*ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	free(mod_time);
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   563
	if (mailp = mailpath) {
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   564
		while (*s) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
			if (*s == COLON)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
				cnt += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
			s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		ptr = mod_time = (long *)alloc(sizeof (long) * cnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
528
b9644e88fdfe 6268998 cmd/sh and gcc don't get along (fix cstyle)
chin
parents: 527
diff changeset
   573
		while (cnt) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
			*ptr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			ptr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			cnt--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
setwidth()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	unsigned char *name = lookup("LC_CTYPE")->namval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	if (!name || !*name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		name = lookup("LANG")->namval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	 * Do locale processing only if /usr is mounted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	if (localedir_exists) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		if (!name || !*name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
			(void) setlocale(LC_CTYPE, "C");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
			(void) setlocale(LC_CTYPE, (const char *)name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
527
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   598
void
cb400a149efa 6268998 cmd/sh and gcc don't get along
chin
parents: 0
diff changeset
   599
setmode(int prof)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	 * decide whether interactive
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	if ((flags & intflg) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	    ((flags&oneflg) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	    isatty(output) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	    isatty(input)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		dfault(&ps1nod, (geteuid() ? stdprompt : supprompt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
		dfault(&ps2nod, readmsg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		flags |= ttyflg | prompt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		if (mailpnod.namflg != N_DEFAULT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
			setmail(mailpnod.namval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
			setmail(mailnod.namval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		startjobs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
		flags |= prof;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		flags &= ~prompt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
 * A generic call back routine to output error messages from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
 * policy backing functions called by pfsh.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
 * msg must contain '\n' if a new line is to be printed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
secpolicy_print(int level, const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	switch (level) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	case SECPOLICY_WARN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		prs(msg);	/* prs() does gettext() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	case SECPOLICY_ERROR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
		error(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
}