/*-------------------------------------------------------------*/ /*************************************************************** * Functions herein allow to create a new netwib_io. * ***************************************************************/ /*-------------------------------------------------------------*/ /*************************************************************** * Following functions can return : * * - NETWIB_ERR_OK : the job was done (by the io or a next in * * the chain) * * - NETWIB_ERR_PLEASETRYNEXT : the io doesn't know how to do * * what was requested, so please * * try next * * - NETWIB_ERR_PLEASECONSTRUCT : if way is * * NETWIB_IO_WAYTYPE_RDWR or * * _SUPPORTED, the library has * * to do the task using _READ * * and _WRITE * * - NETWIB_ERR_PLEASELOOPTIME : there is no event, so please * * loop to reach abstime * ***************************************************************/ /* Function called when netwib_io_read is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT */ typedef netwib_err (*netwib_io_read_pf)(netwib_io *pio, netwib_buf *pbuf); /* Function called when netwib_io_write is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT */ typedef netwib_err (*netwib_io_write_pf)(netwib_io *pio, netwib_constbuf *pbuf); /* Function called when netwib_io_wait is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT NETWIB_ERR_PLEASECONSTRUCT NETWIB_ERR_PLEASELOOPTIME */ typedef netwib_err (*netwib_io_wait_pf)(netwib_io *pio, netwib_io_waytype way, netwib_consttime *pabstime, netwib_bool *pevent); /* Function called when netwib_io_unread is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT */ typedef netwib_err (*netwib_io_unread_pf)(netwib_io *pio, netwib_constbuf *pbuf); /* Function called when netwib_io_ctl_set is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT NETWIB_ERR_PLEASECONSTRUCT */ typedef netwib_err (*netwib_io_ctl_set_pf)(netwib_io *pio, netwib_io_waytype way, netwib_io_ctltype ctltype, netwib_ptr p, netwib_uint32 ui); /* Function called when netwib_io_ctl_get is called on the io This function should return : NETWIB_ERR_OK NETWIB_ERR_PLEASETRYNEXT NETWIB_ERR_PLEASECONSTRUCT */ typedef netwib_err (*netwib_io_ctl_get_pf)(netwib_io *pio, netwib_io_waytype way, netwib_io_ctltype ctltype, netwib_ptr p, netwib_uint32 *pui); /* Function called when netwib_io_close is called on the io This function should return : NETWIB_ERR_OK */ typedef netwib_err (*netwib_io_close_pf)(netwib_io *pio); /*-------------------------------------------------------------*/ /* Name : netwib_io_init Description : Create a user defined netwib_io. Input parameter(s) : readsupported : read is supported writesupported : write is supported pcommon : common data which can be shared between functions pfx : functions or NULL if not needed Input/output parameter(s) : Output parameter(s) : **ppio : io created Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_io_init(netwib_bool readsupported, netwib_bool writesupported, netwib_ptr pcommon, netwib_io_read_pf pfread, netwib_io_write_pf pfwrite, netwib_io_wait_pf pfwait, netwib_io_unread_pf pfunread, netwib_io_ctl_set_pf pfctl_set, netwib_io_ctl_get_pf pfctl_get, netwib_io_close_pf pfclose, netwib_io **ppio); /*-------------------------------------------------------------*/ /*************************************************************** * Those structure definitions should only be used in functions* * for netwib_io_init. * ***************************************************************/ typedef struct { netwib_io *pnext; /* next io in the chain */ netwib_bool supported; /* true if way is supported */ netwib_uint32 numusers; /* number of io using this one */ } netwib_io_way_t; struct netwib_io { netwib_io_way_t rd; /* read information */ netwib_io_way_t wr; /* write information */ netwib_ptr pcommon; /* pointer used in netwib_io_init */ netwib_io_write_pf pfwrite; netwib_io_read_pf pfread; netwib_io_unread_pf pfunread; netwib_io_wait_pf pfwait; netwib_io_ctl_set_pf pfctl_set; netwib_io_ctl_get_pf pfctl_get; netwib_io_close_pf pfclose; }; /*-------------------------------------------------------------*/ /*************************************************************** * Previous structure is useful to do simple things. But, * * it's complicated to deal with several netwib_io_waytype. * * Those defines can be used : * * - to work on "pnext", use netwib_io_next (in io.h) * * - to work on "supported", use netwib_io_ctl_s/get_support * * - to work on "numusers", use netwib_io_ctl_s/get_numusers * ***************************************************************/ /* netwib_err f(netwib_io *pio, netwib_io_waytype way, netwib_bool yes); */ #define netwib_io_ctl_set_support(pio,way,yes) netwib_io_ctl_set(pio,way,NETWIB_IO_CTLTYPE_SUPPORT,NULL,(netwib_uint32)yes) #define netwib_io_ctl_get_support(pio,way,pyes) netwib_io_ctl_get(pio,way,NETWIB_IO_CTLTYPE_SUPPORT,NULL,(netwib_uint32*)pyes) /* netwib_err f(netwib_io *pio,netwib_io_waytype way,netwib_uint32 numusers);*/ #define netwib_io_ctl_set_numusers(pio,way,numusers) netwib_io_ctl_set(pio,way,NETWIB_IO_CTLTYPE_NUMUSERS,NULL,numusers) #define netwib_io_ctl_get_numusers(pio,way,pnumusers) netwib_io_ctl_get(pio,way,NETWIB_IO_CTLTYPE_NUMUSERS,NULL,pnumusers) /* only increment or decrement */ #define netwib_io_ctl_set_numusers_inc(pio,way) netwib_io_ctl_set(pio,way,NETWIB_IO_CTLTYPE_NUMUSERSINC,NULL,+1) #define netwib_io_ctl_set_numusers_dec(pio,way) netwib_io_ctl_set(pio,way,NETWIB_IO_CTLTYPE_NUMUSERSINC,NULL,(netwib_uint32)-1)