xref: /illumos-gate/usr/src/cmd/mailx/translate.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * University Copyright- Copyright (c) 1982, 1986, 1988
28  * The Regents of the University of California
29  * All Rights Reserved
30  *
31  * University Acknowledgment- Portions of this document are derived from
32  * software developed by the University of California, Berkeley, and its
33  * contributors.
34  */
35 
36 #pragma ident	"%Z%%M%	%I%	%E% SMI"
37 
38 #include "rcv.h"
39 
40 struct name *
41 translate(struct name *np)
42 {
43 	struct name	*n, *t, *x;
44 	void	(*sigint)(int), (*sigquit)(int);
45 	char	*xl = value("translate");
46 	char	line[LINESIZE];
47 	char	postmark[256];
48 	char	*cmd;
49 	FILE	*pp;
50 	int	i;
51 
52 	if (!xl)
53 		return np;
54 	askme = 0;
55 	postmark[0] = 0;
56 	i = strlen(xl) + 1;
57 	for (n = np; n; n = n->n_flink)
58 		if (! (n->n_type & GDEL))
59 			i += strlen(n->n_name) + 3;
60 	cmd = (char *)salloc((unsigned)i);
61 	strcpy(cmd, xl);
62 	for (n = np; n; n = n->n_flink)
63 		if (! (n->n_type & GDEL)) {
64 			strcat(cmd, " \"");
65 			strcat(cmd, n->n_name);
66 			strcat(cmd, "\"");
67 		}
68 	if ((pp = npopen(cmd, "r")) == NULL) {
69 		perror(xl);
70 		senderr++;
71 		return np;
72 	}
73 	sigint = sigset(SIGINT, SIG_IGN);
74 	sigquit = sigset(SIGQUIT, SIG_IGN);
75 	fgets(postmark, sizeof postmark, pp);
76 	if (postmark[0])
77 		{
78 		postmark[strlen(postmark)-1] = 0;
79 		assign("postmark", postmark);
80 		}
81 	for (n = np; n; n = n->n_flink) {
82 		if (n->n_type & GDEL)
83 			continue;
84 		if (fgets(line, sizeof line, pp) == NULL)
85 			break;
86 		line[strlen(line)-1] = 0;
87 		if (!strcmp(line, n->n_name))
88 			continue;
89 		x = extract(line, n->n_type);
90 		n->n_type |= GDEL;
91 		n->n_name = "";
92 		if (x && !x->n_flink && strpbrk(n->n_full, "(<"))
93 			x->n_full = splice(x->n_name, n->n_full);
94 		if (x) {
95 			t = tailof(x);
96 			cat(t, n->n_flink);
97 			n->n_flink = NULL;
98 			cat(n, x);
99 			n = t;
100 		}
101 	}
102 	if (getc(pp) == 'y')
103 		askme++;
104 	if (npclose(pp) != 0 || n)
105 		senderr++;
106 	sigset(SIGINT, sigint);
107 	sigset(SIGQUIT, sigquit);
108 	return np;
109 }
110