/*
 * $Id: hdr_comm.h,v 1.6 1999/07/19 22:44:23 gerald Exp $
 */


#ifndef _HDR_COMM_H
#define _HDR_COMM_H

#include <stdio.h>
#include <sys/types.h>
#include <mrt.h>
#include "read_conf.h"

/* max size of any object line */
/*#define MAXLINE 1024*/

/* The maximum number of lines for IRRd DB 
 * object retrieval.  This will limit the size
 * of objects returned to the user in email.
 */
#define MAX_IRRD_OBJ_SIZE 350

/* Transaction types */
/* WARNING: if you change these you must change
 * irrd_ops.h also
 */
#define ADD_OP     "ADD"
#define DEL_OP     "DEL"
#define REPLACE_OP "REPLACE"
#define NOOP_OP    "NOOP"
/*
#define NOT_SET_OP "NOT_SET"
*/
/* give a name to the non-email user */
#define TCP_USER   "TCP"

#define newline_remove(p) if (*((p) + strlen ((p)) - 1) == '\n') \
                           *((p) + strlen ((p)) - 1) = '\0'


typedef struct _trans_info_t {
  int trans_success;
  char sender_addrs[256];
  char *snext;
  char *subject;
  char *date;
  char *msg_id;
  char *obj_type;
  char *obj_key;
  char *source;
  char *pgp_from;
  char *pgp_key;
  char *override;
  int  syntax_errors;
  int  syntax_warns;
  int  del_no_exist;
  int  authfail;
  char *otherfail;
  int  new_mnt_error;
  int  bad_override;
  int  unknown_user;
  char *check_notify;
  char *check_mnt_nfy;
  /* new ones, need to resolve later */
  char *notify;
  char *forward;
  char *maint_no_exist;
  char *crypt_pw;
  /* ------ */
  char mnt_by[MAXLINE];
  char notify_addrs[MAXLINE];
  char *nnext;
  char *notify_list;
  char forward_addrs[MAXLINE];
  char *fnext;
  char *forward_list;
  char *op;
  char *old_obj_fname;
  u_int hdr_fields;
} trans_info_t;

/* JW note: the number of fields has grown well beyond 2 bytes.
 * Routines using the flag field 'hdr_field' is of type 'u_int'
 * which (luckily) turns out to be 4 bytes on bsdi and solaris.
 * However, if u_int is defined as 2 bytes on another machine
 * the program will break.  So later we should change 'hdr_field'
 * to long to be safe.
 */
#define NOTIFY_REQUIRED_FLDS (FROM_F|DATE_F|SUBJECT_F|MSG_ID_F|HDR_END_F)
#define ERROR_FLDS (SYNTAX_ERRORS_F|DEL_NO_EXIST_F|OTHERFAIL_F|AUTHFAIL_F|MAINT_NO_EXIST_F|NEW_MNT_ERROR_F|BAD_OVERRIDE_F|UNKNOWN_USER_F)
enum HDR_FLDS_T {
  FROM_F           = 01,
  SOURCE_F         = 02,
  SYNTAX_ERRORS_F  = 04,
  DEL_NO_EXIST_F   = 010,
  AUTHFAIL_F       = 020,
  MAINT_NO_EXIST_F = 040,
  OP_F             = 0100,
  NOTIFY_F         = 0200,
  MNT_NFY_F        = 0400,
  UPD_TO_F         = 01000,
  OLD_OBJ_FILE_F   = 02000,
  OBJ_TYPE_F       = 04000,
  OBJ_KEY_F        = 010000,
  SUBJECT_F        = 020000,
  DATE_F           = 040000,
  MSG_ID_F         = 0100000,
  HDR_END_F        = 0200000,
  PGP_KEY_F        = 0400000,
  PGP_FROM_F       = 01000000,
  SYNTAX_WARNS_F   = 02000000,
  OVERRIDE_F       = 04000000,
  MNT_BY_F         = 010000000,
  OTHERFAIL_F      = 020000000,
  CHECK_NOTIFY_F   = 040000000,
  CHECK_MNT_NFY_F  = 0100000000,
  PASSWORD_F       = 0200000000,
  NEW_MNT_ERROR_F  = 0400000000,
  BAD_OVERRIDE_F   = 01000000000,
  UNKNOWN_USER_F   = 02000000000,
};


/* transaction file header strings */

/* hdr info from irr_auth */
extern const char DEL_NO_EXIST[];
extern const char AUTHFAIL[];
extern const char MAINT_NO_EXIST[];
extern const char NOTIFY[];
extern const char MNT_NFY[];
extern const char UPD_TO[];
extern const char OLD_OBJ_FILE[];
extern const char OTHERFAIL[];
extern const char NEW_MNT_ERROR[];
extern const char BAD_OVERRIDE[];

/* hdr info from irr_check */
extern const char HDR_START[];
extern const char HDR_END[];
extern const char OBJ_TYPE[];
extern const char OBJ_KEY[];
extern const char OP[];
extern const char SOURCE[];
extern const char SYNTAX_ERRORS[];
extern const char SYNTAX_WARNS[];
extern const char MNT_BY[];
extern const char OVERRIDE[];
extern const char SYNTAX_WARNS[];
extern const char CHECK_NOTIFY[];
extern const char CHECK_MNT_NFY[];

/* hdr info from pgp and email processing */

extern const char PGP_FROM[];
extern const char PGP_KEY[];
extern const char FROM[];
extern const char DATE[];
extern const char SUBJECT[];
extern const char MSG_ID[];
extern const char PASSWORD[];
extern const char UNKNOWN_USER[];
extern const char UNKNOWN_USER_NAME[];

/* ERROR and WARN messages; used by irr_check and irr_notify */
/*
 * Used as additional fields on the transaction as error
 * info lines (ie, tell the user what went wrong).
 */
extern const char ERROR_TAG[];
extern const char WARN_TAG[];

/* function prototypes */

void print_hdr_struct  (FILE *, trans_info_t *);
void free_ti_mem       (trans_info_t *);
int  parse_header      (trace_t *tr, FILE *, long *, trans_info_t *);
int  update_has_errors (trans_info_t *);
void my_mktemp         (trace_t *, char *);

#endif  _HDR_COMM_H
