extern char *version_str;
extern char *whatnowproc;
-extern void (*done) (int) NORETURN;
-
#include <h/prototypes.h>
.SH DEFAULTS
.nf
.RI ` +folder "' defaults to the current folder"
-.RI ` msgs "' defaults to cur"
+.RI ` msgs "' defaults to the current message"
.RB ` \-date '
.RB ` \-nopreserve '
.fi
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-noverbose '
.fi
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msg "' defaults to cur"
+.RB ` msg "' defaults to the current message"
.RB ` \-noannotate '
.fi
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-noannotate '
.fi
those sequences and messages.
.PP
A message sequence is a keyword, just like one of the `reserved'
-message names, such as `first' or `next'. Unlike the
+message names, such as `f' or `n' (see mh-sequence(7)). Unlike the
`reserved' message names, which have a fixed semantics on
a per\-folder basis, the semantics of a message sequence may be
defined, modified, and removed by the user. Message sequences are
.I name
argument (which must occur at least once) the messages named via
.I msgs
-(which defaults to `cur' if no
+(which defaults to `c' if no
.I msgs
are given), are added to the
sequence. The messages to be added need not be absent from the sequence.
.IP \(bu 2
The name used to denote a message sequence must consist of an alphabetic
character followed by zero or more alphanumeric characters, and cannot
-be one of the (reserved) message names `new', `first',
-`last', `all', `next', or `prev'.
+be one of the (reserved) message names `c', `f',
+`l', `a', `n', `p', or `b'.
.PP
.IP \(bu 2
Only a certain number of sequences may be defined for a given folder.
.nf
.RB ` +folder "' defaults to the current folder"
.RB ` \-add "' if " \-sequence " is specified, " \-list " otherwise"
-.RB ` msgs "' defaults to cur (or all if " \-list " is specified)"
+.RB ` msgs "' defaults to `c' (or `a' if " \-list " is specified)"
.RB ` \-nozero '
.SH CONTEXT
in which case the current draft is used.
.PP
The last draft message
-the user was composing is known as `cur' in the draft folder.
+the user was composing is the current message in the draft folder.
.PP
The user can send off whatever drafts desired from the shell using the
standard
`msgs' convention to the
.B send
command..
-If no `msgs' are given, it defaults to `cur'.
+If no `msgs' are given, it defaults to `c'.
.PP
.RS
.nf
.fi
.RE
.PP
-constructs the message draft in the draft folder using the `new'
-message number. Furthermore, they each define `cur' in this folder to
+constructs the message draft in the draft folder using the `b'
+message number. Furthermore, they each define `c' in this folder to
be that message draft. If the user were to use the
.B quit
option at `What now?' level, then later on, if no other draft composition
.RE
.PP
Instead, if other drafts had been composed in the meantime, so that this
-message draft was no longer known as `cur' in the `draft' folder, then
+message draft was no longer known as `c' in the `draft' folder, then
the user could
.B scan
the folder to see which message draft in the
.nf
.ta +\w'\fIName\fP 'u
.I "Name Description
-first the first message in the folder
-last the last message in the folder
-cur the most recently accessed message
-prev the message numerically preceding `cur'
-next the message numerically following `cur'
+f the first message in the folder
+p the message numerically preceding `c'
+c the most recently accessed message
+n the message numerically following `c'
+l the last message in the folder
.fi
.RE
.PP
-In commands that take a `msg' argument, the default is `cur'.
-As a shorthand, `\&.' is equivalent to `cur'.
+In commands that take a `msg' argument, the default is `c'.
.PP
For example: In a folder containing five messages numbered 5, 10, 94, 177
-and 325, `first' is 5 and `last' is 325. If `cur'
-is 94, then `prev' is 10 and `next' is 177.
+and 325, `f' is 5 and `l' is 325. If `c'
+is 94, then `p' is 10 and `n' is 177.
.PP
The word `msgs' indicates that one or more messages may be specified.
Such a specification consists of one message designation or of several
either of a message name as defined above, or a message range.
.PP
A message range is specified as `name1\-name2' or
-`name:n', where `name', `name1' and `name2' are message names,
-and `n' is an integer.
+`name:i', where `name', `name1' and `name2' are message names,
+and `i' is an integer.
.PP
The specification `name1\-name2' designates all currently existing
messages from `name1' to `name2' inclusive. The `reserved'
-message name `all' is a shorthand for the message range
-`first\-last'.
+message name `a' (``all'') is a shorthand for the message range
+`f\-l'.
.PP
-The specification `name:n' designates up to `n' messages.
+.RS 5
+.nf
+.ta +\w'\fIName\fP 'u
+.I "Name Description
+a all messages in the folder (i.e. `f\-l')
+.fi
+.RE
+.PP
+The specification `name:i' designates up to `i' messages.
These messages start with `name' if `name' is a message number or one of
-the reserved names `first' `cur', or `next', The
-messages end with `name' if `name' is `prev' or `last'.
-The interpretation of `n' may be overridden by preceding `n' with a
-plus or minus sign; `+n' always means up to `n' messages starting with
-`name', and `\-n' always means up to `n' messages ending with `name'.
+the reserved names `f' `c', or `n', The
+messages end with `name' if `name' is `p' or `l'.
+The interpretation of `i' may be overridden by preceding `i' with a
+plus or minus sign; `+i' always means up to `i' messages starting with
+`name', and `\-i' always means up to `i' messages ending with `name'.
.PP
In commands which accept a `msgs' argument, the default is either
-`cur' or `all', depending on which makes more sense
-for each command (see the individual man pages for details). Repeated
+`c' or `a', depending on which makes more sense
+for each command (see the individual man pages for details).
+.PP
+Repeated
specifications of the same message have the same effect as a single
specification of the message.
.PP
-There is also a special `reserved' message name `new'
-which is used by the
+There is also a special `reserved' message name `b' (``beyond'')
+which can be used with the
.B mhpath
-command.
+command. It refers to the next (not yet used) message number
+after `l'.
+.PP
+.RS 5
+.nf
+.ta +\w'\fIName\fP 'u
+.I "Name Description
+b the next message number beyond `l'
+.fi
+.RE
.SS "User\-Defined Message Sequences"
In addition to the `reserved' (pre-defined) message names given
`msgs' argument.
.PP
Some forms of message ranges are allowed with user-defined sequences.
-The specification `name:n' may be used, and it designates up
-to the first `n' messages (or last `n' messages for `\-n') which are
+The specification `name:i' may be used, and it designates up
+to the first `i' messages (or last `i' messages for `\-i') which are
elements of the user-defined sequence `name'.
.PP
-The specifications `name:next' and `name:prev' may also
+The specifications `name:n' and `name:p' may also
be used, and they designate the next or previous message (relative to the
current message) which is an element of the user-defined sequence `name'.
-The specifications `name:first' and `name:last' are
+The specifications `name:f' and `name:l' are
equivalent to `name:1' and `name:\-1', respectively. The
-specification `name:cur' is not allowed (use just `cur'
-instead). The syntax of these message range specifications is subject
+specification `name:c' is not allowed (use just `c' instead).
+Note: The syntax of these message range specifications is subject
to change in the future.
.PP
User-defined sequence names are specific to each folder. They are
and
.B mark
commands.
-.PP
+
.SS "Public and Private User-Defined Sequences"
There are two varieties of user-defined sequences:
public and private. Public sequences of a folder are accessible to any
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-noverbose '
.fi
may often be intended for writing. Because of this:
.PP
.IP 1) 4
-the name `new' has been added to
+the name `b' has been added to
.BR mhpath 's
list of
-reserved message names (the others are `first', `last',
-`prev', `next', `cur', and `all').
-The new message is equivalent to the message after the last message
+reserved message names (the others are `f', `l',
+`p', `n', `c', and `a').
+The `b' (beyond) message is equivalent to the message after the last message
in a folder (and equivalent to 1 in a folder without messages).
-The `new' message may not be used as part of a message range.
+The `b' message may not be used as part of a message range.
.IP 2) 4
Within a message list, the following designations may refer to messages
that do not exist: a single numeric message name, the single message name
-`cur', and (obviously) the single message name `new'.
+`c', and (obviously) the single message name `b'.
All other message designations must refer to at least one existing
message, if the folder contains messages.
.IP 3) 4
% mhpath
/r/phyl/Mail/foo
-% mhpath all
+% mhpath a
/r/phyl/Mail/foo/3
/r/phyl/Mail/foo/5
/r/phyl/Mail/foo/6
/r/phyl/Mail/foo/5
/r/phyl/Mail/foo/6
-% mhpath new
+% mhpath b
/r/phyl/Mail/foo/7
-% mhpath last new
+% mhpath l b
/r/phyl/Mail/foo/6
/r/phyl/Mail/foo/7
-% mhpath last\-new
-bad message list `last\-new'.
+% mhpath l\-b
+bad message list `l\-b'.
-% mhpath cur
+% mhpath c
/r/phyl/Mail/foo/4
% mhpath 1\-2
no messages in range `1\-2'.
-% mhpath first:2
+% mhpath f:2
/r/phyl/Mail/foo/3
/r/phyl/Mail/foo/5
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-auto '
.SH CONTEXT
something like:
.PP
.RS 5
-show\0`pick\0last:20\0\-seq\0fear`
+show\0`pick\0l:20\0\-seq\0fear`
.RE
.PP
instead of typing
.PP
.RS 5
.nf
-mark\0\-add\0\-nozero\0\-seq\0fear\0last:20
+mark\0\-add\0\-nozero\0\-seq\0fear\0l:20
show\0fear
.fi
.RE
Jones about the ARPA Map Project, the command
.PP
.RS 5
-refile\0cur\0+jones\0+Map
+refile\0c\0+jones\0+Map
.RE
.PP
would allow the message to be found in either of the two folders `jones'
.IR +folder .
If this is
not given, the current folder is used by default. If no message is
-specified, then `cur' is used by default.
+specified, then the current message is used by default.
.PP
The option
.B \-file
.SH DEFAULTS
.nf
.RB ` "\-src\ +folder" "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-nolink '
.fi
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msg "' defaults to cur"
+.RB ` msg "' defaults to the current message"
.RB ` \-nogroup '
.RB ` "\-nocc\ all" "' with `\-nogroup', `\-cc\ all' with `\-group'"
.RB ` \-noannotate '
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-nounlink '
.fi
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
+.RB ` msgs "' defaults to the current message"
.RB ` \-form \ mhl.headers'
.RB ` \-noverbose '
.fi
context_find.c context_read.c \
context_replace.c context_save.c \
cpydata.c cpydgst.c crawl_folders.c \
- discard.c done.c dtime.c dtimep.c \
+ discard.c dtime.c dtimep.c \
error.c execprog.c ext_hook.c folder_addmsg.c folder_delmsgs.c \
folder_free.c folder_read.c \
folder_realloc.c gans.c getans.c getanswer.c \
+++ /dev/null
-/*
-** done.c -- terminate the program
-**
-** This code is Copyright (c) 2002, by the authors of nmh. See the
-** COPYRIGHT file in the root directory of the nmh distribution for
-** complete copyright information.
-*/
-
-#include <h/mh.h>
-
-void (*done) (int) NORETURN = exit;
va_start(ap, fmt);
advertise(what, NULL, fmt, ap);
va_end(ap);
- done(1);
+ exit(1);
}
char *folder;
folder = getcpy(toabsdir(draftfolder));
- create_folder(folder, 0, done);
+ create_folder(folder, 0, exit);
if (!(mp = folder_read(folder))) {
adios(NULL, "unable to read folder %s", folder);
}
** (to start a new draft).
*/
if (!m_convert(mp, which))
- done(1);
+ exit(1);
seq_setprev(mp);
snprintf(buffer, sizeof(buffer), "%s/%s", mp->foldpath,
--- /dev/null
+#!/bin/sh
+######################################################
+#
+# Test that all messages are picked and no ``0'' is giving out.
+#
+######################################################
+
+expected_err=$MH_TEST_DIR/$$.expected_err
+expected_out=$MH_TEST_DIR/$$.expected_out
+actual_err=$MH_TEST_DIR/$$.actual_err
+actual_out=$MH_TEST_DIR/$$.actual_out
+
+# All messages should be go to stdout
+cat > $expected_out <<EOF
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+EOF
+# Nothing should to go stderr
+cat /dev/null > $expected_err
+
+pick > $actual_out 2> $actual_err
+diff -u $expected_err $actual_err
+diff -u $expected_out $actual_out
--- /dev/null
+#!/bin/sh
+######################################################
+#
+# Test output is handelt corect and ``0'' is giving to stdout.
+#
+######################################################
+
+expected_err=$MH_TEST_DIR/$$.expected_err
+expected_out=$MH_TEST_DIR/$$.expected_out
+actual_err=$MH_TEST_DIR/$$.actual_err
+actual_out=$MH_TEST_DIR/$$.actual_out
+
+# A zero should go to standard out to protect other programms
+cat > $expected_out <<EOF
+0
+EOF
+# Error message should go to stderr.
+cat > $expected_err <<EOF
+pick: no messages match specification
+EOF
+
+pick -after tomorrow > $actual_out 2> $actual_err
+diff -u $expected_err $actual_err
+diff -u $expected_out $actual_out
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
snprintf(buf, sizeof(buf), "%s [switches] aliases ...",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FILESW:
if (!(cp = *argp++) || *cp == '-')
for (i = 0; i < vecp; i++)
print_usr(vec[i], list, normalize);
- done(0);
+ exit(0);
}
if (vecp) {
}
}
- done(0);
- return 1;
+ return 0;
}
static void
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [+folder] [msgs] [switches]",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case DELETESW: /* delete annotations */
mode = MODE_DEL;
else
annotate(file, comp, text, datesw, number,
append, preserve);
- done(0);
+ exit(0);
}
if (!msgs.size)
adios(NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgs.size; msgnum++)
- if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ for (msgnum = 0; msgnum < msgs.size; msgnum++) {
+ if (!m_convert(mp, msgs.msgs[msgnum])) {
+ /* sysexits.h EX_USAGE */
+ exit(1);
+ }
+ }
/* annotate all the SELECTED messages */
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
seq_save(mp);
folder_free(mp);
context_save();
- done(0);
- return 1;
+ return 0;
}
static void
fflush(stdout);
if (!fgets(buffer, sizeof buffer, stdin)) {
- done(1);
+ /* sysexits.h EX_IOERR */
+ exit(1);
}
*ap = trimcpy(buffer);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] addrs ...", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-')
for (addrp = 0; addrs[addrp]; addrp++)
status += process(addrs[addrp], normalize);
- done(status);
+ exit(status);
return 1;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case VERBSW:
verbosw++;
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgp; msgnum++)
if (!m_convert(mp, msgs[msgnum]))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
smsgs = (struct smsg *)
seq_save(mp);
context_save();
folder_free(mp);
- done(0);
- return 1;
+ return 0;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case EDITRSW:
if (!(ed = *argp++) || *ed == '-')
adios(NULL, "no messages in %s", folder);
/* parse the message range/sequence/name and set SELECTED */
if (!m_convert(mp, msg))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
if (mp->numsel > 1)
adios(NULL, "only one message at a time!");
context_save();
what_now(ed, use, drft, NULL, 0, NULLMP, NULL, cwd);
- done(1);
+ /* sysexits.h EX_SOFTWARE */
return 1;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE*/
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case ANNOSW:
anot++;
/* parse the message range/sequence/name and set SELECTED */
if (!m_convert(mp, msg))
- done(1);
+ /* sysexits.h EX_USAGE*/
+ exit(1);
seq_setprev(mp);
if (mp->numsel > 1)
context_save();
what_now(ed, NOUSE, drft, msgnam, 1, mp, anot ? "Resent" : NULL, cwd);
- done(1);
+ /*sysexits.h EX_SOFTWARE*/
return 1;
}
/*
** static prototypes
*/
-static void ready_msg(char *);
+static int ready_msg(char *);
int
distout(char *drft, char *msgnam, char *backup)
strcpy(backup, m_mktemp(toabsdir(invo_name), NULL, NULL));
if (rename(drft, backup) == NOTOK) {
- adios(backup, "unable to rename %s to",drft);
+ advise(backup, "unable to rename %s to",drft);
+ return NOTOK;
}
if (!(ifp = fopen(backup, "r"))) {
- adios(backup, "unable to read");
+ advise(backup, "unable to read");
+ return NOTOK;
}
if (!(ofp = fopen(drft, "w"))) {
- adios(drft, "unable to create temporary file");
+ advise(drft, "unable to create temporary file");
+ return NOTOK;
}
chmod(drft, m_gmprot());
- ready_msg(msgnam);
+ if (ready_msg(msgnam) != OK) {
+ return NOTOK;
+ }
lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
cpydata(hdrfd, fileno(ofp), msgnam, drft);
fclose(ofp);
unlink(drft);
if (rename(backup, drft) == NOTOK) {
- adios(drft, "unable to rename %s to", backup);
+ advise(drft, "unable to rename %s to", backup);
}
return NOTOK;
default:
- adios(NULL, "getfld() returned %d", state);
+ advise(NULL, "getfld() returned %d", state);
+ return NOTOK;
}
}
fclose(ofp);
unlink(drft);
if (rename(backup, drft) == NOTOK) {
- adios(drft, "unable to rename %s to", backup);
+ advise(drft, "unable to rename %s to", backup);
}
return NOTOK;
}
}
-static void
+static int
ready_msg(char *msgnam)
{
int state, out;
txtfd = NOTOK;
}
if (!(ifp = fopen(msgnam, "r"))) {
- adios(msgnam, "unable to open message");
+ advise(msgnam, "unable to open message");
+ return NOTOK;
}
cp = m_mktemp2(NULL, "dist", &hdrfd, NULL);
if (!cp) {
- adios("distsbr", "unable to create temporary file");
+ advise("distsbr", "unable to create temporary file");
+ return NOTOK;
}
fchmod(hdrfd, 0600);
strncpy(tmpfil, cp, sizeof(tmpfil));
if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) {
- adios(NULL, "no file descriptors -- you lose big");
+ advise(NULL, "no file descriptors -- you lose big");
+ return NOTOK;
}
unlink(tmpfil);
cp = m_mktemp2(NULL, "dist", &txtfd, NULL);
if (!cp) {
- adios("distsbr", "unable to create temp file");
+ advise("distsbr", "unable to create temp file");
+ return NOTOK;
}
fchmod(txtfd, 0600);
strncpy(tmpfil, cp, sizeof(tmpfil));
if ((out = dup(txtfd)) == NOTOK ||
!(ofp = fdopen(out, "w"))) {
- adios(NULL, "no file descriptors -- you lose");
+ advise(NULL, "no file descriptors -- you lose");
+ return NOTOK;
}
unlink(tmpfil);
fprintf(ofp, "\n%s", buffer);
case LENERR:
case FMTERR:
- adios(NULL, "format error in message %s", msgnam);
+ advise(NULL, "format error in message %s", msgnam);
+ return NOTOK;
default:
- adios(NULL, "getfld() returned %d", state);
+ advise(NULL, "getfld() returned %d", state);
+ return NOTOK;
}
}
process: ;
fclose(ifp);
fclose(ofp);
+ return OK;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] dates ...", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-')
status += process(dates[datep]);
context_save(); /* save the context file */
- done(status);
- return 1;
+ return status;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder1 [+folder2 ...]][switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case SEQSW:
if (!(cp = *argp++) || *cp == '-')
qsort(folders, nFolders, sizeof(struct Folder),
(qsort_comp) CompareFolders);
PrintFolders();
- done(0);
- return 1;
+ return 0;
}
/*
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /*sysexits.h EX_USAGE*/
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
snprintf(buf, sizeof(buf), "%s [switches]",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-')
fmt_compile(fmtstr, &fmt);
fmt_dump(fmt);
- done(0);
- return 1;
+ return 0;
}
static void
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /*sysexits.h EX_USAGE*/
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case ALLSW:
all = 1;
}
printf("\n");
- if (!printsw)
- done(0);
+ if (!printsw) {
+ exit(0);
+ }
}
/* Allocate initial space to record folder information */
** Check if folder exists. If not, then see if
** we should create it, or just exit.
*/
- create_folder(toabsdir(folder), fcreat, done);
+ create_folder(toabsdir(folder), fcreat, exit);
if (get_folder_info(folder, msg) && argfolder) {
/* update current folder */
print_folders();
context_save();
- done(0);
- return 1;
+ return 0;
}
static int
retval = 0;
if (fpack) {
- if (folder_pack(&mp, fverb) == -1)
- done(1);
+ if (folder_pack(&mp, fverb) == -1) {
+ exit(0);
+ }
seq_save(mp); /* synchronize the sequences */
context_save(); /* save the context file */
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case ANNOSW:
anot++;
adios(NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++)
- if (!m_convert(mp, msgs[msgnum]))
- done(1);
+ for (msgnum = 0; msgnum < msgp; msgnum++) {
+ if (!m_convert(mp, msgs[msgnum])) {
+ /* sysexits.h EX_USAGE */
+ exit(1);
+ }
+ }
seq_setprev(mp); /* set the previous sequence */
if ((out = creat(drft, m_gmprot())) == NOTOK)
context_save(); /* save the context file */
if (buildsw)
- done(0);
+ exit(0);
what_now(ed, NOUSE, drft, NULL, 0, mp,
anot ? "Forwarded" : NULL, cwd);
- done(1);
+ /* sysexits.h EX_SOFTWARE */
return 1;
}
/*
** prototypes
*/
-static void inc_done(int) NORETURN;
+static void inc_done();
int
/* copy of mail directory because the static gets overwritten */
char *maildir_copy = NULL;
- done=inc_done;
+ atexit(inc_done);
/*
** absolutely the first thing we do is save our privileges,
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case AUDSW:
if (!(cp = *argp++) || *cp == '-')
if ((maildir_copy = strdup(maildir)) == NULL)
adios(maildir, "error allocating memory to copy maildir");
- create_folder(maildir, noisy ? 0 : 1, done);
+ create_folder(maildir, noisy ? 0 : 1, exit);
if (chdir(maildir) == NOTOK)
adios(maildir, "unable to change directory to");
seq_setunseen(mp, 1); /* add new msgs to unseen sequences */
seq_save(mp); /* synchronize sequences */
context_save(); /* save the context file */
- done(0);
- return 1;
+ return 0;
}
static void
-inc_done(int status)
+inc_done()
{
if (locked) {
GETGROUPPRIVS();
lkfclose(in, newmail);
DROPGROUPPRIVS();
}
- exit(status);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /*sysexits.h EX_USAGE*/
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case ADDSW:
addsw++;
adios(NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgs.size; msgnum++)
- if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ for (msgnum = 0; msgnum < msgs.size; msgnum++) {
+ if (!m_convert(mp, msgs.msgs[msgnum])) {
+ /*sysexits.h EX_USAGE*/
+ exit(1);
+ }
+ }
if (publicsw == 1 && is_readonly(mp))
adios(NULL, "folder %s is read-only, so -public not allowed",
/* Adding messages to sequences */
if (addsw) {
- for (seqp = 0; seqs[seqp]; seqp++)
- if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw))
- done(1);
+ for (seqp = 0; seqs[seqp]; seqp++) {
+ if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw)) {
+ /*TODO find best exitcode*/
+ exit(1);
+ }
+ }
}
/* Deleting messages from sequences */
if (deletesw) {
for (seqp = 0; seqs[seqp]; seqp++)
if (!seq_delsel(mp, seqs[seqp], publicsw, zerosw))
- done(1);
+ /*TODO find best exitcode*/
+ exit(1);
}
/* Listing messages in sequences */
context_replace(curfolder, folder); /* update current folder */
context_save(); /* save the context file */
folder_free(mp); /* free folder/message structure */
- done(0);
- return 1;
+ return 0;
}
static char outfile[BUFSIZ];
static int unlink_outfile = 0;
-static void unlink_done(int) NORETURN;
+static void unlink_done();
/* mhoutsbr.c */
int output_message(CT, char *);
FILE *fp = NULL;
FILE *fp_out = NULL;
- done = unlink_done;
+ atexit(unlink_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] file", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case VERBSW:
verbosw++;
unlink_outfile = 0;
free_content(ct);
- done(0);
+ exit(0);
}
/*
if (rename(outfile, compfile) == NOTOK) {
advise(compfile, "unable to rename output %s to", outfile);
rename(buffer, compfile);
- done(1);
+ /* sysexits.h EX_IOERR */
+ exit(1);
}
unlink_outfile = 0;
free_content(ct);
- done(0);
- return 1;
+ return 0;
}
static void
-unlink_done(int status)
+unlink_done()
{
/*
** Check if we need to remove stray temporary files.
*/
- if (unlink_infile)
+ if (unlink_infile) {
unlink(infile);
- if (unlink_outfile)
+ }
+ if (unlink_outfile) {
unlink(outfile);
-
- exit(status);
+ }
}
/*
** draft. So create a multipart/mixed content to hold everything.
** We can remove this later, if it is not needed.
*/
- if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK)
- done(1);
+ if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK) {
+ /* sysexits.h EX_DATAERR */
+ exit(1);
+ }
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_MIXED;
ct->c_file = getcpy(infile);
/* parse content type */
if (get_ctinfo(content, ct, inlineD) == NOTOK)
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
for (s2i = str2cts; s2i->si_key; s2i++)
if (!mh_strcasecmp(ci->ci_type, s2i->si_key))
/* parse directive */
if (get_ctinfo(buf+1, ct, 1) == NOTOK)
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
/* check directive against the list of MIME types */
for (s2i = str2cts; s2i->si_key; s2i++)
if ((cp = context_find(buffer)) == NULL ||
*cp == '\0') {
content_error(NULL, ct, "don't know how to compose content");
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
}
}
ci->ci_magic = getcpy(cp);
cp = *ap;
if (*cp != '+' && *cp != '@')
if (!m_convert(mp, cp))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
}
free(folder);
free_ctinfo(ct);
if (mp->numsel > 1) {
/* we are forwarding multiple messages */
if (get_ctinfo("multipart/digest", ct, 0) == NOTOK)
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
ct->c_type = CT_MULTIPART;
ct->c_subtype = MULTI_DIGEST;
pe = p->c_cefile;
if (get_ctinfo("message/rfc822", p, 0)
== NOTOK)
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
p->c_type = CT_MESSAGE;
p->c_subtype = MESSAGE_RFC822;
} else {
/* we are forwarding one message */
if (get_ctinfo("message/rfc822", ct, 0) == NOTOK)
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
ct->c_type = CT_MESSAGE;
ct->c_subtype = MESSAGE_RFC822;
free_ctinfo(ct);
snprintf(buffer, sizeof(buffer), "multipart/%s", cp);
if (get_ctinfo(buffer, ct, 0) == NOTOK)
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
ct->c_type = CT_MULTIPART;
ct->c_subtype = vrsn;
default:
fclose(out);
if (pidXwait(child_id, NULL))
- done(1);
+ /* sysexits.h EX_SOFTWARE */
+ exit(1);
break;
}
}
void free_header(CT);
void free_ctinfo(CT);
void free_encoding(CT, int);
-void freects_done(int);
+void freects_done();
/*
** static prototypes
void
-freects_done(int status)
+freects_done()
{
CT *ctp;
- if ((ctp = cts))
- for (; *ctp; ctp++)
+ if ((ctp = cts)) {
+ for (; *ctp; ctp++){
free_content(*ctp);
-
- exit(status);
+ }
+ }
}
static char *ignores[MAXARGS];
static jmp_buf env;
-static jmp_buf mhlenv;
-
-static FILE *(*mhl_action) () = (FILE *(*) ()) 0;
-
/*
** Redefine a couple of functions.
** These are undefined later in the code.
*/
-#define adios mhladios
-#define done mhldone
/*
** prototypes
static void putstr(char *);
static void putch(char);
static void intrser(int);
-static void mhladios(char *, char *, ...);
-static void mhldone(int);
int sc_width(void); /* from termsbr.c */
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-')
if (setjmp(env) == 0) {
if (fname) {
- fp = mhl_action ? (*mhl_action) (fname) :
- fopen(fname, "r");
+ fp = fopen(fname, "r");
if (fp == NULL) {
advise(fname, "unable to open");
exitstat++;
}
SIGNAL(SIGINT, SIG_IGN);
- if (mhl_action == NULL && fp != stdin)
+ if (fp != stdin)
fclose(fp);
if (holder.c_text) {
free(holder.c_text);
putchar('\n');
longjmp(env, DONE);
}
-
-
-#undef adios
-#undef done
-
-static void
-mhladios(char *what, char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- advertise(what, NULL, fmt, ap);
- va_end(ap);
- mhldone(1);
-}
-
-
-static void
-mhldone(int status)
-{
- exitstat = status;
- if (mhl_action)
- longjmp(mhlenv, DONE);
- else
- done(exitstat);
-}
/* mhfree.c */
void free_content(CT);
extern CT *cts;
-void freects_done(int) NORETURN;
+void freects_done();
/*
** static prototypes
struct msgs *mp = NULL;
CT ct, *ctp;
- done=freects_done;
+ atexit(freects_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case PARTSW:
if (!(cp = *argp++) || *cp == '-')
adios(NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgs.size; msgnum++)
- if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ for (msgnum = 0; msgnum < msgs.size; msgnum++) {
+ if (!m_convert(mp, msgs.msgs[msgnum])) {
+ /* sysexits.h EX_USAGE */
+ exit(1);
+ }
+ }
seq_setprev(mp); /* set the previous-sequence */
if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1),
}
if (!*cts)
- done(1);
+ exit(1);
userrs = 1;
SIGNAL(SIGQUIT, quitser);
context_save(); /* save the context file */
}
- done(0);
- return 1;
+ return 0;
}
fflush(stderr);
}
- done(1);
+ exit(1);
/* NOTREACHED */
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s addrs... [switches]",
invo_name);
print_help(buf, switches, 0);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FROMSW:
if (!(from = *argp++) || *from == '-')
if (in == -1 || out == -1) {
fprintf(stderr, "Letter left at %s.\n",
tmpfil);
- done(status ? 1 : 0);
+ /* sysexits.h exit-status from spost */
+ exit(status ? 1 : 0);
}
cpydata(in, out, tmpfil, "dead.letter");
close(in);
fprintf(stderr, "Letter saved in dead.letter\n");
}
unlink(tmpfil);
- done(status ? 1 : 0);
- return 0; /* dead code to satisfy the compiler */
+ /* sysexits.h exit status from spost */
+ exit(status ? 1 : 0);
}
intrser(int i)
{
unlink(tmpfil);
- done(i != 0 ? 1 : 0);
+ exit(i != 0 ? 1 : 0);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /*sysexits.h EX_USAGE*/
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [profile-components] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case COMPSW:
components = 1;
}
}
- done(missed);
- return 1;
+ return missed;
}
fflush(stdout);
fflush(stderr);
- done(1);
+ exit(1);
return 1;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1); //sysexits.h EX_TEMPFAIL
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0); //sysexits.h EX_OK
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0); //sysexits.h EX_OK
}
}
if (*cp == '+' || *cp == '@') {
/* If no messages are given, print folder pathname */
if (!msgs.size) {
printf("%s\n", maildir);
- done(0);
+ exit(0); //sysexits.h EX_OK
}
if (chdir(maildir) == NOTOK)
mp->msgflags |= ALLOW_BEYOND; /* allow the beyond sequence */
/* parse all the message ranges/sequences and set SELECTED */
- for (i = 0; i < msgs.size; i++)
- if (!m_convert(mp, msgs.msgs[i]))
- done(1);
+ for (i = 0; i < msgs.size; i++) {
+ if (!m_convert(mp, msgs.msgs[i])) {
+ exit(1); //sysexits.h EX_USAGE
+ }
+ }
seq_setprev(mp); /* set the previous-sequence */
seq_save(mp); /* synchronize message sequences */
context_save(); /* save the context file */
folder_free(mp); /* free folder/message structure */
- done(0);
- return 1;
+ return 0;
}
/* mhfree.c */
void free_content(CT);
extern CT *cts;
-void freects_done(int) NORETURN;
+void freects_done();
/*
** static prototypes
FILE *fp;
int ontty = 0;
- done=freects_done;
+ atexit(freects_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] %s[switches]", invo_name, mode==SHOW ? "[msgs] " : "");
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case PARTSW:
if (!(cp = *argp++) || *cp == '-')
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
/*
** Set the SELECT_UNSEEN bit for all the SELECTED messages,
}
if (!*cts)
- done(1);
+ exit(1);
userrs = 1;
SIGNAL(SIGQUIT, quitser);
context_save(); /* save the context file */
}
- done(0);
- return 1;
+ return 0;
}
fflush(stderr);
}
- done(1);
+ exit(1);
/* NOTREACHED */
}
/* mhfree.c */
void free_content(CT);
extern CT *cts; /* The list of top-level contents to display */
-void freects_done(int) NORETURN;
+void freects_done();
/*
** static prototypes
CT ct, *ctp;
FILE *fp;
- done=freects_done;
+ atexit(freects_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case AUTOSW:
autosw++;
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1),
}
if (!*cts)
- done(1);
+ exit(1);
userrs = 1;
SIGNAL(SIGQUIT, quitser);
context_save(); /* save the context file */
}
- done(0);
- return 1;
+ return 0;
}
fflush(stderr);
}
- done(1);
+ exit(1);
/* NOTREACHED */
}
/* mhfree.c */
void free_content(CT);
extern CT *cts;
-void freects_done(int) NORETURN;
+void freects_done();
/*
** static prototypes
struct msgs *mp = NULL;
CT ct, *ctp;
- done=freects_done;
+ atexit(freects_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case PARTSW:
if (!(cp = *argp++) || *cp == '-')
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1),
}
if (!*cts)
- done(1);
+ exit(1);
userrs = 1;
SIGNAL(SIGQUIT, quitser);
context_save(); /* save the context file */
}
- done(0);
- return 1;
+ return 0;
}
fflush(stderr);
}
- done(1);
+ exit(1);
/* NOTREACHED */
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] [sequences]",
invo_name);
print_help(help, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FOLDERSSW:
if (!(folders = *argp++) || *folders == '-')
folder = doit(context_find(curfolder), folders, sequences);
if (folder == NULL) {
- done(0);
+ exit(0);
return 1;
}
context_save();
- done(0);
- return 1;
+ return 0;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
}
}
if (*cp == '+' || *cp == '@') {
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
/* copy all the SELECTED messages to stdout */
seq_save(mp);
context_save();
folder_free(mp);
- done(0);
- return 1;
+ return 0;
}
static int listsw = -1;
-static void putzero_done(int) NORETURN;
+static void putzero_done();
int
main(int argc, char **argv)
struct msgs *mp;
register FILE *fp;
- done=putzero_done;
+ atexit(putzero_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
case AMBIGSW:
ambigsw(cp, switches);
listsw = 0; /* HACK */
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
listsw = 0; /* HACK */
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
listsw = 0; /* HACK */
- done(1);
+ exit(0);
case CCSW:
case DATESW:
adios(NULL, "too many sequences (more than %d) specified", NUMATTRS);
if (!seq_nameok(cp))
- done(1);
+ exit(1);
seqs[seqp++] = cp;
continue;
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
/*
folder);
if (!pcompile(vec, NULL))
- done(1);
+ exit(1);
lo = mp->lowsel;
hi = mp->hghsel;
*/
for (seqp = 0; seqs[seqp]; seqp++)
if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw))
- done(1);
+ exit(1);
/*
** Print total matched if not printing each matched message number.
seq_save(mp); /* synchronize message sequences */
context_save(); /* save the context file */
folder_free(mp); /* free folder/message structure */
- done(0);
- return 1;
+ listsw = 0; /* HACK */
+ return 0;
}
static void
-putzero_done(int status)
+putzero_done()
{
- if (listsw && status && !isatty(fileno(stdout)))
+ if (listsw && !isatty(fileno(stdout)))
printf("0\n");
- exit(status);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] file",
invo_name);
print_help(buffer, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case PREPSW:
prepend++;
if (i == -1) {
abort:
unlink(tmpfil);
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
}
if (i || (field[0]!='\n' && field[0]!='\0')) {
fprintf(out, "%s:", name);
unlink(tmpfil);
context_save(); /* save the context file */
- done(0);
- return 1;
+ return 0;
}
** prototypes
*/
static void rcvdistout(FILE *, char *, char *);
-static void unlink_done(int) NORETURN;
+static void unlink_done();
int
FILE *fp;
char *tfile = NULL;
- done=unlink_done;
+ atexit(unlink_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
vec[vecp++] = --cp;
continue;
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] [switches for spost] address ...", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-') {
fclose(fp);
if (distout(drft, tmpfil, backup) == NOTOK) {
- done(1);
+ /* sysexits.h EX_DATAERR */
+ exit(1);
}
vec[0] = "spost";
static void
-unlink_done(int status)
+unlink_done()
{
if (*backup) {
unlink(backup);
if (*tmpfil) {
unlink(tmpfil);
}
- exit(status ? RCV_MBX : RCV_MOK);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] file",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
}
}
if (file)
/* copy stdin to stdout, converting rfc822 message to mbox */
if (!file) {
if (mbox_copy(fileno(stdout), fileno(stdin)) == NOTOK) {
- done(RCV_MBX);
+ exit(RCV_MBX);
}
- done(RCV_MOK);
+ exit(RCV_MOK);
return 1;
}
/* open and lock the file */
if ((md = mbox_open(file, getuid(), getgid(), m_gmprot()))
== NOTOK)
- done(RCV_MBX);
+ exit(RCV_MBX);
/* append the message */
if (mbox_copy(md, fileno(stdin)) == NOTOK) {
mbox_close(file, md);
- done(RCV_MBX);
+ exit(RCV_MBX);
}
/* close and unlock the file */
if (mbox_close(file, md) == NOTOK)
- done(RCV_MBX);
+ exit(RCV_MBX);
- done(RCV_MOK);
+ exit(RCV_MOK);
return 1;
}
*/
static char *tmpfilenam = NULL;
-static void unlink_done(int) NORETURN;
+static void unlink_done();
int
main(int argc, char **argv)
struct msgs *mp;
struct stat st;
- done=unlink_done;
+ atexit(unlink_done);
setlocale(LC_ALL, "");
invo_name = mhbasename(argv[0]);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [+folder] [switches]",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(1);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(1);
case SEQSW:
if (!(cp = *argp++) || *cp == '-')
if (st.st_size == 0) {
unlink(tmpfilenam);
advise(NULL, "empty file");
- done(0);
+ exit(0);
}
/*
*/
if ((msgnum = folder_addmsg(&mp, tmpfilenam, 0, unseensw, 0, 0, NULL))
== -1)
- done(1);
+ exit(1);
/*
** Add the message to any extra sequences
*/
for (seqp = 0; seqs[seqp]; seqp++) {
if (!seq_addmsg(mp, seqs[seqp], msgnum, publicsw, zerosw))
- done(1);
+ exit(1);
}
seq_setunseen(mp, 1); /* add new msgs to unseen sequences */
unlink(tmpfilenam); /* remove temporary file */
tmpfilenam = NULL;
- done(0);
- return 1;
+ return 0;
}
/*
** Clean up and exit
*/
static void
-unlink_done(int status)
+unlink_done()
{
- if (tmpfilenam && *tmpfilenam)
+ if (tmpfilenam && *tmpfilenam) {
unlink(tmpfilenam);
- exit(status);
+ }
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [msgs] [switches] +folder ...", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case LINKSW:
linkf++;
opnfolds(folders, foldp);
for (i = 0; i < filep; i++)
if (m_file(files[i], folders, foldp, 0))
- done(1);
+ /* sysexits.h EX_IOERR */
+ exit(1);
/* If -nolink, then unlink files */
if (!linkf) {
int i;
admonish(files[i], "unable to unlink");
}
}
- done(0);
+ exit(0);
}
if (!msgs.size)
/* parse the message range/sequence/name and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
/* create folder structures for each destination folder */
if (is_selected(mp, msgnum)) {
cp = getcpy(m_name(msgnum));
if (m_file(cp, folders, foldp, !linkf))
- done(1);
+ /* sysexits.h EX_IOERR */
+ exit(1);
free(cp);
}
}
context_replace(curfolder, folder);
context_save();
folder_free(mp);
- done(0);
- return 1;
+ return 0;
}
chdir(toabsdir("+"));
strncpy(nmaildir, toabsdir(fp->f_name), sizeof(nmaildir));
- create_folder(nmaildir, 0, done);
+ create_folder(nmaildir, 0, exit);
if (chdir(nmaildir) == NOTOK)
adios(nmaildir, "unable to change directory to");
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s: [+folder] [msg] [switches]", invo_name);
print_help(buf, switches, 1);
- done(0);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case GROUPSW:
groupreply++;
/* parse the message range/sequence/name and set SELECTED */
if (!m_convert(mp, msg))
- done(1);
+ /* sysexits.h EX_USAGE */
+ exit(1);
seq_setprev(mp); /* set the previous-sequence */
if (mp->numsel > 1)
fclose(in);
if (buildsw)
- done(0);
+ exit(0);
what_now(ed, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL, cwd);
- done(1);
+ /* sysexits.h EX_SOFTWARE */
return 1;
}
switch (smatch(cp, ccswitches)) {
case AMBIGSW:
ambigsw(cp, ccswitches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%scc %s unknown", ccflag ? "" : "no", cp);
default:
if (pidXwait(pid, "mhl"))
- done(1);
+ /* sysexits.h EX_SOFTWARE */
+ exit(1);
fseek(out, 0L, SEEK_END);
break;
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case INTRSW:
interactive = 1;
if (interactive) {
cp = concat("Remove folder \"", folder, "\"? ", NULL);
if (!getanswer(cp))
- done(0);
+ exit(0);
free(cp);
}
}
}
context_save(); /* save the context file */
- done(0);
- return 1;
+ return 0;
}
static int
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case UNLINKSW:
unlink_msgs++;
*/
for (msgnum = 0; msgnum < msgs.size; msgnum++) {
if (!m_convert(mp, msgs.msgs[msgnum])) {
- done(1);
+ /* sysexits EX_USAGE */
+ exit(1);
}
}
seq_setprev(mp);
seq_save(mp);
folder_free(mp);
- done(0);
- return 1;
+ return 0;
}
/* remove by refiling. */
vec[vecp++] = msgs.msgs[msgnum];
}
vec[vecp] = NULL;
- done(execprog(*vec, vec));
- return 1; /* just in case ... */
+ return execprog(*vec, vec);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case FORMSW:
if (!(form = *argp++) || *form == '-')
break;
}
fclose(in);
- done(0);
+ exit(0);
}
/*
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the Previous-Sequence */
context_replace(curfolder, folder); /* update current folder */
folder_free(mp); /* free folder/message structure */
- done(0);
- return 1;
+ return 0;
}
#include <errno.h>
#include <signal.h>
#include <h/signals.h>
-#include <setjmp.h>
#include <h/mime.h>
#include <h/tws.h>
#include <h/utils.h>
char *annotext = NULL;
char *distfile = NULL;
-static jmp_buf env;
-
/* name of temp file for body content */
static char body_file_name[MAXPATHLEN + 1];
/* name of mhbuild composition temporary file */
** static prototypes
*/
static int sendsbr(char **, int, char *, struct stat *);
-static void armed_done(int) NORETURN;
static void anno(struct stat *);
static int sendaux(char **, int, char *, struct stat *);
static int attach(char *);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
"%s [file] [switches]",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case DEBUGSW:
debugsw++;
/* parse all the msgranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < nmsgs; msgnum++) {
if (!m_convert(mp, msgs[msgnum])) {
- done(1);
+ exit(1);
}
}
seq_setprev(mp);
for (n = 0; n < nfiles; n++) {
switch (sendsbr(vec, vecp, files[n], &st)) {
case DONE:
- done(++status);
+ exit(++status);
case NOTOK:
status++; /* fall */
case OK:
}
context_save();
- done(status);
- return 1;
+ return status;
}
break;
}
- done=armed_done;
- if (setjmp(env) == 0) {
- status = sendaux(vec, vecp, drft, st) ? NOTOK : OK;
- if (status == OK) {
- /* move original draft to +trash folder */
- /* temporary close stdin, for refile not to ask */
- dupfd = dup(0);
- close(0);
- if (execprogl("refile", "refile", "-file",
- original_draft, "+trash",
- (char *)NULL) != 0) {
- advise(NULL, "unable to trash the draft");
- }
- dup2(dupfd, 0);
- close(dupfd);
+ if ((status = sendaux(vec, vecp, drft, st)) == OK) {
+ /* move original draft to +trash folder */
+ /* temporary close stdin, for refile not to ask */
+ dupfd = dup(0);
+ close(0);
+ if (execprogl("refile", "refile", "-file",
+ original_draft, "+trash",
+ (char *)NULL) != 0) {
+ advise(NULL, "unable to trash the draft");
}
+ dup2(dupfd, 0);
+ close(dupfd);
} else {
status = DONE;
}
- done=exit;
if (distfile) {
unlink(distfile);
}
vec[vecp++] = drft;
if (distfile && distout(drft, distfile, backup) == NOTOK) {
- done(1);
+ return DONE;
}
vec[vecp] = NULL;
switch (child_id = fork()) {
case -1:
/* oops -- fork error */
- adios("fork", "unable to");
- break; /* NOT REACHED */
+ advise("fork", "unable to");
+ return DONE;
case 0:
/* child process -- send it */
}
- return status;
+ return status ? NOTOK : status;
}
return "message not delivered to anyone";
}
}
-
-
-static void
-armed_done(int status)
-{
- longjmp(env, status ? status : NOTOK);
-
- exit(status);
-}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] [address info sender]", invo_name);
print_help(buf, switches, 0);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case ADDRSW:
if (!(addr = *argp++)) {
/* deliver the message */
status = localmail(fd, mdlvr);
- done(status != -1 ? RCV_MOK : RCV_MBX);
- return 1;
+ return (status != -1 ? RCV_MOK : RCV_MBX);
}
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case DATESW:
if (datesw)
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert(mp, msgs.msgs[msgnum]))
- done(1);
+ exit(1);
seq_setprev(mp); /* set the previous sequence */
if ((nmsgs = read_hdrs(mp, datesw)) <= 0)
seq_save(mp); /* synchronize message sequences */
context_save(); /* save the context file */
folder_free(mp); /* free folder/message structure */
- done(0);
- return 1;
+ return 0;
}
static int
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] file",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case DEBUGSW:
debug++;
if (debug) {
/* stop here */
- done(0);
+ exit(0);
}
fclose(out);
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] [file]",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case EDITRSW:
if (!(ed = *argp++) || *ed == '-')
unlink(drft);
}
advise(NULL, "Try again.");
- done(1);
+ /* sysexits.h EX_SOFTWARE */
+ exit(1);
}
}
snprintf(prompt, sizeof(prompt), myprompt, invo_name);
for (;;) {
if (!(argp = getans(prompt, aleqs))) {
- done(1);
+ exit(1);
}
switch (smatch(*argp, aleqs)) {
case DISPSW:
if (stat(drft, &st) != NOTOK) {
advise(NULL, "draft left on %s", drft);
}
- done(1);
+ exit(1);
case DELETESW:
/* Delete draft and exit */
removefile(drft);
- done(1);
+ exit(1);
case SENDSW:
/* Send draft */
case REFILEOPT:
/* Refile the draft */
if (refile(++argp, drft) == 0) {
- done(0);
+ exit(0);
}
break;
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- done(1);
+ exit(1);
case UNKWNSW:
adios(NULL, "-%s unknown", cp);
"%s [switches] file ...",
invo_name);
print_help(buf, switches, 1);
- done(1);
+ exit(0);
case VERSIONSW:
print_version(invo_name);
- done(1);
+ exit(0);
case TOCCSW:
toccsw = 1;