/*
**
** Copyright (C) 1994 Swedish University Network (SUNET)
**
**
** This program is developed by UDAC, Uppsala University by commission
** of the Swedish University Network (SUNET). 
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITTNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
** 
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
**
**                                        Martin.Wendel@udac.uu.se
**                                        Torbjorn.Wictorin@udac.uu.se
**
**                                        UDAC	
**                                        P.O. Box 174
**                                        S-751 04 Uppsala
**                                        Sweden
**
*/


#include "config.h"

/*
 * ifdefs, used for portability
 */

#if STDC_HEADERS || HAVE_STRING_H
#include <string.h>
/* An ANSI string.h and pre-ANSI memory.h might conflict */
#if !STDC_HEADERS && HAVE_MEMORY_H
#include <memory.h>
#endif /* not STDC_HEADERS && HAVE_MEMORY_H */
#ifndef	RINDEX_DEFINED
#define index strchr
#define rindex strrchr
#endif
#define bcopy(s, d, n) memcpy((d), (s), (n))
#define bcmp(s1, s2, n) memcmp((s1), (s2), (n))
#define bzero(s, n) memset((s), 0, (n))
#else /* not STDC_HEADERS and not HAVE_STRING_H */
#include <strings.h>
/* memory.h and strings.h conflict on some systems */
#endif /* not STDC_HEADERS and not HAVE_STRING_H */

#ifdef HAVE_SYSEXITS_H
#include <sysexits.h>
#else  
#define EX_OK     0
#define EX_NOINPUT 66
#define EX_UNAVAILABLE 69
#define EX_SOFTWARE 70
#define EX_OSERR 71
#define EX_OSFILE 72
#define EX_CANTCREAT 73
#define EX_IOERR 74
#define EX_TEMPFAIL 75
#define EX_NOPERM 77
#endif

#ifndef	__P
#if defined(__STDC__)
#define __P(protos) protos   /* Full-blown ANSI C */
#else
#define __P(protos) ()       /* Traditional C preprocessor */
#endif /* !__STDC__ */
#endif




/*
 * Standard includes
 */
#include <stdio.h>
#include <sys/types.h>
#include <syslog.h>
#include <stdlib.h>
#include <ctype.h> 
#ifdef	HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <assert.h>
#include <fcntl.h>
  
/*
 * C function definitions
*/

#ifndef	STRCASECMP_DEFINED
int	strcasecmp(char *, char *);
#endif
#ifndef	STRNCASECMP_DEFINED
int	strncasecmp(char *, char *, int);
#endif


#ifdef NAMED_BIND
#ifdef USE_MX
struct mxlist {
  char *host;
  int preference;
  struct mxlist *next;
};
#endif
#endif

/*
 * Configuration parameters
*/

struct	config_struct {
	struct	config_struct * gg;
	char	* name,
		* charset,
	        * appletype,
		* format,
 	        * text,
                * header,
		* bin;
	int     iformat,
	        ibin,
	        itext,
	        iapple,
	        htext;
};

/*
 * Macros
 */

#define APPEND_LINE(L1, L2) strcat(L1, L2)
#define NEWSTR(S) S!=NULL?strcpy((char *)malloc(strlen(S) + 1), S):NULL


/*
 * Defines
 */

/* General status */
#define OK 0
#define NOK -1
#define TRUE 1
#define FALSE 0
#define FAIL -1
#define SKIP -2
#define DONE -3
#define CONT -4

/* Used for delimiter matches */
#define E7BIT     0x001
#define E8BIT     0x002
#define EBINARY   0x004
#define EBINHEX   0x008
#define EUUENCODE 0x010
#define EMULTI    0x020
#define EBASE64   0x040
#define EQP       0x080
#define ESE       0x100


/* Applefile type specifications */
#define ABINHEX   0x001  /* BinHexed applefile */
#define AMDOUBLE  0x002  /* Multipart Appledouble */
#define ADOUBLE   0x004  /* Appledouble */
#define ASINGLE   0x008  /* Applesingle */
#define AFILE     0x010  /* Applefile */
#define AMFILE    0x020  /* Multipart Applefile */
#define ARESOURCE 0x040  /* Resource fork */

/* Main types */
#define RFC822 0      /* Default */
#define MIME 1
#define MAILTOOL 2
#define TRANSPARENT 3 /* Transparent delivery (no conversion) */

/*
 * Sizes
 */

#define HDRLEN 2048
#define MIMEBOUNDLEN 60
#define HEAD_BUF 16
#define MED_BUF 256

/* Pseudos */
#define UNQUOTE 1
#define UNSPACE 2

/* Header fields */
#define UNKNOWN    0
#define COMMENT    1
#define HQSTRING   2
#define DLITERAL   4
#define RADDR      8
#define RFC1522   16
#define ATOM      32
#define DELIMITER 64
#define TEXT     128
#define TOP      256
/*
 * Externals
 */
extern long alloc_total;
extern int want_unix_from;
extern off_t pz;
extern char ebuf[1024];
extern char *sender;
extern char *hostname;
extern char *recipient;
extern char *rmx;
extern short det_sket_sig;
extern struct body *currbody;
extern struct message *rootmess;
extern struct config_struct *source;
extern struct config_struct *target;
extern char **mailer;
extern int process;
#ifdef DEBUG
extern int edebug;
#endif
#include "attr.h"
#include "func.h"
#ifdef	hpux
/* pagesize if a bit uncertain */
#define	getpagesize()	4096
#else
#ifdef	aix
size_t	getpagesize();	/* Should really be in unistd.h */
#endif
#endif

