extern IscMaster *
isc_initialize(IscMasterConfig  * cfg);

extern void
isc_shutdown(IscMaster  * mcb);

extern int
isc_destroy(IscMaster  * mcb, IscSession  * scb);

extern int
isc_sessions(IscMaster  * mcb);



extern IscEvent *
isc_getnextevent(IscMaster  * mcb,
		 long         timeout);

extern void
isc_dispose(IscEvent  * ecb);



extern void
isc_flush(IscSession  * scb);

extern int
isc_send(IscSession  * scb, IscMessage  * mcb);



extern int
isc_write(IscSession  * scb,
	  const void  * buffer,
	  size_t        length);

extern int
isc_putc(int           chr,
	 IscSession  * scb);

extern int
isc_printf(IscSession  * scb,
	   const char  * format,
	   ...);

extern int
isc_vprintf(IscSession  * scb,
	    const char  * format,
	    va_list       AP);



extern IscMessage *
isc_allocmsg(size_t  size);

extern IscMessage *
isc_reallocmsg(IscMessage  * msg,
	       size_t        size);

extern IscMessage *
isc_copymsg(IscMessage  *msg);

extern void
isc_freemsg(IscMessage  * msg);

extern IscMessage *
isc_mkstrmsg(const char  * str);



extern IscSession *
isc_create(IscSessionConfig *cfg, IscHandler *fun);

extern int
isc_enable(IscSession *scb);

extern int
isc_disable(IscSession *scb);

extern int
isc_insert(IscMaster *mcb, IscSession *scb);

extern int
isc_remove(IscMaster *mcb, IscSession *scb);



extern IscSession *
isc_openfd(IscMaster  * mcb,
	   int          fd);

extern void
isc_close(IscSession  * scb);

extern IscSession *
isc_openfile(IscMaster   * mcb,
	     const char  * pathname,
	     int           openmode);



extern IscSession *
isc_createtcp(IscSessionConfig *cfg);

extern int
isc_bindtcp(IscSession *scb, const char *address, const char *port);

extern int
isc_connecttcp(IscSession *scb, const char *address, const char *port);

extern IscSession *
isc_opentcp(IscMaster   * mcb,
	    const char  * address,
	    const char  * service);

extern IscSession *
isc_listentcp(IscMaster   * mcb,
	      const char  * address,
	      const char  * service);



extern IscSession *
isc_createudp(IscSessionConfig *cfg);

extern int
isc_bindudp(IscSession *scb, const char *address, const char *port);

extern int
isc_connectudp(IscSession *scb, const char *address, const char *port);

extern IscSession *
isc_listenudp(IscMaster   * mcb,
	      const char  * address,
	      const char  * service);

extern IscSession *
isc_openudp(IscMaster   * mcb,
	    const char  * address,
	    const char  * service);



extern IscAddress *
isc_getladdress(IscSession *scb);

extern IscAddress *
isc_getraddress(IscSession *scb);

extern void
isc_freeaddress(IscAddress *addr);

extern IscAddress *
isc_copyaddress(IscAddress *addr);

extern char *
isc_getipnum(IscAddress *ia,
	     char *address,
	     int len);

extern char *
isc_gethostname(IscAddress *ia,
		char *address,
		int len);

extern int
isc_getportnum(IscAddress *ia);

extern char *
isc_getservice(IscAddress *sa,
	       char *buf,
	       int len,
	       IscSessionType type);



extern IscHandler *
isc_newhandler(void);

extern void
isc_freehandler(IscHandler *hcb);

extern IscHandler *
isc_copyhandler(IscHandler *hcb);

extern void
isc_pushhandler(IscSession *scb, IscHandler *hcb);

extern IscHandler *
isc_pophandler(IscSession *scb);



extern void
isc_setlogfn(void (*logfn)(const char  * format, va_list AP));

extern void
isc_setallocfn(void  * (*mallocfn)(size_t size),
               void  * (*reallocfn)(void  * buf, size_t size),
	       void    (*freefn)(void  * buf));

extern void
isc_setabortfn(void (*abortfn)(const char  * msg));



#define ISC_HCALLFUN1(HLIST,NAME,ARG) \
  (*HLIST->old.NAME->hcb->NAME)(HLIST->old.NAME, ARG)

#define ISC_HCALLFUN2(HLIST,NAME,A1,A2) \
  (*HLIST->old.NAME->hcb->NAME)(HLIST->old.NAME, A1, A2)

#define ISC_HCALLFUN3(HLIST,NAME,A1,A2,A3) \
  (*HLIST->old.NAME->hcb->NAME)(HLIST->old.NAME, A1, A2, A3)
	
