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 #pragma ident "%Z%%M% %I% %E% SMI"
27
28 /*
29 * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
30 * Use is subject to license terms.
31 */
32
33 #include "mail.h"
34 /*
35 This routine returns undeliverable mail as well as handles
36 replying to letters
37 */
38 void
goback(letnum)39 goback(letnum)
40 int letnum;
41 {
42 static char pn[] = "goback";
43 int i, w;
44 char buf[1024], *cp, work[1024], wuser[1024];
45
46 /*
47 * If dflag already == 1, then been here already and
48 * having a problem delivering failure notification.
49 * Reset dflag to 9 to avoid endless loop.....
50 */
51 if (dflag == 1) {
52 dflag = 9;
53 Dout(pn, 0, "dflag = %d\n", dflag);
54 if (!error) {
55 error = E_REMOTE;
56 Dout(pn, 0, "error = %d\n", error);
57 }
58 }
59
60 if (dflag < 2) {
61 work[0] = '\0';
62 wuser[0] = '\0';
63 fclose(tmpf);
64 if (!replying) {
65 dflag = 1;
66 Dout(pn, 0, "dflag = 1\n");
67 if ((debug > 0) && (keepdbgfile == 0)) {
68 keepdbgfile++;
69 }
70 if (ckdlivopts(H_TCOPY, (int *)0) & IGNORE) {
71 goto skipsend;
72 }
73 }
74 tmpf = doopen(lettmp, "r+", E_TMP);
75 if (replying) {
76 fseek(tmpf, let[letnum].adr, 0);
77 }
78 for (fgets(line, LSIZE, tmpf);
79 strncmp(line, header[H_FROM].tag, strlen(header[H_FROM].tag))
80 == SAME ||
81 strncmp(line, header[H_FROM1].tag,
82 strlen(header[H_FROM1].tag)) == SAME; ) {
83 if ((i = substr(line, "remote from")) != -1) {
84 for (i = 0, cp = strrchr(line, ' ') + 1;
85 *cp != '\n';
86 cp++) {
87 buf[i++] = *cp;
88 }
89 buf[i++] = '!';
90 buf[i] = '\0';
91 strcat(work, buf);
92 if (line[0] == '>') {
93 i = 6;
94 } else {
95 i = 5;
96 }
97 for (w = i; line[w] != ' '; w++) {
98 wuser[w-i] = line[w];
99 }
100 wuser[w-i] = '\0';
101 } else if ((i = substr(line, "forwarded by")) == -1) {
102 if (line[0] == '>') {
103 break;
104 } else {
105 i = 5;
106 }
107 for (w = i; line[w] != ' '; w++) {
108 wuser[w-i] = line[w];
109 }
110 wuser[w-i] = '\0';
111 } else if ((i = substr(line, "forwarded by")) > -1) {
112 break;
113 }
114 fgets(line, LSIZE, tmpf);
115 }
116 strcat(work, wuser);
117 fclose(tmpf);
118 tmpf = doopen(lettmp, "r+", E_TMP);
119 if (work[0] != '\0') {
120 reciplist list;
121 if (replying) {
122 (void) snprintf(buf, sizeof (buf),
123 "mail %s %s", m_sendto, work);
124 printf("%s\n", buf);
125 systm(buf);
126 return;
127 }
128 if (interactive) {
129 (void) strlcpy(work, my_name, sizeof (work));
130 }
131 fprintf(stderr, "%s: Return to %s\n", program, work);
132 /* Put header info from message aside so it won't */
133 /* get confused with the Delivery Notification info */
134 Daffbytecnt = affbytecnt; affbytecnt = 0;
135 Daffcnt = affcnt; affcnt = 0;
136 Drcvbytecnt = rcvbytecnt; rcvbytecnt = 0;
137
138 hdrlines[H_DAFWDFROM].head = hdrlines[H_AFWDFROM].head;
139 hdrlines[H_DAFWDFROM].tail = hdrlines[H_AFWDFROM].tail;
140 hdrlines[H_AFWDFROM].head = (struct hdrs *)NULL;
141 hdrlines[H_AFWDFROM].tail = (struct hdrs *)NULL;
142 hdrlines[H_DRECEIVED].head = hdrlines[H_RECEIVED].head;
143 hdrlines[H_DRECEIVED].tail = hdrlines[H_RECEIVED].tail;
144 hdrlines[H_RECEIVED].head = (struct hdrs *)NULL;
145 hdrlines[H_RECEIVED].tail = (struct hdrs *)NULL;
146 hdrlines[H_DTCOPY].head = hdrlines[H_TCOPY].head;
147 hdrlines[H_DTCOPY].tail = hdrlines[H_TCOPY].tail;
148 hdrlines[H_TCOPY].head = (struct hdrs *)NULL;
149 hdrlines[H_TCOPY].tail = (struct hdrs *)NULL;
150
151 pushlist(H_TCOPY, HEAD, work, FALSE);
152
153 new_reciplist(&list);
154 add_recip(&list, work, FALSE);
155 sendlist(&list, 0, 0);
156 del_reciplist(&list);
157 }
158 }
159
160 skipsend:
161 if (dflag == 9) {
162 fprintf(stderr,
163 "%s: Cannot return mail.\n",
164 program);
165 mkdead();
166 }
167
168 else if (dflag < 2) {
169 if (!maxerr && (dflag != 1)) {
170 maxerr = error;
171 Dout(pn, 0, "maxerr = %d\n", maxerr);
172 }
173 dflag = 0;
174 error = 0;
175 Dout(pn, 0, "before return, dflag = %d, error = %d\n",
176 dflag, error);
177 }
178 }
179