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 /*
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 #include "mail.h"
31 /*
32 Parse the command line.
33 Return index of first non-option field (i.e. user)
34 */
35 int
parse(int argc,char ** argv)36 parse(int argc, char **argv)
37 {
38 int c;
39 char *tmailsurr;
40 static char pn[] = "parse";
41
42 /*
43 "mail +" means to print in reverse order and is
44 equivalent to "mail -r"
45 */
46 if ((argc > 1) && (argv[1][0] == '+')) {
47 if (ismail) {
48 argv[1] = "-r";
49 } else {
50 goerr++;
51 }
52 }
53
54 while ((c = getopt(argc, argv, "m:f:x:shrpPqeEdtT:w")) != EOF) {
55 switch(c) {
56 /*
57 Set debugging level...
58 */
59 case 'x':
60 debug = atoi(optarg);
61 orig_dbglvl = debug;
62 if (debug < 0) {
63 /* Keep trace file even if successful */
64 keepdbgfile = -1;
65 debug = -debug;
66 }
67 break;
68
69 /*
70 for backwards compatability with mailx...
71 */
72 case 's':
73 /* ignore this option */
74 break;
75 /*
76 * Deliver directly to a mailbox. Do Not go to sendmail
77 */
78 case 'd':
79 deliverflag = TRUE;
80 break;
81
82 /*
83 do not print mail
84 */
85 case 'e':
86 if (ismail) {
87 flge = 1;
88 } else {
89 goerr++;
90 }
91 optcnt++;
92 break;
93 /*
94 do not print mail
95 */
96 case 'E':
97 if (ismail) {
98 flgE = 1;
99 } else {
100 goerr++;
101 }
102 optcnt++;
103 break;
104 /*
105 * use alternate file as mailfile, when reading mail
106 * use this from user when sending mail.
107 */
108 case 'f':
109 flgf = 1;
110 fromflag = TRUE;
111 mailfile = optarg;
112 strncpy(from_user, optarg, sizeof (from_user));
113 from_user[sizeof (from_user) - 1] = '\0';
114 optcnt++;
115 break;
116
117 /*
118 Print headers first
119 */
120 case 'h':
121 if (ismail) {
122 flgh = 1;
123 } else {
124 goerr++;
125 }
126 optcnt++;
127 break;
128
129 /*
130 print without prompting
131 */
132 case 'p':
133 if (ismail) {
134 flgp++;
135 } else {
136 goerr++;
137 }
138 optcnt++;
139 break;
140
141 /*
142 override selective display default setting
143 when reading mail...
144 */
145 case 'P':
146 if (ismail) {
147 flgP++;
148 }
149 optcnt++;
150 break;
151
152 /*
153 terminate on deletes
154 */
155 case 'q':
156 if (ismail) {
157 delflg = 0;
158 } else {
159 goerr++;
160 }
161 optcnt++;
162 break;
163
164 /*
165 print by first in, first out order
166 */
167 case 'r':
168 if (ismail) {
169 flgr = 1;
170 } else {
171 goerr++;
172 }
173 optcnt++;
174 break;
175
176 /*
177 add To: line to letters
178 */
179 case 't':
180 flgt = 1;
181 optcnt++;
182 break;
183
184 /*
185 don't wait on sends
186 */
187 case 'w':
188 flgw = 1;
189 break;
190
191 /*
192 set message-type:
193 */
194 case 'm':
195 msgtype = optarg;
196 if (msgtype[0] == '\0' || msgtype[0] == '-') {
197 goerr++;
198 } else {
199 flgm = 1;
200 }
201 break;
202
203 /*
204 bad option
205 */
206 case '?':
207 goerr++;
208 break;
209 }
210 }
211
212
213
214 if (argc == optind) {
215
216 if (flgm) {
217 errmsg(E_SYNTAX,
218 "-m option used but no recipient(s) specified.");
219 goerr++;
220 }
221 if (flgt) {
222 errmsg(E_SYNTAX,
223 "-t option used but no recipient(s) specified.");
224 goerr++;
225 }
226 if (flgw) {
227 errmsg(E_SYNTAX,
228 "-w option used but no recipient(s) specified.");
229 goerr++;
230 }
231 if (flgf) {
232 if (mailfile[0] == '-') {
233 errmsg(E_SYNTAX,
234 "Files names must not begin with '-'");
235 done(0);
236 }
237 if (!ismail)
238 goerr++;
239 }
240 }
241
242 if (ismail && (goerr > 0)) {
243 errmsg(E_SYNTAX,"Usage: [-ehpPqr] [-f file] [-x debuglevel]");
244 (void) fprintf (stderr, "or\t[-tw] [-m message_type] [-T file] [-x debuglevel] persons\n");
245 (void) fprintf (stderr, "or\t[-x debuglevel]\n");
246 done(0);
247 }
248
249 return (optind);
250 }
251