ncohafmuta-1.4.2/bot/
ncohafmuta-1.4.2/helpfiles/
ncohafmuta-1.4.2/lib/emailver/
ncohafmuta-1.4.2/tzinfo/Atlantic/
ncohafmuta-1.4.2/tzinfo/Brazil/
ncohafmuta-1.4.2/tzinfo/Chile/
ncohafmuta-1.4.2/tzinfo/Indian/
ncohafmuta-1.4.2/tzinfo/Mexico/
ncohafmuta-1.4.2/tzinfo/Mideast/
ncohafmuta-1.4.2/tzinfo/SystemV/
ncohafmuta-1.4.2/utils/
ncohafmuta-1.4.2/utils/code_fragments/new_config/
#if defined(HAVE_CONFIG_H)
#include "../hdrfiles/config.h"
#endif

#include "../hdrfiles/includes.h"

/*--------------------------------------------------------*/
/* Talker-related include files                           */ 
/*--------------------------------------------------------*/
#include "../hdrfiles/osdefs.h"
/*
#include "../hdrfiles/authuser.h"
#include "../hdrfiles/text.h"
*/
#include "../hdrfiles/constants.h"
#include "../hdrfiles/protos.h"

extern int num_of_users;     /* total number of users online           */
extern char thishost[101];
extern char mess[ARR_SIZE+25];    /* functions use mess to send output   */
extern char t_mess[ARR_SIZE+25];    /* functions use mess to send output   */


/*-------------------------------------------------------------------------*/
/* locate a free position in the array to place an incoming user.  check   */
/* both the wizard and user allocations to place the user.                 */
/*-------------------------------------------------------------------------*/
int find_free_slot(char port)
{
int u;

/*-------------------------------------------------*/
/* check for full system                           */
/*-------------------------------------------------*/

if ( (port == '1' && num_of_users >= NUM_USERS) || 
     (port == '2' && num_of_users >= MAX_USERS) )
  {
   return -1;
  }

/*-------------------------------------------------*/
/* find a free slot                                */
/*-------------------------------------------------*/

if (port=='3') {
   for (u=0;u<MAX_WHO_CONNECTS;++u)
     {
      if (strlen(whoport[u].site) < 2)
        return u;
     }
   return -1;
  }
else if (port=='4') {
   for (u=0;u<MAX_WWW_CONNECTS;++u)
     {
      if (strlen(wwwport[u].site) < 2)
        return u;
     }
   return -1;
  }
else if (port=='5') {
   for (u=0;u<MAX_MISC_CONNECTS;++u)
     {
      if (miscconn[u].sock == -1)
        return u;
     }
   return -1;
  }
else {
   for (u=0;u<MAX_USERS;++u) 
     {
      if (ustr[u].area== -1 && !ustr[u].logging_in) {
	/* CYGNUS2 */
	if (ustr[u].conv == NULL) {
		ustr[u].conv = (ConvPtr) malloc (sizeof (ConvBuffer));
		if (ustr[u].conv == NULL)       /* malloc failed */
		{
		write_log(ERRLOG,YESTIME,"MALLOC: Failed for conv buffer in find_free_slot() %s\n",get_error());
		return -1;
		}
		init_conv_buffer(ustr[u].conv);
	} /* end of if conv null */
	/* CYGNUS3 */
	if (ustr[u].Macros == NULL) {
		ustr[u].Macros = (MacroPtr) malloc (sizeof (MacroBuffer));
		if (ustr[u].Macros == NULL)       /* malloc failed */
		{
		write_log(ERRLOG,YESTIME,"MALLOC: Failed for Macros in find_free_slot() %s\n",get_error());
		return -1;
		}
		init_macro_buffer(ustr[u].Macros);
	} /* end of if Macros null */
        return u;
       } /* end of if free slot */
     } /* end of for */
  return -1;
  } /* end of else */

}


int in_connlist(int user) {
int z=-1;

for (z=0;z<MAX_CONNLIST_ENTRIES;++z) {
 if (!strcmp(connlist[z].site,ustr[user].site)) {
	write_log(DEBUGLOG,YESTIME,"in_connlist: found in connlist pos %d\n",z);
	return z;
 }
} /* for */

return -1;
}


int find_free_connslot(void) {
int z=0;
int lowest=0,lowestpos=0;

for (z=0;z<MAX_CONNLIST_ENTRIES;++z) {
 if (connlist[z].connections == 0) return z;
} /* for */

write_log(DEBUGLOG,YESTIME,"find_free_connslot: all slots full\n");

/* all slots used, bump lowest one */
lowest=connlist[0].connections; /* we need to start somewhere */
lowestpos=0;

for (z=1;z<MAX_CONNLIST_ENTRIES;++z) {
 if (connlist[z].connections <= lowest) {
  lowest=connlist[z].connections;
  lowestpos=z;
 } /* if */
} /* for */

return lowestpos;
}


void realloc_str(char** strP, int size) {
int maxsizeP;

        maxsizeP = size * 5 / 4;
        *strP = RENEW( *strP, char, maxsizeP + 1 );

    if ( *strP == (char*) 0 )
        {
        write_log(ERRLOG,YESTIME,"QW : ERRNO: REALLOC: Out of memory!\n");
        }
}


/* If the errno is one within the cases below, the calling function is */
/* told it is ok to continue (i.e. a non-fatal error) */
int errno_ok(int myerr) {

switch(myerr) {
#ifdef EPROTO
                case EPROTO:
#endif
#if defined(EINTR) && ((EPROTO) != (EINTR))
                case EINTR:
#endif
#ifdef EAGAIN
                case EAGAIN:
#endif
#ifdef EPIPE
                case EPIPE:
#endif
#ifdef ECONNABORTED
                case ECONNABORTED:
#endif
                    /* Linux generates the rest of these, other tcp
                     * stacks (i.e. bsd) tend to hide them behind
                     * getsockopt() interfaces.  They occur when
                     * the net goes sour or the client disconnects
                     * after the three-way handshake has been done
                     * in the kernel but before userland has picked
                     * up the socket.
                     */
#ifdef ECONNRESET
                case ECONNRESET:
#endif
#ifdef ETIMEDOUT
                case ETIMEDOUT:
#endif
#ifdef EHOSTUNREACH
                case EHOSTUNREACH:
#endif
#ifdef ENETUNREACH
                case ENETUNREACH:
#endif
                    break;
		default: return 0;
}

return 1;
}


void check_connlist_entries(int mode) {
int z=0;

for (z=0;z<MAX_CONNLIST_ENTRIES;++z) {
 if (mode==-1) {
  /* boot init */
  goto DOCLEAR;
 }
 else if (mode==-2) {
  /* per-minute clear */
/*
  write_log(DEBUGLOG,YESTIME,"check_connlist_entries: per-minute: checking connlist pos %d\n",z);
*/
  if ((time(0) - connlist[z].starttime) >= 60) goto DOCLEAR;
  else continue;
 } /* else if */
 else {
  /* specific clear */
  z=mode;
  goto DOCLEAR;
 } /* else */

DOCLEAR:
/*
 write_log(DEBUGLOG,YESTIME,"check_connlist_entries: expiring connlist pos %d\n",z);
*/
 connlist[z].site[0]=0;
 connlist[z].connections=0;
 connlist[z].starttime=0;
 if (mode >= 0) break;
} /* for */

}