/***********************************************************************
* *
* This software is part of the BSD package *
*Copyright (c) 1978-2012 The Regents of the University of California an*
* *
* 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 *
* materials provided with the distribution. *
* *
* 3. Neither the name of The Regents of the University of California*
* names of its contributors may be used to endorse or *
* promote products derived from this software without *
* specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. *
* *
* 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 *
* distribution. *
* 3. Neither the name of the University nor the names of its *
* contributors 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. *
* *
* Kurt Shoens (UCB) *
* gsf *
* *
***********************************************************************/
#pragma prototyped
/*
* Mail -- a mail program
*
* Author:
*
* Kurt Shoens (UCB) March 25, 1978
*
* Contributors:
*
* Glenn Fowler (AT&T Research) 1996-09-11
*/
#if _PACKAGE_ast
#include <ast.h>
#include <error.h>
#include <getopt.h>
#include <ls.h>
#include <sig.h>
#include <times.h>
#include <wait.h>
#else /*_PACKAGE_ast*/
#include <limits.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifndef O_BINARY
#define O_BINARY 0
#endif
#ifndef O_CLOEXEC
#define O_CLOEXEC 0
#endif
extern char* optarg;
extern int optind;
extern int opterr;
#endif /*_PACKAGE_ast*/
#include <cdt.h>
#include <ctype.h>
#include <errno.h>
#include <mime.h>
#include <setjmp.h>
#include <stdio.h>
#include "local.h"
#endif
#if MORE_DISCIPLINE
#else
#define moretop()
#endif
typedef struct msg {
} Msg_t;
/*
* Folder types.
*/
/*
* Command flag bits.
*/
/*
* Given a file address, determine the block number it represents.
*/
/*
* Format of the command description table.
*/
typedef int (*Cmd_f)(void*);
struct cmd {
};
/*
* Yechh, can't initialize unions.
*/
struct esc {
};
/*
* Common header labels.
*/
struct lab {
};
/*
* Header parse state.
*/
struct parse {
};
/*
* Argument types.
*/
#define A (1<<4) /* Var alias */
#define C (1<<5) /* Is a conditional command, Cmd line var set */
#define D (1<<6) /* Var unset default to initial value */
#define E (1<<7) /* Var init from environ */
#define I (1<<8) /* Interactive command, Var is integer */
#define L (1<<9) /* Append line values */
#define M (1<<10) /* Valid from send mode */
#define N (1<<11) /* Var null value means off */
#define P (1<<12) /* Autoprint dot after command */
#define R (1<<13) /* Cannot call from collect, Readonly var */
#define S (1<<14) /* Var cannot change while sourcing */
#define W (1<<15) /* Invalid for readonly */
#define Z (1L<<16) /* Is a transparent command */
/*
* Oft-used mask values
*/
/*
* note() type bits.
*/
/*
* Structure used to return a break down of a head
* line (hats off to Bill Joy!)
*/
struct headline {
};
/*
* Name extraction and name dictionary node flags.
*/
/*
* Structure of a variable node.
*/
struct var {
const char* name;
char** variable;
unsigned long flags;
const char* initialize;
const char* help;
};
struct list {
};
struct name {
void* value;
unsigned long flags;
};
struct argvec {
char** argp;
};
struct child {
int pid;
short done;
short free;
};
struct file {
int pid;
};
struct mhcontext {
int type;
unsigned long dot;
unsigned long next;
struct {
unsigned long dot;
unsigned long next;
} old;
};
typedef struct {
int type;
void* state;
typedef struct part {
struct {
} raw;
unsigned long flags;
int count;
} Part_t;
struct bound {
int size;
};
/*
* Structure used to pass about the current
* state of the user-typed message header.
*/
struct header {
struct {
};
struct dict {
};
struct match {
};
struct linematch {
};
struct sendand {
};
struct sendor {
};
struct sender {
};
/*
* dictsearch() flag values
*/
#define LOOKUP 0
/*
* ignore flags
*/
/*
* collect() and mail() flags
*/
/*
* Token values returned by the scanner used for argument lists.
*/
/*
* Constants for conditional commands. These describe whether
* we should be executing stuff or not.
*/
/*
* Kludges to handle the change from setexit / reset to setjmp / longjmp
*/
#define setexit() do { \
if (x) sigunblock(x); \
} while(0)
/*
* <unistd.h> etc encroachment
* we asked for extentions -- and now pay for it ...
*/
/*
* The pointers for the string allocation routines,
* there are NSPACE independent areas.
* The first holds STRINGSIZE bytes, the next
* twice as much, and so on.
*/
struct strings {
};
typedef struct {
/* the rest are implicitly initialized */
struct {
} collect;
struct {
} jump;
struct {
} last;
struct {
} msg;
struct {
} path;
struct {
struct {
} source;
struct more {
#if MORE_DISCIPLINE
int row;
int col;
int match;
#endif
int discipline;
int init;
} more;
struct state_part {
int init;
struct {
int multi;
int count;
} in;
struct {
int multi;
int boundlen;
} out;
} part;
struct {
char* dir;
} tmp;
struct
{
char* allnet;
char* append;
char* askbcc;
char* askcc;
char* askheaders;
char* asksub;
char* attachments;
char* autoinc;
char* autoprint;
char* bang;
char* cdpath;
char* cmd;
char* coprocess;
long crt;
char* dead;
char* debug;
char* domain;
char* dot;
char* editheaders;
char* editor;
char* escape;
char* fixedheaders;
char* flipr;
char* folder;
char* followup;
char* header;
char* headerbotch;
char* headfake;
char* hold;
char* home;
char* hostname;
char* ignore;
char* ignoreeof;
char* imap;
char* inbox;
char* indentprefix;
char* interactive;
char* justcheck;
long justfrom;
char* justheaders;
char* keep;
char* keepsave;
char* lister;
char* local;
char* lock;
char* log;
char* mail;
char* mailcap;
char* mailrc;
char* master;
char* mbox;
char* metoo;
char* more;
char* news;
char* oldpwd;
char* onehop;
char* outfolder;
char* page;
char* pager;
char* prompt;
char* pwd;
char* quiet;
char* receive;
char* recent;
char* rule;
char* save;
long screen;
char* searchheaders;
char* sender;
char* sendheaders;
char* sendmail;
char* sendwait;
char* shell;
char* showto;
char* Sign;
char* sign;
char* signature;
char* smtp;
char* spam;
char* spambody;
long spamdelay;
char* spamfrom;
char* spamfromok;
char* spamlog;
char* spamsub;
char* spamsubhead;
long spamtest;
char* spamto;
char* spamtook;
char* spamvia;
char* spamviaok;
long toplines;
char* trace;
char* user;
char* verbose;
char* visual;
} var;
} State_t;
extern int Copy(char*);
extern int Get(char**);
extern int Save(char*);
extern int Split(char*);
extern int alias(char**);
extern void alter(char*);
extern int alternates(char**);
extern void announce();
extern int anyof(char*, char*);
extern int blankline(char*);
extern void boundary(void);
extern int capability(char**);
extern int cd(char**);
extern int check(int, int);
extern int cmdcopy(char*);
extern int cmdelse(void);
extern int cmdendif(void);
extern int cmdexit(int);
extern int cmdif(char**);
extern int cmdmkdir(char**);
extern int cmdpipe(char*);
extern int cmdquit(void);
extern int cmdrename(char**);
extern int cmdrmdir(char**);
extern int cmdtouch(char*);
extern int cmdwrite(char*);
extern void commands(void);
extern void dictreset(void);
extern void demail(void);
extern int dot(void);
extern int duplicate(char*);
extern int echo(char**);
extern int execute(char*, int);
extern char* expand(char*, int);
extern void fileclear(void);
extern int filecopy(const char*, FILE*, const char*, FILE*, FILE*, off_t, off_t*, off_t*, unsigned long);
extern int first(int, int);
extern int folder(char**);
extern struct msg* folderinfo(int);
extern int folders(void);
extern void free_command(int);
extern int get(char**);
extern int getmsglist(char*, unsigned long);
extern int help(char**);
extern int ignore(char**);
extern int incorporate(void);
extern int incfile(void);
extern int isall(const char*);
extern char* iscmd(char*);
extern int isdate(char*);
extern int isdir(char*);
extern int ishead(char*, int);
extern int isreg(char*);
extern int license(void*);
extern int list(void);
extern void load(char*);
extern char* localize(char*);
extern int lower(int);
extern int mail(char*);
extern char* mailbox(const char*, const char*);
extern int map(char*);
extern int mark(char*);
extern int mboxit(char*);
extern void mhgetcontext(struct mhcontext*, const char*, int);
extern void mhputcontext(struct mhcontext*, const char*);
extern int mime(int);
extern void note(int, const char*, ...);
extern int notyet(char*);
extern int null(int);
extern int preserve(char*);
extern int pwd(void);
extern void quit(void);
extern char* record(char*, unsigned long);
extern int replysender(struct msg*);
extern void resume(int);
extern int retain(char**);
extern int rm(char*);
extern int run_command(char*, int, int, int, char*, char*, char*);
extern char* salloc(int);
extern int save(char*);
extern void savedeadletter(FILE*);
extern int saveignore(char**);
extern int saveretain(char**);
extern char* savestr(char*);
extern int scan(char**);
extern int scroll(char*);
extern int sender(char*, int);
extern int set(char**);
extern void set_askbcc(struct var*, const char*);
extern void set_askheaders(struct var*, const char*);
extern void set_asksub(struct var*, const char*);
extern void set_coprocess(struct var*, const char*);
extern void set_editheaders(struct var*, const char*);
extern void set_justfrom(struct var*, const char*);
extern void set_mailcap(struct var*, const char*);
extern void set_notyet(struct var*, const char*);
extern void set_screen(struct var*, const char*);
extern void set_sender(struct var*, const char*);
extern void set_sendmail(struct var*, const char*);
extern void set_spambody(struct var*, const char*);
extern void set_spamtest(struct var*, const char*);
extern void set_toplines(struct var*, const char*);
extern int setfolder(char*);
extern void setscreensize(void);
extern void settmp(const char*, int);
extern int shell(char*);
extern char* skin(char*, unsigned long);
extern char* snarf(char*, int*);
extern int source(char**);
extern int split(char*);
extern void sreset(void);
extern int start_command(char*, int, int, int, char*, char*, char*);
extern char* strlower(char*);
extern void tempinit(void);
extern int ttyquery(int, int, const char*);
extern int unalias(char**);
extern int unread(char*);
extern int unset(char**);
extern int unstack(void);
extern int upper(int);
extern int userid(char*);
extern char* username(void);
extern char* varget(const char*);
extern void varinit(void);
extern char* varkeep(const char*);
extern int varlist(int);
extern int varset(const char*, const char*);
extern int version(void*);
extern int wait_command(int);
extern char* wordnext(char**, char*);
extern char* yankword(char*, char*);
/*
* IMAP support
*/
extern int imap_command(char*);
extern void imap_exit(int);
extern int imap_folders(void);
extern int imap_get1(char**, unsigned long);
extern int imap_mkdir(char*);
extern void imap_msgflags(struct msg*, int, int);
extern int imap_msglist(char*);
extern void imap_printhead(int, int);
extern void imap_quit(void);
extern int imap_rename(char*, char*);
extern int imap_rmdir(char*);
extern int imap_setptr(char*, int);
#if _PACKAGE_ast
#define T(s) ERROR_translate(0,0,0,s)
#define X(s) ERROR_catalog(s)
#else
#define T(s) (s) /* Dynamic translation string */
#define X(s) (s) /* Static translation string */
#define imap_exit(a)
#define imap_printhead(a)
#define imap_quit()
#endif
/*
* MH support
*/
extern int mh_setptr(char*, int);