usr/src/cmd/mailx/names.c
author Robert Mustacchi <rm@joyent.com>
Thu, 30 Apr 2015 20:01:26 +0100
changeset 14275 704102d4c169
parent 18 7e2dc246c4e2
permissions -rw-r--r--
5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
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
 */
18
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    22
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    23
/*
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    24
 * Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    25
 * Use is subject to license terms.
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    26
 */
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
    27
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*	  All Rights Reserved  	*/
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
 * University Copyright- Copyright (c) 1982, 1986, 1988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * The Regents of the University of California
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * All Rights Reserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * University Acknowledgment- Portions of this document are derived from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * software developed by the University of California, Berkeley, and its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * contributors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * mailx -- a modified version of a University of California at Berkeley
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *	mail program
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * Handle name lists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include "rcv.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
static struct name	*nalloc(char str[]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
static int		isfileaddr(char *name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
static int		lengthof(struct name *name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
static struct name	*gexpand(struct name *nlist, struct grouphead *gh, int metoo, int arg_ntype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static char		*norm(register char *user, register char *ubuf, int nbangs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static struct name	*put(struct name *list, struct name *node);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * Allocate a single element of a name list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 * initialize its name field to the passed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 * name and return it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
static struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
nalloc(char str[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	np = (struct name *) salloc(sizeof *np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	np->n_flink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	np->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	np->n_type = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	np->n_full = savestr(str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	np->n_name = skin(np->n_full);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	return(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 * Find the tail of a list and return it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
tailof(struct name *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	np = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	if (np == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		return(NIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	while (np->n_flink != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	return(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
}
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
 * Extract a list of names from a line,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 * and make a list of names from it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 * Return the list or NIL if none found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
extract(char line[], int arg_ntype)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	short ntype = (short)arg_ntype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	register char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	register struct name *top, *np, *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	char nbuf[BUFSIZ], abuf[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	int comma;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	if (line == NOSTR || strlen(line) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		return(NIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	comma = docomma(line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	top = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	np = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	cp = line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	while ((cp = yankword(cp, nbuf, sizeof (nbuf), comma)) != NOSTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		if (np != NIL && equal(nbuf, "at")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
			nstrcpy(abuf, sizeof (abuf), nbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
			if ((cp = yankword(cp, nbuf, sizeof (nbuf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
				comma)) == NOSTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
				nstrcpy(nbuf, sizeof (nbuf), abuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
				goto normal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
			snprintf(abuf, sizeof (abuf), "%s@%s", np->n_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
				nbuf); 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
			np->n_name = savestr(abuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
normal:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		t = nalloc(nbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		t->n_type = ntype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		if (top == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			top = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			np->n_flink = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		t->n_blink = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		np = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	return(top);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
 * Turn a list of names into a string of the same names.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
detract(register struct name *np, int ntype)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	register int s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	register char *cp, *top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	register struct name *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	if (np == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		return(NOSTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	s = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	for (p = np; p != NIL; p = p->n_flink) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		if ((ntype && (p->n_type & GMASK) != ntype)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		 || (p->n_type & GDEL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		s += strlen(p->n_full) + 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	if (s == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		return(NOSTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	top = (char *)salloc((unsigned)(++s));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	cp = top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	for (p = np; p != NIL; p = p->n_flink) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		if ((ntype && (p->n_type & GMASK) != ntype)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		 || (p->n_type & GDEL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		cp = copy(p->n_full, cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		*cp++ = ',';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		*cp++ = ' ';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	*cp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	return(top);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
outpre(struct name *to)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	for (np = to; np; np = np->n_flink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		if (isfileaddr(np->n_name))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			np->n_type |= GDEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	return to;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 * For each recipient in the passed name list with a /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 * in the name, append the message to the end of the named file
14275
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   194
 * and remove them from the recipient list.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 * Recipients whose name begins with | are piped through the given
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
 * program and removed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
outof(struct name *names, FILE *fo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	register int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	time_t now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	char *date, *fname, *shell;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	FILE *fout, *fin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	int ispipe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	int nout = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	int fd = 0; 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
#ifdef preSVr4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	char line[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
14275
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   215
	if (value("expandaddr") == NOSTR)
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   216
		return (nout);
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   217
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	for (np = names; np != NIL; np = np->n_flink) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		if (!isfileaddr(np->n_name) && np->n_name[0] != '|')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		nout++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		ispipe = np->n_name[0] == '|';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		if (ispipe)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			fname = np->n_name+1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			fname = safeexpand(np->n_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		 * See if we have copied the complete message out yet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		 * If not, do so.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		if (image < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
			fd = open(tempEdit, O_CREAT|O_EXCL|O_APPEND|O_WRONLY,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
					0600);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			if ((fd  < 0) && (errno == EEXIST)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
				if ((fd = open(tempEdit, O_APPEND|O_WRONLY,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
						0600)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
					perror(tempEdit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
					senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
					goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
			if ((fout = fdopen(fd, "a")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				perror(tempEdit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
				goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
			image = open(tempEdit, O_RDWR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			unlink(tempEdit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			if (image < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
				perror(tempEdit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
				senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
				rewind(fo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
				time(&now);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				date = ctime(&now);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
				fprintf(fout, "From %s %s", myname, date);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
				while ((c = getc(fo)) != EOF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
					putc(c, fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
				rewind(fo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
				fflush(fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
				if (fferror(fout))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
					perror(tempEdit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
				fclose(fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		 * Now either copy "image" to the desired file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		 * or give it as the standard input to the desired
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		 * program as appropriate.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		if (ispipe) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
			wait((int *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			switch (fork()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
			case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
				sigchild();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
				sigset(SIGHUP, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
				sigset(SIGINT, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
				sigset(SIGQUIT, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
				close(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
				dup(image);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
				close(image);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
				lseek(0, 0L, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
				if ((shell = value("SHELL")) == NOSTR || *shell=='\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
					shell = SHELL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
				(void) execlp(shell, shell, "-c", fname, (char *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
				perror(shell);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			case (pid_t)-1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
				perror("fork");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
				senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
				goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
			if ((fout = fopen(fname, "a")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
				perror(fname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
				senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
				goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
			fin = Fdopen(image, "r");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			if (fin == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
				fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
				    gettext("Can't reopen image\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
				fclose(fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
				senderr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
				goto cant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
			rewind(fin);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
#ifdef preSVr4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
			putc(getc(fin), fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
			while (fgets(line, sizeof line, fin)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
				if (!strncmp(line, "From ", 5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
					putc('>', fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
				fputs(line, fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			while ((c = getc(fin)) != EOF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
				putc(c, fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
			putc('\n', fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			fflush(fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
			if (fferror(fout))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
				senderr++, perror(fname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			fclose(fout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
			fclose(fin);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
cant:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		 * In days of old we removed the entry from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		 * the list; now for sake of header expansion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		 * we leave it in and mark it as deleted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
#ifdef CRAZYWOW
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
		register struct name *t, *x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		if (np == top) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
			top = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
			if (top != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
				top->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
			np = top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
		x = np->n_blink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		t = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		x->n_flink = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		if (t != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			t->n_blink = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		np = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		np->n_type |= GDEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	if (image >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		close(image);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		image = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	return(nout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
 * Determine if the passed address is a local "send to file" address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
 * If any of the network metacharacters precedes any slashes, it can't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
 * be a filename.  We cheat with .'s to allow path names like ./...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
 * If "fcc" has been unset, then short-circuit those tests, but not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
 * the +... test.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
static int 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
isfileaddr(char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	register char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	char *fcc = value("fcc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	if (any('@', name))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		return(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	if (*name == '+')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		return(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	if (fcc == NOSTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		return(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	for (cp = name; *cp; cp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		if (*cp == '.')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		if (any(*cp, metanet))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
			return(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		if (*cp == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
			return(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	return(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
 * Map all of the aliased users in the invoker's mailrc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
 * file and insert them into the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
 * Changed after all these months of service to recursively
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
 * expand names (2/14/80).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
usermap(struct name *names)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	register struct name *newnames, *np, *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	struct grouphead *gh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	register int metoo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	newnames = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	np = names;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	metoo = (value("metoo") != NOSTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	while (np != NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		if (np->n_name[0] == '\\') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
			cp = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
			newnames = put(newnames, np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
			np = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		gh = findgroup(np->n_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		cp = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		if (gh != NOGRP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
			newnames = gexpand(newnames, gh, metoo, np->n_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
			newnames = put(newnames, np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		np = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	return(newnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
 * Recursively expand a group name.  We limit the expansion to some
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
 * fixed level to keep things from going haywire.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
 * Direct recursion is not expanded for convenience.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
static struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
gexpand(struct name *nlist, struct grouphead *gh, int metoo, int arg_ntype)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	short ntype = (short)arg_ntype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	struct mgroup *gp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	struct grouphead *ngh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	static int depth;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	register char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	if (depth > MAXEXP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		printf(gettext("Expanding alias to depth larger than %d\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		    MAXEXP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		return(nlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	depth++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	for (gp = gh->g_list; gp != NOGE; gp = gp->ge_link) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		cp = gp->ge_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		if (*cp == '\\')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			goto quote;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		if (strcmp(cp, gh->g_name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
			goto quote;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		if ((ngh = findgroup(cp)) != NOGRP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			nlist = gexpand(nlist, ngh, metoo, ntype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
quote:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		np = nalloc(cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
		np->n_type = ntype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		 * At this point should allow to expand
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		 * to self if only person in group
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		if (gp == gh->g_list && gp->ge_link == NOGE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
			goto skip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		if (!metoo && samebody(myname, gp->ge_name, FALSE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
			np->n_type |= GDEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
skip:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		nlist = put(nlist, np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	depth--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	return(nlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
 * Normalize a network name for comparison purposes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
norm(register char *user, register char *ubuf, int nbangs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	register char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	int inubuf = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	while (*user++ == '!');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	user--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	if (!strchr(user, '!')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		snprintf(ubuf, BUFSIZ, "%s!%s", host, user);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		user = ubuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		inubuf++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	if (nbangs) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
		cp = user + strlen(user);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		while (nbangs--)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			while (cp > user && *--cp != '!');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		user = (cp > user) ? ++cp : cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
		 * Now strip off all Internet-type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		 * hosts.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		if ((cp = strchr(user, '%')) == NOSTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
			cp = strchr(user, '@');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		if (cp != NOSTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
			if (!inubuf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
				strncpy(ubuf, user, cp - user);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
				ubuf[cp - user] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
				user = ubuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
				*cp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	return user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
 * Implement allnet options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
int 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
samebody(register char *user, register char *addr, int fuzzy)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	char ubuf[BUFSIZ], abuf[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	char *allnet = value("allnet");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	int nbangs = allnet ? !strcmp(allnet, "uucp") ? 2 : 1 : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	if (fuzzy && value("fuzzymatch")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		(void) strlcpy(ubuf, user, BUFSIZ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		for (i = 0; ubuf[i]; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
			ubuf[i] = tolower(ubuf[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		(void) strlcpy(abuf, addr, BUFSIZ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		for (i = 0; abuf[i]; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
			abuf[i] = tolower(abuf[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		return (strstr(abuf, ubuf) != NOSTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	user = norm(user, ubuf, nbangs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	addr = norm(addr, abuf, nbangs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	return strcmp(user, addr) == 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
 * Compute the length of the passed name list and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
 * return it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
static int 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
lengthof(struct name *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	register int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	for (c = 0, np = name; np != NIL; c++, np = np->n_flink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	return(c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
 * Concatenate the two passed name lists, return the result.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
cat(struct name *n1, struct name *n2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	register struct name *tail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	if (n1 == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		return(n2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	if (n2 == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
		return(n1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	tail = tailof(n1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	tail->n_flink = n2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	n2->n_blink = tail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	return(n1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
 * Unpack the name list onto a vector of strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
 * Return an error if the name list won't fit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
char **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
unpack(struct name *np)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	register char **ap, **top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	register struct name *n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	char hbuf[10];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	int t, extra, metoo, verbose;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	n = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	if ((t = lengthof(n)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		panic("No names to unpack");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	/*
14275
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   602
	 * Compute the number of extra arguments we will need.  We need at least
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   603
	 * 3 extra -- one for "mail", one for a terminating -- to stop sendmail
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   604
	 * option processing, and one for the terminating 0 pointer.
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   605
	 *
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   606
	 * Additional spots may be needed to pass along -r and -f to the host
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   607
	 * mailer.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
14275
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   610
	extra = 3;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	if (rflag != NOSTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		extra += 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
#ifdef SENDMAIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	extra++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	metoo = value("metoo") != NOSTR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	if (metoo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		extra++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	verbose = value("verbose") != NOSTR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
		extra++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	if (hflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		extra += 2;
18
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
   624
#endif /* SENDMAIL */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	top = (char **) salloc((t + extra) * sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	ap = top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	*ap++ = "mail";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	if (rflag != NOSTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
		*ap++ = "-r";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		*ap++ = rflag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
#ifdef SENDMAIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	*ap++ = "-i";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	if (metoo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
		*ap++ = "-m";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
		*ap++ = "-v";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	if (hflag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		*ap++ = "-h";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		snprintf(hbuf, sizeof (hbuf), "%d", hflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		*ap++ = savestr(hbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	}
14275
704102d4c169 5481 CVE-2012-1750 mailx(1) tilde expansion vulnerability
Robert Mustacchi <rm@joyent.com>
parents: 18
diff changeset
   643
	*ap++ = "--";
18
7e2dc246c4e2 6271998 gcc and cmd/mailx don't get along
robbin
parents: 0
diff changeset
   644
#endif /* SENDMAIL */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	while (n != NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		if (n->n_type & GDEL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
			n = n->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		*ap++ = n->n_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
		n = n->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	*ap = NOSTR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	return(top);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
 * See if the user named himself as a destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 * for outgoing mail.  If so, set the global flag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
 * selfsent so that we avoid removing his mailbox.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
void 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
mechk(struct name *names)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	register struct name *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	for (np = names; np != NIL; np = np->n_flink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		if ((np->n_type & GDEL) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
		    samebody(np->n_name, myname, FALSE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
			selfsent++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
 * Remove all of the duplicates from the passed name list by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
 * insertion sorting them, then checking for dups.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
 * Return the head of the new list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
elide(struct name *names)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	register struct name *np, *t, *newnames;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
	struct name *x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	if (names == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		return(NIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	newnames = names;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	np = names;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	if (np != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		np->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	newnames->n_flink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	while (np != NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		t = newnames;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		while (strcmp(t->n_name, np->n_name) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
			if (t->n_flink == NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			t = t->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
		 * If we ran out of t's, put the new entry after
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		 * the current value of t.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		if (strcmp(t->n_name, np->n_name) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
			t->n_flink = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
			np->n_blink = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
			t = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
			np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
			t->n_flink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
		 * Otherwise, put the new entry in front of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
		 * current t.  If at the front of the list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		 * the new guy becomes the new head of the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
		if (t == newnames) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
			t = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
			t->n_flink = newnames;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
			newnames->n_blink = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
			t->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
			newnames = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		 * The normal case -- we are inserting into the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
		 * middle of the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
		x = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
		np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
		x->n_flink = t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
		x->n_blink = t->n_blink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
		t->n_blink->n_flink = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
		t->n_blink = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	 * Now the list headed up by new is sorted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	 * Go through it and remove duplicates.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	 * Remember the best "type" among all the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	 * duplicates of a name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	np = newnames;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	while (np != NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
		int type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		t = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
		type = np->n_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
		while (t->n_flink!=NIL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
		    strcmp(np->n_name, t->n_flink->n_name) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
			t = t->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
			/* "To" before "Cc" before "Bcc" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
			if (t->n_type < type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
				type = t->n_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
		if (t == np || t == NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
			np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		 * Now t points to the last entry with the same name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
		 * as np.  Make np point beyond t.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
		np->n_flink = t->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
		if (t->n_flink != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
			t->n_flink->n_blink = np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		np->n_type = type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
		np = np->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	return(newnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
 * Put another node onto a list of names and return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
 * the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
static struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
put(struct name *list, struct name *node)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	node->n_flink = list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	node->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	if (list != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
		list->n_blink = node;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
	return(node);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
 * Delete the given name from a namelist.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
struct name *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
delname(register struct name *np, char name[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	register struct name *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	for (p = np; p != NIL; p = p->n_flink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
		if (samebody(name, p->n_name, FALSE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
			if (p->n_blink == NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				if (p->n_flink != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
					p->n_flink->n_blink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
				np = p->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
			if (p->n_flink == NIL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
				if (p->n_blink != NIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
					p->n_blink->n_flink = NIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
			p->n_blink->n_flink = p->n_flink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
			p->n_flink->n_blink = p->n_blink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	return(np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
 * Call the given routine on each element of the name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
 * list, replacing said value if need be.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
void 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
mapf(register struct name *np, char *from)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	register struct name *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	if (debug) fprintf(stderr, "mapf %lx, %s\n", (long)np, from);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	for (p = np; p != NIL; p = p->n_flink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
		if ((p->n_type & GDEL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
			p->n_name = netmap(p->n_name, from);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			p->n_full = splice(p->n_name, p->n_full);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	if (debug) fprintf(stderr, "mapf %s done\n", from);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
}