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