Add support for ~_, ~x, ~i, ~a, ~A, ~<, and ~r! tilde-escapes. Improve
tilde-escapes documentation. Mostly obtained from: NetBSD
This commit is contained in:
parent
1fc841e3ab
commit
69131e4050
@ -47,6 +47,7 @@ static const char rcsid[] =
|
||||
*/
|
||||
|
||||
#include "rcv.h"
|
||||
#include <fcntl.h>
|
||||
#include "extern.h"
|
||||
|
||||
/*
|
||||
@ -213,6 +214,7 @@ collect(hp, printheaders)
|
||||
shell(&linebuf[2]);
|
||||
break;
|
||||
case ':':
|
||||
case '_':
|
||||
/*
|
||||
* Escape to command mode, but be nice!
|
||||
*/
|
||||
@ -231,6 +233,11 @@ collect(hp, printheaders)
|
||||
hadintr++;
|
||||
collint(SIGINT);
|
||||
exit(1);
|
||||
case 'x':
|
||||
/*
|
||||
* Exit, do not save in dead.letter.
|
||||
*/
|
||||
goto err;
|
||||
case 'h':
|
||||
/*
|
||||
* Grab a bunch of headers.
|
||||
@ -269,18 +276,52 @@ collect(hp, printheaders)
|
||||
break;
|
||||
case 'b':
|
||||
/*
|
||||
* Add stuff to blind carbon copies list.
|
||||
* Add to the BCC list.
|
||||
*/
|
||||
hp->h_bcc = cat(hp->h_bcc, extract(&linebuf[2], GBCC));
|
||||
break;
|
||||
case 'i':
|
||||
case 'A':
|
||||
case 'a':
|
||||
/*
|
||||
* Insert named variable in message
|
||||
*/
|
||||
switch(c) {
|
||||
case 'i':
|
||||
cp = &linebuf[2];
|
||||
while(isspace((unsigned char)*cp))
|
||||
cp++;
|
||||
break;
|
||||
case 'a':
|
||||
cp = "sign";
|
||||
break;
|
||||
case 'A':
|
||||
cp = "Sign";
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
if(*cp != '\0' && (cp = value(cp)) != NULL) {
|
||||
printf("%s\n", cp);
|
||||
if(putline(collf, cp, 1) < 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
break;
|
||||
case 'd':
|
||||
if (strlcpy(linebuf + 2, getdeadletter(), sizeof(linebuf) - 2)
|
||||
/*
|
||||
* Read in the dead letter file.
|
||||
*/
|
||||
if (strlcpy(linebuf + 2, getdeadletter(),
|
||||
sizeof(linebuf) - 2)
|
||||
>= sizeof(linebuf) - 2) {
|
||||
printf("Line buffer overflow\n");
|
||||
break;
|
||||
}
|
||||
/* fall into . . . */
|
||||
/* FALLTHROUGH */
|
||||
case 'r':
|
||||
case '<':
|
||||
/*
|
||||
* Invoke a file:
|
||||
* Search for the file name,
|
||||
@ -296,11 +337,55 @@ collect(hp, printheaders)
|
||||
cp = expand(cp);
|
||||
if (cp == NULL)
|
||||
break;
|
||||
if (isdir(cp)) {
|
||||
if (*cp == '!') {
|
||||
/*
|
||||
* Insert stdout of command.
|
||||
*/
|
||||
char *sh;
|
||||
int nullfd, tempfd, rc;
|
||||
char tempname2[PATHSIZE];
|
||||
|
||||
if ((nullfd = open("/dev/null", O_RDONLY, 0))
|
||||
== -1) {
|
||||
warn("/dev/null");
|
||||
break;
|
||||
}
|
||||
|
||||
(void)snprintf(tempname2, sizeof(tempname2),
|
||||
"%s/mail.ReXXXXXXXXXX", tmpdir);
|
||||
if ((tempfd = mkstemp(tempname2)) == -1 ||
|
||||
(fbuf = Fdopen(tempfd, "w+")) == NULL) {
|
||||
warn("%s", tempname2);
|
||||
break;
|
||||
}
|
||||
(void)unlink(tempname2);
|
||||
|
||||
if ((sh = value("SHELL")) == NULL)
|
||||
sh = _PATH_CSHELL;
|
||||
|
||||
rc = run_command(sh, 0, nullfd, fileno(fbuf),
|
||||
"-c", cp+1, NULL);
|
||||
|
||||
close(nullfd);
|
||||
|
||||
if (rc < 0) {
|
||||
(void)Fclose(fbuf);
|
||||
break;
|
||||
}
|
||||
|
||||
if (fsize(fbuf) == 0) {
|
||||
fprintf(stderr,
|
||||
"No bytes from command \"%s\"\n",
|
||||
cp+1);
|
||||
(void)Fclose(fbuf);
|
||||
break;
|
||||
}
|
||||
|
||||
rewind(fbuf);
|
||||
} else if (isdir(cp)) {
|
||||
printf("%s: Directory\n", cp);
|
||||
break;
|
||||
}
|
||||
if ((fbuf = Fopen(cp, "r")) == NULL) {
|
||||
} else if ((fbuf = Fopen(cp, "r")) == NULL) {
|
||||
warn("%s", cp);
|
||||
break;
|
||||
}
|
||||
|
@ -728,12 +728,14 @@ is somewhat of a misnomer since the actual escape character can be set
|
||||
by the option
|
||||
.Ic escape .
|
||||
.Bl -tag -width Ds
|
||||
.It Ic \&~! Ns Ar command
|
||||
Execute the indicated shell command, then return to the message.
|
||||
.It Ic \&~b Ns Ar name ...
|
||||
.It Ic \&~a
|
||||
Inserts the autograph string from the sign= option into the message.
|
||||
.It Ic \&~A
|
||||
Inserts the autograph string from the Sign= option into the message.
|
||||
.It Ic \&~b Ar name ...
|
||||
Add the given names to the list of carbon copy recipients but do not make
|
||||
the names visible in the Cc: line ("blind" carbon copy).
|
||||
.It Ic \&~c Ns Ar name ...
|
||||
.It Ic \&~c Ar name ...
|
||||
Add the given names to the list of carbon copy recipients.
|
||||
.It Ic \&~d
|
||||
Read the file
|
||||
@ -744,7 +746,7 @@ Invoke the text editor on the message collected so far.
|
||||
After the
|
||||
editing session is finished, you may continue appending text to the
|
||||
message.
|
||||
.It Ic \&~f Ns Ar messages
|
||||
.It Ic \&~f Ar messages
|
||||
Read the named messages into the message being sent.
|
||||
If no messages are specified, read in the current message.
|
||||
Message headers currently being ignored (by the
|
||||
@ -752,7 +754,7 @@ Message headers currently being ignored (by the
|
||||
or
|
||||
.Ic retain
|
||||
command) are not included.
|
||||
.It Ic \&~F Ns Ar messages
|
||||
.It Ic \&~F Ar messages
|
||||
Identical to
|
||||
.Ic \&~f ,
|
||||
except all message headers are included.
|
||||
@ -760,7 +762,9 @@ except all message headers are included.
|
||||
Edit the message header fields by typing each one in turn and allowing
|
||||
the user to append text to the end or modify the field by using the
|
||||
current terminal erase and kill characters.
|
||||
.It Ic \&~m Ns Ar messages
|
||||
.It Ic \&~i Ar string
|
||||
Inserts the value of the named option into the text of the message.
|
||||
.It Ic \&~m Ar messages
|
||||
Read the named messages into the message being sent, indented by a
|
||||
tab or by the value of
|
||||
.Ar indentprefix .
|
||||
@ -771,7 +775,7 @@ Message headers currently being ignored (by the
|
||||
or
|
||||
.Ic retain
|
||||
command) are not included.
|
||||
.It Ic \&~M Ns Ar messages
|
||||
.It Ic \&~M Ar messages
|
||||
Identical to
|
||||
.Ic \&~m ,
|
||||
except all message headers are included.
|
||||
@ -784,15 +788,19 @@ Abort the message being sent, copying the message to
|
||||
in your home directory if
|
||||
.Ic save
|
||||
is set.
|
||||
.It Ic \&~r Ns Ar filename
|
||||
.It Ic \&~r Ar filename , Ic \&~r Ar !command
|
||||
.It Ic \&~< Ar filename , Ic \&~< Ar !command
|
||||
Read the named file into the message.
|
||||
.It Ic \&~R Ns Ar string
|
||||
If the argument begins with a !,
|
||||
the rest of the string is taken as an arbitrary system command and is
|
||||
executed, with the standard output inserted into the message.
|
||||
.It Ic \&~R Ar string
|
||||
Use
|
||||
.Ar string
|
||||
as the Reply-To field.
|
||||
.It Ic \&~s Ns Ar string
|
||||
.It Ic \&~s Ar string
|
||||
Cause the named string to become the current subject field.
|
||||
.It Ic \&~\&t Ns Ar name ...
|
||||
.It Ic \&~\&t Ar name ...
|
||||
Add the given names to the direct recipient list.
|
||||
.It Ic \&~\&v
|
||||
Invoke an alternative editor (defined by the
|
||||
@ -803,9 +811,13 @@ Usually, the alternative editor will be a
|
||||
screen editor.
|
||||
After you quit the editor, you may resume appending
|
||||
text to the end of your message.
|
||||
.It Ic \&~w Ns Ar filename
|
||||
.It Ic \&~w Ar filename
|
||||
Write the message onto the named file.
|
||||
.It Ic \&~\&| Ns Ar command
|
||||
.It Ic \&~x
|
||||
Exits as with \&~q, except the message is not saved in dead.letter.
|
||||
.It Ic \&~! Ar command
|
||||
Execute the indicated shell command, then return to the message.
|
||||
.It Ic \&~\&| Ar command , Ic \&~^ Ar command
|
||||
Pipe the message through the command as a filter.
|
||||
If the command gives
|
||||
no output or terminates abnormally, retain the original text of the
|
||||
@ -815,10 +827,10 @@ The command
|
||||
is often used as
|
||||
.Ic command
|
||||
to rejustify the message.
|
||||
.It Ic \&~: Ns Ar mail-command
|
||||
.It Ic \&~: Ar mail-command , Ic \&~_ Ar mail-command
|
||||
Execute the given mail command.
|
||||
Not all commands, however, are allowed.
|
||||
.It Ic \&~~ Ns Ar string
|
||||
.It Ic \&~~ Ar string
|
||||
Insert the string of text in the message prefaced by a single ~.
|
||||
If
|
||||
you have changed the escape character, then you should double
|
||||
|
@ -1,23 +1,37 @@
|
||||
-----------------------------------------------------------
|
||||
The following ~ escapes are defined:
|
||||
~? Print this message
|
||||
~~ Quote a single tilde
|
||||
~. Same as .
|
||||
~A Equivalent to: ~i Sign
|
||||
~a Equivalent to: ~i sign
|
||||
~b users Add users to "blind" cc list
|
||||
~c users Add users to cc list
|
||||
~C Dump core
|
||||
~d Read in dead.letter
|
||||
~e Edit the message buffer
|
||||
~f messages Read in messages
|
||||
~F messages Same as ~f, but keep all header lines
|
||||
~h Prompt for to list, subject and cc list
|
||||
~r file Read a file into the message buffer
|
||||
~p Print the message buffer
|
||||
~i name Insert the value of the named variable
|
||||
~m messages Read in messages, right shifted by a tab
|
||||
~M messages Same as ~m, but keep all header lines
|
||||
~p Print the message buffer
|
||||
~q Quit, save partial message in dead.letter
|
||||
~r file Read a file into the message buffer
|
||||
~r !command Insert the output of the command in the message
|
||||
~< file Same as ~r
|
||||
~< !command Same as ~r
|
||||
~R address Set reply-to
|
||||
~s subject Set subject
|
||||
~t users Add users to to list
|
||||
~t users Add users to the To list
|
||||
~v Invoke display editor on message
|
||||
~w file Write message onto file.
|
||||
~x Quit, do not save to dead.letter
|
||||
~? Print this message
|
||||
~!command Invoke the shell
|
||||
~|command Pipe the message through the command
|
||||
~! command Invoke the shell
|
||||
~| command Pipe the message through the command
|
||||
~^ command Same as ~|
|
||||
~_ mail-cmd Perform the command-level request
|
||||
~: mail-cmd Same as ~_
|
||||
-----------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user