NetBSD/usr.bin/mail/main.c

470 lines
11 KiB
C
Raw Normal View History

/* $NetBSD: main.c,v 1.28 2007/10/23 14:58:44 christos Exp $ */
1993-03-21 12:45:37 +03:00
/*
1994-06-29 09:09:04 +04:00
* Copyright (c) 1980, 1993
* The Regents of the University of California. All rights reserved.
1993-03-21 12:45:37 +03:00
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
1993-03-21 12:45:37 +03:00
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
1993-03-21 12:45:37 +03:00
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
The Regents of the University of California. All rights reserved.\n");
1993-03-21 12:45:37 +03:00
#endif /* not lint */
#ifndef lint
#if 0
1996-12-28 10:10:57 +03:00
static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/20/95";
#else
__RCSID("$NetBSD: main.c,v 1.28 2007/10/23 14:58:44 christos Exp $");
#endif
1993-03-21 12:45:37 +03:00
#endif /* not lint */
#define EXTERN
1993-03-21 12:45:37 +03:00
#include "rcv.h"
#undef EXTERN
#include <assert.h>
#include <util.h>
1994-06-29 09:09:04 +04:00
#include "extern.h"
1993-03-21 12:45:37 +03:00
#ifdef USE_EDITLINE
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
#include "complete.h"
#endif
#include "format.h"
#ifdef MIME_SUPPORT
#include "mime.h"
#endif
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
#ifdef THREAD_SUPPORT
#include "thread.h"
#endif
1993-03-21 12:45:37 +03:00
/*
* Mail -- a mail program
*
* Startup -- interface with user.
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
static jmp_buf hdrjmp;
/*
* Interrupt printing of the headers.
*/
/*ARGSUSED*/
static void
hdrstop(int signo __unused)
{
1993-03-21 12:45:37 +03:00
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
(void)fflush(stdout);
(void)fprintf(stderr, "\nInterrupt\n");
longjmp(hdrjmp, 1);
}
/*
* Compute what the screen size for printing headers should be.
* We use the following algorithm for the height:
* If baud rate < 1200, use 9
* If baud rate = 1200, use 14
* If baud rate > 1200, use 24 or ws_row
* Width is either 80 or ws_col;
*/
PUBLIC void
setscreensize(void)
{
struct termios tbuf;
struct winsize ws;
speed_t ospeed;
char *cp;
if (ioctl(1, TIOCGWINSZ, &ws) < 0)
ws.ws_col = ws.ws_row = 0;
if (tcgetattr(1, &tbuf) < 0)
ospeed = 9600;
else
ospeed = cfgetospeed(&tbuf);
if (ospeed < 1200)
screenheight = 9;
else if (ospeed == 1200)
screenheight = 14;
else if (ws.ws_row != 0)
screenheight = ws.ws_row;
else
screenheight = 24;
if ((realscreenheight = ws.ws_row) == 0)
realscreenheight = 24;
if ((screenwidth = ws.ws_col) == 0)
screenwidth = 80;
/*
* Possible overrides from the rcfile.
*/
if ((cp = value(ENAME_SCREENWIDTH)) != NULL) {
int width;
width = *cp ? atoi(cp) : 0;
if (width >= 0)
screenwidth = width;
}
if ((cp = value(ENAME_SCREENHEIGHT)) != NULL) {
int height;
height = *cp ? atoi(cp) : 0;
if (height >= 0) {
realscreenheight = height;
screenheight = height;
}
}
}
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
/*
* Break up a white-space or comma delimited name list so that aliases
* can get expanded. Without this, the CC: or BCC: list is broken too
* late for alias expansion to occur.
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
PUBLIC struct name *
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
lexpand(char *str, int ntype)
{
char *list;
struct name *np = NULL;
char *word, *p;
list = estrdup(str);
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
word = list;
for (word = list; *word; word = p) {
word = skip_WSP(word);
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
for (p = word;
*p && !is_WSP(*p) && *p != ',';
p++)
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
continue;
if (*p)
*p++ = '\0';
np = cat(np, nalloc(word, ntype));
}
free(list);
return np;
}
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
PUBLIC int
2002-03-02 17:59:35 +03:00
main(int argc, char *argv[])
1993-03-21 12:45:37 +03:00
{
int i;
1993-03-21 12:45:37 +03:00
struct name *to, *cc, *bcc, *smopts;
#ifdef MIME_SUPPORT
struct name *attach_optargs;
struct name *attach_end;
#endif
1993-03-21 12:45:37 +03:00
char *subject;
2005-07-19 05:38:38 +04:00
const char *ef;
1993-03-21 12:45:37 +03:00
char nosrc = 0;
sig_t prevint;
2005-07-19 05:38:38 +04:00
const char *rc;
int volatile Hflag;
1993-03-21 12:45:37 +03:00
2007-06-13 23:39:54 +04:00
/*
* For portability, call setprogname() early, before
* getprogname() is called.
*/
(void)setprogname(argv[0]);
1993-03-21 12:45:37 +03:00
/*
* Set up a reasonable environment.
* Figure out whether we are being run interactively,
* start the SIGCHLD catcher, and so forth.
*/
2002-03-06 00:18:14 +03:00
(void)signal(SIGCHLD, sigchild);
1993-03-21 12:45:37 +03:00
if (isatty(0))
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_INTERACTIVE, "");
1993-03-21 12:45:37 +03:00
image = -1;
/*
* Now, determine how we are being used.
* We successively pick off - flags.
* If there is anything left, it is the base of the list
* of users to mail to. Argp will be set to point to the
* first of these users.
*/
ef = NULL;
to = NULL;
cc = NULL;
bcc = NULL;
smopts = NULL;
subject = NULL;
Hflag = 0;
#ifdef MIME_SUPPORT
attach_optargs = NULL;
attach_end = NULL;
while ((i = getopt(argc, argv, ":~EH:INT:a:b:c:dfins:u:v")) != -1)
#else
while ((i = getopt(argc, argv, ":~EH:INT:b:c:dfins:u:v")) != -1)
#endif
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
{
1993-03-21 12:45:37 +03:00
switch (i) {
case 'T':
/*
* Next argument is temp file to write which
* articles have been read/deleted for netnews.
*/
Tflag = optarg;
if ((i = creat(Tflag, 0600)) < 0) {
2002-03-06 00:29:30 +03:00
warn("%s", Tflag);
1993-03-21 12:45:37 +03:00
exit(1);
}
2005-07-20 03:07:10 +04:00
(void)close(i);
1993-03-21 12:45:37 +03:00
break;
#ifdef MIME_SUPPORT
case 'a': {
struct name *np;
np = nalloc(optarg, 0);
if (attach_end == NULL)
attach_optargs = np;
else {
np->n_blink = attach_end;
attach_end->n_flink = np;
}
attach_end = np;
break;
}
#endif
1993-03-21 12:45:37 +03:00
case 'u':
/*
* Next argument is person to pretend to be.
*/
myname = optarg;
2005-07-20 03:07:10 +04:00
(void)unsetenv("MAIL");
1993-03-21 12:45:37 +03:00
break;
case 'i':
/*
* User wants to ignore interrupts.
* Set the variable "ignore"
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_IGNORE, "");
1993-03-21 12:45:37 +03:00
break;
case 'd':
debug++;
break;
case 's':
/*
* Give a subject field for sending from
* non terminal
*/
subject = optarg;
break;
case 'f':
/*
* User is specifying file to "edit" with Mail,
* as opposed to reading system mailbox.
* If no argument is given after -f, we read his
* mbox file.
*
* getopt() can't handle optional arguments, so here
* is an ugly hack to get around it.
*/
if ((argv[optind]) && (argv[optind][0] != '-'))
ef = argv[optind++];
else
ef = "&";
break;
case 'H':
/*
* Print out the headers and quit.
*/
Hflag = get_Hflag(argv);
break;
1993-03-21 12:45:37 +03:00
case 'n':
/*
* User doesn't want to source /usr/lib/Mail.rc
*/
nosrc++;
break;
case 'N':
/*
* Avoid initial header printing.
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_NOHEADER, "");
1993-03-21 12:45:37 +03:00
break;
case 'v':
/*
* Send mailer verbose flag
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_VERBOSE, "");
1993-03-21 12:45:37 +03:00
break;
case 'I':
case '~':
1993-03-21 12:45:37 +03:00
/*
* We're interactive
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_INTERACTIVE, "");
1993-03-21 12:45:37 +03:00
break;
case 'c':
/*
* Get Carbon Copy Recipient list
*/
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
cc = cat(cc, lexpand(optarg, GCC));
1993-03-21 12:45:37 +03:00
break;
case 'b':
/*
* Get Blind Carbon Copy Recipient list
*/
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
bcc = cat(bcc, lexpand(optarg, GBCC));
1993-03-21 12:45:37 +03:00
break;
case 'E':
/*
* Don't send empty files.
*/
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
assign(ENAME_DONTSENDEMPTY, "");
break;
case ':':
/*
* An optarg was expected but not found.
*/
if (optopt == 'H') {
Hflag = get_Hflag(NULL);
break;
}
(void)fprintf(stderr,
"%s: option requires an argument -- %c\n",
getprogname(), optopt);
/* FALLTHROUGH */
1993-03-21 12:45:37 +03:00
case '?':
/*
* An unknown option flag. We need to do the
* error message.
*/
if (optopt != '?')
(void)fprintf(stderr,
"%s: unknown option -- %c\n", getprogname(),
optopt);
#ifdef MIME_SUPPORT
(void)fputs("\
Usage: mail [-EiInv] [-s subject] [-a file] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
[- sendmail-options ...]\n\
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
mail [-EiInNv] [-H[colon-modifier]] -f [name]\n\
mail [-EiInNv] [-H[colon-modifier]] [-u user]\n",
stderr);
#else /* MIME_SUPPORT */
2005-07-20 03:07:10 +04:00
(void)fputs("\
Usage: mail [-EiInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
1993-03-21 12:45:37 +03:00
[- sendmail-options ...]\n\
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
mail [-EiInNv] [-H[colon-modifier]] -f [name]\n\
mail [-EiInNv] [-H[colon-modifier]] [-u user]\n",
1993-03-21 12:45:37 +03:00
stderr);
#endif /* MIME_SUPPORT */
1993-03-21 12:45:37 +03:00
exit(1);
}
}
for (i = optind; (argv[i]) && (*argv[i] != '-'); i++)
to = cat(to, nalloc(argv[i], GTO));
for (/*EMPTY*/; argv[i]; i++)
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
smopts = cat(smopts, nalloc(argv[i], GSMOPTS));
1993-03-21 12:45:37 +03:00
/*
* Check for inconsistent arguments.
*/
2006-05-02 03:12:24 +04:00
if (to == NULL && (subject != NULL || cc != NULL || bcc != NULL))
errx(1, "You must specify direct recipients with -s, -c, or -b.");
if (ef != NULL && to != NULL) {
2006-05-02 03:12:24 +04:00
errx(1, "Cannot give -f and people to send to.");
1993-03-21 12:45:37 +03:00
}
if (Hflag != 0 && to != NULL)
errx(EXIT_FAILURE, "Cannot give -H and people to send to.");
#ifdef MIME_SUPPORT
if (attach_optargs != NULL && to == NULL)
errx(EXIT_FAILURE, "Cannot give -a without people to send to.");
#endif
tinit(); /* must be done before loading the rcfile */
1993-03-21 12:45:37 +03:00
input = stdin;
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
mailmode = Hflag ? mm_hdrsonly :
to ? mm_sending : mm_receiving;
1993-03-21 12:45:37 +03:00
spreserve();
if (!nosrc)
load(_PATH_MASTER_RC);
/*
* Expand returns a savestr, but load only uses the file name
* for fopen, so it's safe to do this.
*/
1996-12-28 10:10:57 +03:00
if ((rc = getenv("MAILRC")) == 0)
rc = "~/.mailrc";
load(expand(rc));
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
setscreensize(); /* do this after loading the rcfile */
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
#ifdef USE_EDITLINE
/*
* This is after loading the MAILRC so we can use value().
* Avoid editline in mm_hdrsonly mode or pipelines will screw
* up. XXX - there must be a better way!
*/
if (mailmode != mm_hdrsonly)
init_editline();
Jumbo mail patch from our anonymous user: 1) Use editline [optional]: Most of this code was borrowed from src/usr.bin/ftp. It does the appropriate editing, history, and completion for all mail commands (from cmdtab[]) and also does editing on header strings ('~h' inside the mail editor). 2) '-B' flag: This will suppress the "To:" line passed to sendmail. In most configurations it will lead to sendmail adding "To: undisclosed recipients;". Currently, AFAIK mail requires at least one exposed recipient address. 3) Comments in rcfile: Currently, comments in .mailrc are only supported if the first (non-white) character on a line is '#' followed by white space, i.e., '#' is a 'nop' command. This (trivial) patch allows the more normal/expected use of '#' as a comment character. It does not respect quoting, so that might be an objection which I should fix. 4) Sendmail option editing: This adds the sendmail option string to the strings editable by the '~h' command within the mail editor. Currently, you can only set this string from the command-line, which is particularly annoying when replying to mail. 5) Reply from: When replying to a message, grab the "To:" address from the message and, if there is only one such address and it does not match a list of allowed addresses (set in the "ReplyFrom" variable), pass it to sendmail as the "From:" address for the reply (with the '-f' option). I often make aliases for myself so that my primary address is not given out; if the alias gets out, I know who to blame. Unfortunately, a reply to such a message would normally use the primary address without this patch. A warning is displayed when this is going to happen so that it can be modified with '~h'. 6) CC and BCC lists: Allow '-c' and '-b' to accept white-space or ',' delimited lists. Currently, a white-space delimited list of addresses work, but a list of aliases will not get expanded. For example, currently: mail -c "foo bar" christos will fail to send mail to 'foo' and 'bar' if these are mail aliases (in ~/.mailrc); sendmail aliases (in /etc/aliases) do work. 7) pipe command: This pipes the current message into a shell command. I use this for quick decoding of uuencoded mail, but I can imagine it might be useful for decrypting encrypted mail, too. 8) show command: This command takes a list of variables and shows their values. It is probably stupid as the 'set' command without any argument displays all variable values. Of course, if there are a lot of variables you have to sift through the list for the one(s) you want.
2006-09-18 23:46:21 +04:00
#endif
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
switch (mailmode) {
case mm_sending:
(void)mail(to, cc, bcc, smopts, subject,
mime_attach_optargs(attach_optargs));
1993-03-21 12:45:37 +03:00
/*
* why wait?
*/
exit(senderr);
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
break; /* XXX - keep lint happy */
1993-03-21 12:45:37 +03:00
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
case mm_receiving:
case mm_hdrsonly:
/*
* Ok, we are reading mail.
* Decide whether we are editing a mailbox or reading
* the system mailbox, and open up the right stuff.
*/
if (ef == NULL)
ef = "%";
if (setfile(ef) < 0)
exit(1); /* error already reported */
if (setjmp(hdrjmp) == 0) {
if ((prevint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
(void)signal(SIGINT, hdrstop);
if (value(ENAME_QUIET) == NULL)
(void)printf("Mail version %s. Type ? for help.\n",
version);
if (mailmode == mm_hdrsonly)
show_headers_and_exit(Hflag); /* NORETURN */
announce();
(void)fflush(stdout);
(void)signal(SIGINT, prevint);
}
commands();
(void)signal(SIGHUP, SIG_IGN);
(void)signal(SIGINT, SIG_IGN);
(void)signal(SIGQUIT, SIG_IGN);
quit();
break;
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
default:
assert(/*CONSTCOND*/0);
break;
}
1993-03-21 12:45:37 +03:00
From Anon Ymous: 1) Statification of modules. 2) Implement the 'detach' and 'Detach' commands for extracting mime parts from messages. 3) Teach mail to output "In-Reply-To" and "References" header fields when replying so others can thread us. 4) Implement threading, sorting, and tagging, supported by the following commands: 'flatten', 'reverse', 'sort', 'thread', 'unthread', 'down', 'tset', 'up', 'expose', 'hide', 'tag', 'untag', 'invtags', 'tagbelow', 'hidetags', 'showtags'. See the manpage for details (when available - soon). 5) Implement a 'deldups' command to delete duplicate messages based on their "Message-Id" field, e.g., in replies to a mailing list that are also CCed to a subscriber. (This can also be accomplished with the threading and tagging commands.) 6) Implement 'ifdef' and 'ifndef' commands, and make the conditionals nestable (i.e., implement a conditional stack). The if/else/endif commands existed before, but they were primitive and undocumented. The 'if' command currently recognizes the "receiving", "sending", and "headersonly" mode keywords. 7) Teach the message selecting routine to understand regular expressions if "regex-search" is defined. Otherwise only case insensitive substring matches are done (as in the past). 8) Teach the message selection routine to understand boolean expressions. Improved "colon-modifier" support. See the manpage for details (when available - soon). 9) Extend paging to all commands (where relevant). 10) Add shell like piping and redirection of (standard) output (if "enable-piping" is defined). Extend completion to these contexts. 11) The manpage should follow soon!!!!
2006-11-28 21:45:32 +03:00
return 0;
1993-03-21 12:45:37 +03:00
}