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