xref: /illumos-gate/usr/src/cmd/mail/parse.c (revision 7a6d80f1660abd4755c68cbd094d4a914681d26e)
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
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