/*en    Laurent Constantin's network library (lcrzo)
                 lcrzo_priv module

  Functions herein are private.
*/
/*fr    Bibliotheque reseau de Laurent Constantin (lcrzo)
                 Module lcrzo_priv

  Les fonctions presentes dans ce module sont privees a la bibliotheque.
*/

/*
 lcrzo_priv.h : definitions of functions located in lcrzo_priv.c
 lcrzo_priv2.h : definitions of functions not located in lcrzo_priv.c,
                 but which need to be shared between modules
 lcrzo_sysdep.h : definitions of system dependant functions located in
                  lcrzo_sysdep.c
 lcrzo_sysdep2.h : definitions of system dependant functions not located 
                   in lcrzo_sysdep.c, but which need to be shared between
                   modules
*/

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_PRINTTYPE_COUNT    35
#define LCRZO_PRIV_PRINTPROFILE_COUNT  8

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_IPCTYPE_MSG      1 
#define LCRZO_PRIV_IPCTYPE_MSGEND   2
#define LCRZO_PRIV_IPCTYPE_UINT8   10
#define LCRZO_PRIV_IPCTYPE_UINT16  11
#define LCRZO_PRIV_IPCTYPE_UINT32  12
#define LCRZO_PRIV_IPCTYPE_HS      20
#define LCRZO_PRIV_IPCTYPE_IPS     21
#define LCRZO_PRIV_IPCTYPE_IPA     22
#define LCRZO_PRIV_IPCTYPE_IPL     23
#define LCRZO_PRIV_IPCTYPE_ETHS    24
#define LCRZO_PRIV_IPCTYPE_ETHA    25
#define LCRZO_PRIV_IPCTYPE_DEVICE  26
#define LCRZO_PRIV_IPCTYPE_CO_DEIP 30
#define LCRZO_PRIV_IPCTYPE_CO_EIP  31
#define LCRZO_PRIV_IPCTYPE_CO_IP   32

/*-------------------------------------------------------------*/
#define LCTSUDP   0x0001
#define LCTSTCP   0x0002
#define LCTSCLI   0x0004
#define LCTSSER   0x0008
#define LCTSREAL  0x0010
#define LCTSVIRT  0x0020
#define LCTSMONO  0x0040
#define LCTSMULT  0x0080

#define LCRZO_PRIV_TYPESOCK_REALCLIUDP      (LCTSUDP|LCTSCLI|LCTSREAL|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_REALCLITCP      (LCTSTCP|LCTSCLI|LCTSREAL|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_VIRTCLIUDP      (LCTSUDP|LCTSCLI|LCTSVIRT|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_VIRTCLITCP      (LCTSTCP|LCTSCLI|LCTSVIRT|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_REALSERUDP      (LCTSUDP|LCTSSER|LCTSREAL|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_REALSERTCP      (LCTSTCP|LCTSSER|LCTSREAL|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_VIRTSERUDP      (LCTSUDP|LCTSSER|LCTSVIRT|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_VIRTSERTCP      (LCTSTCP|LCTSSER|LCTSVIRT|LCTSMONO)
#define LCRZO_PRIV_TYPESOCK_REALSERUDPMULTI (LCTSUDP|LCTSSER|LCTSREAL|LCTSMULT)
#define LCRZO_PRIV_TYPESOCK_VIRTSERUDPMULTI (LCTSUDP|LCTSSER|LCTSVIRT|LCTSMULT)
#define LCRZO_PRIV_TYPESOCK_REALSERTCPMULTI (LCTSTCP|LCTSSER|LCTSREAL|LCTSMULT)

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_WAIT_SOURCE_FILE    1
#define LCRZO_PRIV_WAIT_SOURCE_IPC     2
#define LCRZO_PRIV_WAIT_SOURCE_SNIFF   3
#define LCRZO_PRIV_WAIT_SOURCE_SOCK    4
#define LCRZO_PRIV_WAIT_SOURCE_PROCESS 5

#define LCRZO_PRIV_WAIT_ACTION_READ        1
#define LCRZO_PRIV_WAIT_ACTION_READ_FIXED  2
#define LCRZO_PRIV_WAIT_ACTION_READ_LINE   3
#define LCRZO_PRIV_WAIT_ACTION_WRITE       4
#define LCRZO_PRIV_WAIT_ACTION_END         5

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_NOTSET_DEBUG 0
#if LCRZO_PRIV_NOTSET_DEBUG==1
 #define LCRZO_PRIV_NOTSET_UINT8  0xAA
 #define LCRZO_PRIV_NOTSET_UINT16 0xAAAA
 #define LCRZO_PRIV_NOTSET_UINT32 0xAAAAAAAAu
 #define LCRZO_PRIV_NOTSET_STRING "-notset-"
 #define lcrzo_priv_notset_bool(a) {a=LCRZO_PRIV_NOTSET_UINT8;}
 #define lcrzo_priv_notset_int(a) {a=LCRZO_PRIV_NOTSET_UINT32;}
 #define lcrzo_priv_notset_int8(a) {a=LCRZO_PRIV_NOTSET_UINT8;}
 #define lcrzo_priv_notset_int16(a) {a=LCRZO_PRIV_NOTSET_UINT16;}
 #define lcrzo_priv_notset_int32(a) {a=LCRZO_PRIV_NOTSET_UINT32;}
 #define lcrzo_priv_notset_uint8(a) {a=LCRZO_PRIV_NOTSET_UINT8;}
 #define lcrzo_priv_notset_uint16(a) {a=LCRZO_PRIV_NOTSET_UINT16;}
 #define lcrzo_priv_notset_uint32(a) {a=LCRZO_PRIV_NOTSET_UINT32;}
 #define lcrzo_priv_notset_hs(a) {strcpy(a,LCRZO_PRIV_NOTSET_STRING);}
 #define lcrzo_priv_notset_ips(a) {strcpy(a,LCRZO_PRIV_NOTSET_STRING);}
 #define lcrzo_priv_notset_eths(a) {strcpy(a,LCRZO_PRIV_NOTSET_STRING);}
 #define lcrzo_priv_notset_device(a) {strcpy(a,LCRZO_PRIV_NOTSET_STRING);}
 #define lcrzo_priv_notset_ipl(a) {a=LCRZO_PRIV_NOTSET_UINT32;}
 #define lcrzo_priv_notset_ipa(a) {a[0]=LCRZO_PRIV_NOTSET_UINT8;a[1]=LCRZO_PRIV_NOTSET_UINT8;a[2]=LCRZO_PRIV_NOTSET_UINT8;a[3]=LCRZO_PRIV_NOTSET_UINT8;}
 #define lcrzo_priv_notset_etha(a) {a[0]=LCRZO_PRIV_NOTSET_UINT8;a[1]=LCRZO_PRIV_NOTSET_UINT8;a[2]=LCRZO_PRIV_NOTSET_UINT8;a[3]=LCRZO_PRIV_NOTSET_UINT8;a[4]=LCRZO_PRIV_NOTSET_UINT8;a[5]=LCRZO_PRIV_NOTSET_UINT8;}
#else
 #define lcrzo_priv_notset_bool(a) {}
 #define lcrzo_priv_notset_int(a) {}
 #define lcrzo_priv_notset_int8(a) {}
 #define lcrzo_priv_notset_int16(a) {}
 #define lcrzo_priv_notset_int32(a) {}
 #define lcrzo_priv_notset_uint8(a) {}
 #define lcrzo_priv_notset_uint16(a) {}
 #define lcrzo_priv_notset_uint32(a) {}
 #define lcrzo_priv_notset_hs(a) {}
 #define lcrzo_priv_notset_ips(a) {}
 #define lcrzo_priv_notset_eths(a) {}
 #define lcrzo_priv_notset_device(a) {}
 #define lcrzo_priv_notset_ipl(a) {}
 #define lcrzo_priv_notset_ipa(a) {}
 #define lcrzo_priv_notset_etha(a) {}
#endif

/*-------------------------------------------------------------*/
int lcrzo_priv_etha_and(lcrzo_constetha a, lcrzo_constetha b, 
			lcrzo_etha result);
int lcrzo_priv_etha_or(lcrzo_constetha a, lcrzo_constetha b,
		       lcrzo_etha result);
int lcrzo_priv_etha_xor(lcrzo_constetha a, lcrzo_constetha b,
			lcrzo_etha result);
int lcrzo_priv_etha_not(lcrzo_constetha a, lcrzo_etha result);
int lcrzo_priv_etha_inc(lcrzo_constetha a, lcrzo_etha result);
int lcrzo_priv_etha_dec(lcrzo_constetha a, lcrzo_etha result);
int lcrzo_priv_etha_shl(lcrzo_constetha a, lcrzo_etha result);
int lcrzo_priv_etha_shr(lcrzo_constetha a, lcrzo_etha result);
int lcrzo_priv_etha_gt(lcrzo_constetha a, lcrzo_constetha b);
int lcrzo_priv_etha_lt(lcrzo_constetha a, lcrzo_constetha b);
int lcrzo_priv_etha_ge(lcrzo_constetha a, lcrzo_constetha b);
int lcrzo_priv_etha_le(lcrzo_constetha a, lcrzo_constetha b);

/*-------------------------------------------------------------*/
int lcrzo_priv_hdrleth_equal_addr(lcrzo_hdrleth hdrleth,
				  lcrzo_constetha ethasrc,
				  lcrzo_constetha ethadst);
int lcrzo_priv_hdrlip_equal_addr(lcrzo_hdrlip hdrlip,
				 lcrzo_ipl iplsrc,
				 lcrzo_ipl ipldst);
int lcrzo_priv_hdrludp_equal_port(lcrzo_hdrludp hdrludp,
				  lcrzo_uint16 portsrc,
				  lcrzo_uint16 portdst);
int lcrzo_priv_hdrltcp_equal_port(lcrzo_hdrltcp hdrltcp,
				  lcrzo_uint16 portsrc,
				  lcrzo_uint16 portdst);

/*-------------------------------------------------------------*/
int lcrzo_ie(lcrzo_conststring functionname,
	     lcrzo_conststring frexplain,
	     lcrzo_conststring enexplain);
int lcrzo_ieuv(lcrzo_conststring functionname,
	       lcrzo_conststring varname);
int lcrzo_ierp(lcrzo_conststring functionname);

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_INCREASE 1
#define LCRZO_PRIV_DECREASE 2

/*-------------------------------------------------------------*/
int lcrzo_priv_manageelempos(lcrzo_int32 elemcount,
			     lcrzo_int32 position,
			     lcrzo_bool wanttoinsertelem,
			     lcrzo_int32 *pposnegative,
			     lcrzo_int32 *ppospositive,
			     int *pdirection, 
			     lcrzo_int32 *pdistance);
int lcrzo_priv_manageelemrange(lcrzo_int32 elemcount,
			       lcrzo_int32 infposition,
			       lcrzo_int32 supposition,
			       lcrzo_int32 *pinfposnegative,
			       lcrzo_int32 *pinfpospositive,
			       lcrzo_int32 *psupposnegative,
			       lcrzo_int32 *psuppospositive,
			       int *pinfdirection, 
			       lcrzo_int32 *pinfdistance,
			       int *pinfsupdirection, 
			       lcrzo_int32 *pinfsupdistance);
int lcrzo_priv_manageelemrangefast(lcrzo_int32 elemcount,
				   lcrzo_int32 infposition,
				   lcrzo_int32 supposition,
				   lcrzo_int32 *pinfposnegative,
				   lcrzo_int32 *pinfpospositive,
				   lcrzo_int32 *psupposnegative,
				   lcrzo_int32 *psuppospositive,
				   int *pinfdirection, 
				   lcrzo_int32 *pinfdistance,
				   int *pinfsupdirection, 
				   lcrzo_int32 *pinfsupdistance);

/*-------------------------------------------------------------*/
int lcrzo_priv_managedataposneg(lcrzo_int32 datasize,
				lcrzo_int32 negative,
				lcrzo_int32 *pnegative,
				lcrzo_int32 *ppositive);
int lcrzo_priv_managedatapospos(lcrzo_int32 datasize,
				lcrzo_int32 positive,
				lcrzo_int32 *pnegative,
				lcrzo_int32 *ppositive);
int lcrzo_priv_managedatarange(lcrzo_int32 datasize,
			       lcrzo_int32 infposition,
			       lcrzo_int32 supposition,
			       lcrzo_int32 *pinfposnegative,
			       lcrzo_int32 *pinfpospositive,
			       lcrzo_int32 *psupposnegative,
			       lcrzo_int32 *psuppospositive,
			       int *pinfdirection, 
			       lcrzo_int32 *pinfdistance,
			       int *pinfsupdirection, 
			       lcrzo_int32 *pinfsupdistance);


/*-------------------------------------------------------------*/
int lcrzo_priv_data_u16_initm_data(lcrzo_constdata datain,
				   lcrzo_uint16 datainsize,
				   lcrzo_data *pdataout,
				   lcrzo_uint16 *pdataoutsize);
int lcrzo_priv_data_u16_appendm_data(lcrzo_constdata datain,
				     lcrzo_uint16 datainsize,
				     lcrzo_uint16 dataoutcurrentsize,
				     lcrzo_data *pdataout,
				     lcrzo_uint16 *pdataoutsize);

/*-------------------------------------------------------------*/
int lcrzo_priv_storeddata_append(lcrzo_data data, 
                                 lcrzo_int32 datasize,
                                 lcrzo_data *pstoreddata,
                                 lcrzo_int32 *pstoreddatasize);
int lcrzo_priv_storeddata_insert(lcrzo_data data, 
                                 lcrzo_int32 datasize,
                                 lcrzo_data *pstoreddata,
                                 lcrzo_int32 *pstoreddatasize);

lcrzo_bool lcrzo_priv_storeddata_contain(lcrzo_data storeddata,
                                         lcrzo_int32 storeddatasize);
lcrzo_bool lcrzo_priv_storeddata_contain_fixed(lcrzo_data storeddata,
                                               lcrzo_int32 storeddatasize,
                                               lcrzo_int32 wantedsize);
lcrzo_bool lcrzo_priv_storeddata_contain_line(lcrzo_data storeddata,
                                              lcrzo_int32 storeddatasize);

int lcrzo_priv_storeddata_extract(lcrzo_data *pstoreddata,
                                  lcrzo_int32 *pstoreddatasize,
                                  lcrzo_bool dataend,
                                  lcrzo_data *pdataout,
		                              lcrzo_int32 *pdataoutsize);
int lcrzo_priv_storeddata_extract_fixed(lcrzo_data *pstoreddata,
                                        lcrzo_int32 *pstoreddatasize,
                                        lcrzo_bool dataend,
                                        lcrzo_int32 wantedsize,
                                        lcrzo_data *pdataout);
int lcrzo_priv_storeddata_extract_line(lcrzo_data *pstoreddata,
                                       lcrzo_int32 *pstoreddatasize,
                                       lcrzo_bool dataend,
                                       lcrzo_data *pdataout,
		                                   lcrzo_int32 *pdataoutsize);

/*-------------------------------------------------------------*/
int lcrzo_priv_storedtlvdata_append(int type,
                                    lcrzo_data data, 
                                    lcrzo_int32 datasize,
                                    lcrzo_data *pstoredtlvdata,
                                    lcrzo_int32 *pstoredtlvdatasize);
int lcrzo_priv_storedtlvdata_insert(int type,
                                    lcrzo_data data, 
                                    lcrzo_int32 datasize,
                                    lcrzo_data *pstoredtlvdata,
                                    lcrzo_int32 *pstoredtlvdatasize);

lcrzo_bool lcrzo_priv_storedtlvdata_copyfirst(lcrzo_constdata storedtlvdata,
                                              lcrzo_int32 storedtlvdatasize,
                                              lcrzo_uint16 *ptype,
                                              lcrzo_data *pdata,
                                              lcrzo_int32 *pdatasize,
                                              lcrzo_int32 *preachedsize);
lcrzo_bool lcrzo_priv_storedtlvdata_contain(lcrzo_data storedtlvdata,
                                            lcrzo_int32 storedtlvdatasize);
lcrzo_bool lcrzo_priv_storedtlvdata_contain_fixed(lcrzo_data storedtlvdata,
                                                  lcrzo_int32 storedtlvdatasize,
                                                  lcrzo_int32 wantedsize);
lcrzo_bool lcrzo_priv_storedtlvdata_contain_line(lcrzo_data storedtlvdata,
                                                 lcrzo_int32 storedtlvdatasize);
lcrzo_bool lcrzo_priv_storedtlvdata_isatend(lcrzo_data storedtlvdata,
					    lcrzo_int32 storedtlvdatasize);

int lcrzo_priv_storedtlvdata_extractifwanted(lcrzo_data *pstoredtlvdata,
                                             lcrzo_int32 *pstoredtlvdatasize,
                                             lcrzo_bool dataend,
                                             lcrzo_uint16 wantedtype,
                                             lcrzo_int32 wantedsize,
                                             lcrzo_data *pdataout,
		                                         lcrzo_int32 *pdataoutsize);
int lcrzo_priv_storedtlvdata_extract(lcrzo_data *pstoredtlvdata,
                                     lcrzo_int32 *pstoredtlvdatasize,
                                     lcrzo_bool dataend,
                                     lcrzo_data *pdataout,
		                                 lcrzo_int32 *pdataoutsize);
int lcrzo_priv_storedtlvdata_extract_fixed(lcrzo_data *pstoredtlvdata,
                                           lcrzo_int32 *pstoredtlvdatasize,
                                           lcrzo_bool dataend,
                                           lcrzo_int32 wantedsize,
                                           lcrzo_data *pdataout);
int lcrzo_priv_storedtlvdata_extract_line(lcrzo_data *pstoredtlvdata,
                                          lcrzo_int32 *pstoredtlvdatasize,
                                          lcrzo_bool dataend,
                                          lcrzo_data *pdataout,
		                                      lcrzo_int32 *pdataoutsize);

/*-------------------------------------------------------------*/
int lcrzo_priv_global_get_intspoof_eth(lcrzo_constdevice device,
				       lcrzo_constetha ethaforcomp,
				       lcrzo_etha etha);
int lcrzo_priv_global_get_intspoof_ip(lcrzo_constdevice device,
				      lcrzo_constipa ipaforcomp,
                                      lcrzo_ipa ipa);

/*-------------------------------------------------------------*/
int lcrzo_priv_datalink_verifknown(lcrzo_uint32 datalinktype);
int lcrzo_priv_datalink_modifyheader(lcrzo_uint32 datalinktype,
				     lcrzo_constdata datain,
				     lcrzo_int32 datainsize,
				     lcrzo_data *pdataout,
				     lcrzo_int32 *pdataoutsize);

/*-------------------------------------------------------------*/
int lcrzo_priv_checkpcapincluded(lcrzo_conststring functionname);

/*-------------------------------------------------------------*/
int lcrzo_priv_strcasecmp(lcrzo_conststring s1, lcrzo_conststring s2);

/*-------------------------------------------------------------*/
int lcrzo_priv_int_fmt_check(lcrzo_conststring fmt,
			     lcrzo_bool addal,
			     lcrzo_string *pfmt);

/*-------------------------------------------------------------*/
int lcrzo_priv_fd_write(int fd,
		        lcrzo_constdata data,
		        lcrzo_int32 datasize);
int lcrzo_priv_fd_write_msg(int fd,
		            lcrzo_constdata data,
		            lcrzo_int32 datasize);
int lcrzo_priv_fd_send(int fd,
		       lcrzo_constdata data,
		       lcrzo_int32 datasize);
int lcrzo_priv_fd_send_msg(int fd,
		           lcrzo_constdata data,
		           lcrzo_int32 datasize);

int lcrzo_priv_wait_fd_wait(int fd, 
                            lcrzo_time *pmaxwaitingtime, 
			    lcrzo_bool *pevent);

/*-------------------------------------------------------------*/
int lcrzo_priv_device_init_unicode(lcrzo_constdata deviceunicode,
                                   lcrzo_device devicestr);
int lcrzo_priv_device_init_ascii(lcrzo_conststring deviceascii,
                                 lcrzo_device devicestr);
int lcrzo_priv_unicode_initm_device(lcrzo_constdevice devicestr,
                                    lcrzo_data *pdeviceunicode);
int lcrzo_priv_ascii_init_device(lcrzo_constdevice devicestr,
                                 lcrzo_device deviceascii);

/*-------------------------------------------------------------*/
#define LCRZO_PRIV_DATA_ALLOC_DEBUG 0
#if LCRZO_PRIV_DATA_ALLOC_DEBUG==2
 #include "../../../externe/checkmemory/checkmemory.h"
#endif
