|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 9002 (0x232a)
Types: TextFile
Names: »send.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦3658e588a⟧ »EurOpenD3/mail/mh/mh-6.7.tar.Z«
└─⟦c75e36ecb⟧
└─⟦this⟧ »mh-6.7/uip/send.c«
/* send.c - send a composed message */
#ifndef lint
static char ident[] = "@(#)$Id: send.c,v 1.3 90/04/05 15:03:46 sources Exp $";
#endif lint
#include "../h/mh.h"
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
/* \f
*/
#ifndef TMA
#define TMAminc(a) (a)
#else TMA
#define TMAminc(a) 0
#endif TMA
static struct swit switches[] = {
#define ALIASW 0
"alias aliasfile", 0,
#define DEBUGSW 1
"debug", -5,
#define DRAFTSW 2
"draft", 0,
#define DFOLDSW 3
"draftfolder +folder", 6,
#define DMSGSW 4
"draftmessage msg", 6,
#define NDFLDSW 5
"nodraftfolder", 0,
#define ENCRSW 6
"encrypt", TMAminc (-7),
#define NENCRSW 7
"noencrypt", TMAminc (-9),
#define FILTSW 8
"filter filterfile", 0,
#define NFILTSW 9
"nofilter", 0,
#define FRMTSW 10
"format", 0,
#define NFRMTSW 11
"noformat", 0,
#define FORWSW 12
"forward", 0,
#define NFORWSW 13
"noforward", 0,
#define MSGDSW 14
"msgid", 0,
#define NMSGDSW 15
"nomsgid", 0,
#define PUSHSW 16
"push", 0,
#define NPUSHSW 17
"nopush", 0,
#define UNIQSW 18
"unique", -6,
#define NUNIQSW 19
"nounique", -8,
#define VERBSW 20
"verbose", 0,
#define NVERBSW 21
"noverbose", 0,
#define WATCSW 22
"watch", 0,
#define NWATCSW 23
"nowatch", 0,
#define WIDTHSW 24
"width columns", 0,
#define HELPSW 25
"help", 4,
#define MAILSW 26
"mail", -4,
#define SAMLSW 27
"saml", -4,
#define SENDSW 28
"send", -4,
#define SOMLSW 29
"soml", -4,
#define CLIESW 30
"client host", -6,
#define SERVSW 31
"server host", -6,
#define SNOOPSW 32
"snoop", -5,
NULL, NULL
};
static struct swit anyl[] = {
#define NOSW 0
"no", 0,
#define YESW 1
"yes", 0,
#define LISTDSW 2
"list", 0,
NULL, NULL
};
/* \f
*/
extern int debugsw; /* from sendsbr.c */
extern int forwsw;
extern int inplace;
extern int pushsw;
extern int unique;
extern char *altmsg; /* .. */
extern char *annotext;
extern char *distfile;
extern int errno;
/* \f
*/
/* ARGSUSED */
main (argc, argv)
int argc;
char *argv[];
{
int msgp = 0,
distsw = 0,
vecp = 1,
isdf = 0,
msgnum,
status;
char *cp,
*dfolder = NULL,
*maildir = NULL,
buf[100],
**ap,
**argp,
*arguments[MAXARGS],
*msgs[MAXARGS],
*vec[MAXARGS];
struct msgs *mp;
struct stat st;
#ifdef UCI
FILE *fp;
#endif UCI
invo_name = r1bindex (argv[0], '/');
if ((cp = m_find (invo_name)) != NULL) {
ap = brkstring (cp = getcpy (cp), " ", "\n");
ap = copyip (ap, arguments);
}
else
ap = arguments;
(void) copyip (argv + 1, ap);
argp = arguments;
vec[vecp++] = "-library";
vec[vecp++] = getcpy (m_maildir (""));
/* \f
*/
while (cp = *argp++) {
if (*cp == '-')
switch (smatch (++cp, switches)) {
case AMBIGSW:
ambigsw (cp, switches);
done (1);
case UNKWNSW:
adios (NULLCP, "-%s unknown\n", cp);
case HELPSW:
(void) sprintf (buf, "%s [file] [switches]", invo_name);
help (buf, switches);
done (1); /* thanks, phyl */
case DRAFTSW:
msgs[msgp++] = draft;
continue;
case DFOLDSW:
if (dfolder)
adios (NULLCP, "only one draft folder at a time!");
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
*cp != '@' ? TFOLDER : TSUBCWF);
continue;
case DMSGSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
msgs[msgp++] = cp;
continue;
case NDFLDSW:
dfolder = NULL;
isdf = NOTOK;
continue;
case PUSHSW:
pushsw++;
continue;
case NPUSHSW:
pushsw = 0;
continue;
case UNIQSW:
unique++;
continue;
case NUNIQSW:
unique = 0;
continue;
case FORWSW:
forwsw++;
continue;
case NFORWSW:
forwsw = 0;
continue;
case DEBUGSW:
debugsw++; /* fall */
case NFILTSW:
case FRMTSW:
case NFRMTSW:
case MSGDSW:
case NMSGDSW:
case VERBSW:
case NVERBSW:
case WATCSW:
case NWATCSW:
case MAILSW:
case SAMLSW:
case SENDSW:
case SOMLSW:
case ENCRSW:
case NENCRSW:
case SNOOPSW:
vec[vecp++] = --cp;
continue;
case ALIASW:
case FILTSW:
case WIDTHSW:
case CLIESW:
case SERVSW:
vec[vecp++] = --cp;
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
vec[vecp++] = cp;
continue;
}
else
msgs[msgp++] = cp;
}
if (cp = m_find ("Aliasfile")) { /* allow Aliasfile: profile entry */
vec[vecp++] = "-alias";
vec[vecp++] = getcpy(cp);
}
/* \f
*/
if (dfolder == NULL) {
if (msgp == 0) {
#ifdef WHATNOW
if ((cp = getenv ("mhdraft")) && *cp) {
msgs[msgp++] = cp;
goto go_to_it;
}
#endif WHATNOW
msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf));
if (stat (msgs[0], &st) == NOTOK)
adios (msgs[0], "unable to stat draft file");
cp = concat ("Use \"", msgs[0], "\"? ", NULLCP);
for (status = LISTDSW; status != YESW;) {
if (!(argp = getans (cp, anyl)))
done (1);
switch (status = smatch (*argp, anyl)) {
case NOSW:
done (0);
case YESW:
break;
case LISTDSW:
(void) showfile (++argp, msgs[0]);
break;
default:
advise (NULLCP, "say what?");
break;
}
}
}
else
for (msgnum = 0; msgnum < msgp; msgnum++)
msgs[msgnum] = getcpy (m_maildir (msgs[msgnum]));
}
else {
if (!m_find ("path"))
free (path ("./", TFOLDER));
if (!msgp)
msgs[msgp++] = "cur";
maildir = m_maildir (dfolder);
if (chdir (maildir) == NOTOK)
adios (maildir, "unable to change directory to");
if (!(mp = m_gmsg (dfolder)))
adios (NULLCP, "unable to read folder %s", dfolder);
if (mp -> hghmsg == 0)
adios (NULLCP, "no messages in %s", dfolder);
for (msgnum = 0; msgnum < msgp; msgnum++)
if (!m_convert (mp, msgs[msgnum]))
done (1);
m_setseq (mp);
for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
if (mp -> msgstats[msgnum] & SELECTED) {
msgs[msgp++] = getcpy (m_name (msgnum));
#ifdef notdef
mp -> msgstats[msgnum] |= DELETED;
#endif notdef
mp -> msgstats[msgnum] &= ~EXISTS;
}
mp -> msgflags |= SEQMOD;
m_sync (mp);
}
#ifdef WHATNOW
go_to_it: ;
#endif WHATNOW
/* \f
*/
#ifdef TMA
if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
if ((cp = m_find ("kdsproc")) && *cp)
(void) putenv ("KDS", cp);
if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
if ((cp = m_find ("tmadb")) && *cp)
(void) putenv ("TMADB", m_maildir (cp));
#endif TMA
if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
if ((cp = m_find ("signature")) && *cp)
(void) putenv ("SIGNATURE", cp);
#ifdef UCI
else {
(void) sprintf (buf, "%s/.signature", mypath);
if ((fp = fopen (buf, "r")) != NULL
&& fgets (buf, sizeof buf, fp) != NULL) {
(void) fclose (fp);
if (cp = index (buf, '\n'))
*cp = NULL;
(void) putenv ("SIGNATURE", buf);
}
}
#endif UCI
for (msgnum = 0; msgnum < msgp; msgnum++)
if (stat (msgs[msgnum], &st) == NOTOK)
adios (msgs[msgnum], "unable to stat draft file");
if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
annotext = NULL;
if (annotext
&& ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL))
altmsg = NULL;
if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
inplace = atoi (cp);
if ((cp = getenv ("mhdist"))
&& *cp
&& (distsw = atoi (cp))
&& altmsg) {
vec[vecp++] = "-dist";
distfile = getcpy (m_scratch (altmsg, invo_name));
if (link (altmsg, distfile) == NOTOK) {
if (errno != EXDEV
#ifdef EISREMOTE
&& errno != EISREMOTE
#endif EISREMOTE
)
adios (distfile, "unable to link %s to", altmsg);
free (distfile);
distfile = getcpy (m_tmpfil (invo_name));
{
int in, out;
struct stat st;
if ((in = open (altmsg, 0)) == NOTOK)
adios (altmsg, "unable to open");
(void) fstat(in, &st);
if ((out = creat (distfile, (int) st.st_mode & 0777)) == NOTOK)
adios (distfile, "unable to write");
cpydata (in, out, altmsg, distfile);
(void) close (in);
(void) close (out);
}
}
}
else
distfile = NULL;
if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
if (pushsw)
push ();
status = 0;
vec[0] = r1bindex (postproc, '/');
closefds (3);
for (msgnum = 0; msgnum < msgp; msgnum++)
switch (sendsbr (vec, vecp, msgs[msgnum], &st)) {
case DONE:
done (++status);
case NOTOK:
status++; /* fall */
case OK:
break;
}
m_update ();
done (status);
}