/*-------------------------------------------------------------*/ /*************************************************************** * An IP range is of the form : * * ip4inf ip4sup * * 1.2.3.4 : 1.2.3.4 1.2.3.4 * * 1.2.3.4-5.6.7.8 : 1.2.3.4 5.6.7.8 * * 1.2.3.0/255.255.255.0 : 1.2.3.0 1.2.3.255 * * 1.2.3.0/24 : 1.2.3.0 1.2.3.255 * * 1.2.3/255.255.255.0 : 1.2.3.0 1.2.3.255 * * 1.2.3/24 : 1.2.3.0 1.2.3.255 * * 1.2.3.0%255.255.255.O : 1.2.3.1 1.2.3.254 * * 1.2.3.0%24 : 1.2.3.1 1.2.3.254 * * 1.2.3%255.255.255.O : 1.2.3.1 1.2.3.254 * * 1.2.3%24 : 1.2.3.1 1.2.3.254 * * fec0:0:0:1::1 : fec0:0:0:1::1 fec0:0:0:1::1 * * Notes : * * - '%' has the same meaning as '/', except that the * * broadcast addresses are excluded from range. * * - It is possible to use a hostname range as input. In this * * case the separator is '=' (because '-' is a valid * * hostname separator). * * * * An netwib_ips is of the form : * * ip,ip,iprange,iprange * * all,!ip,!iprange * * * * Complete examples : * * 1.2.3.4 * * 1.2.3.4-1.2.3.5 * * 1.2.3.4,5.6.7.8 * * 1.2.3.4,1.2.3.56-1.2.3.58 * * all,!1.2.3.4,!1.2.4.4-1.2.4.6 * * hostname * * host1=host2 * * host1,host2 * ***************************************************************/ /*-------------------------------------------------------------*/ /*************************************************************** * Those functions ignores following error cases : * * - if we try to add a value already in the list * * - if we try to remove a value not in the list * ***************************************************************/ /*-------------------------------------------------------------*/ typedef struct netwib_ips netwib_ips; typedef const netwib_ips netwib_constips; /*-------------------------------------------------------------*/ /* Name : netwib_ips_init Description : Initialize a netwib_ips used to store IP list. Input parameter(s) : inittype : if future added items will be sorted and/or unique Input/output parameter(s) : Output parameter(s) : **ppips : netwib_ips allocated and initialized Normal return values : NETWIB_ERR_OK : ok */ typedef enum { NETWIB_IPS_INITTYPE_SORTUNIQ = 1, /* sorted and unique */ NETWIB_IPS_INITTYPE_NOTSORTUNIQ = 2, /* not sorted and unique */ NETWIB_IPS_INITTYPE_NOTSORTNOTUNIQ = 3 /* not sorted and not unique (duplicates are not removed) */ } netwib_ips_inittype; netwib_err netwib_ips_init(netwib_ips_inittype inittype, netwib_ips **ppips); #define netwib_ips_initdefault(ppips) netwib_ips_init(NETWIB_IPS_INITTYPE_SORTUNIQ,ppips) /*-------------------------------------------------------------*/ /* Name : netwib_ips_close Description : Close a netwib_ips. Input parameter(s) : Input/output parameter(s) : **ppips : netwib_ips closed Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_close(netwib_ips **ppips); /*-------------------------------------------------------------*/ /* Name : netwib_ips_add_ip Description : Add an address to the netwib_ips. Input parameter(s) : ip : address to add Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_add_ip(netwib_ips *pips, netwib_constip *pip); /*-------------------------------------------------------------*/ /* Name : netwib_ips_add_iprange Description : Add a range of addresses to the netwib_ips. Input parameter(s) : infip : inferior ip supip : superior ip Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_add_iprange(netwib_ips *pips, netwib_constip *pinfip, netwib_constip *psupip); /*-------------------------------------------------------------*/ /* Name : netwib_ips_add_ips Description : Add a list of addresses to the netwib_ips. Input parameter(s) : *pipstoadd : netwib_ips to add Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_add_ips(netwib_ips *pips, netwib_constips *pipstoadd); /*-------------------------------------------------------------*/ /* Name : netwib_ips_add_buf Description : Update a netwib_ips with a string like "1.2.3.4-1.2.3.5". Input parameter(s) : pbuf : buffer containing string Input/output parameter(s) : *pips : netwib_ips updated Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok Note : If an error occurs during insertion, result will only contain partial data. It's developer's job to use a temporary netwib_ips to deal with such errors. */ netwib_err netwib_ips_add_buf(netwib_ips *pips, netwib_constbuf *pbuf); /*-------------------------------------------------------------*/ /* Name : netwib_ips_add_kbd Description : Update a netwib_ips with data entered through keyboard. Input parameter(s) : *pmessage : message to print before *pdefaultlist : default list to use if user enters nothing if NULL, there is no default Input/output parameter(s) : *pips : netwib_ips updated Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_add_kbd(netwib_ips *pips, netwib_constbuf *pmessage, netwib_constbuf *pdefaultlist); /*-------------------------------------------------------------*/ /* Name : netwib_ips_del_ip Description : Del an address to the netwib_ips. Input parameter(s) : ip : address to delete Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_del_ip(netwib_ips *pips, netwib_constip *pip); /*-------------------------------------------------------------*/ /* Name : netwib_ips_del_iprange Description : Del a range of addresses to the netwib_ips. Input parameter(s) : infip : inferior ip supip : superior ip Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_del_iprange(netwib_ips *pips, netwib_constip *pinfip, netwib_constip *psupip); /*-------------------------------------------------------------*/ /* Name : netwib_ips_del_ips Description : Remove a list of addresses to the netwib_ips. Input parameter(s) : *pipstodel : netwib_ips to remove Input/output parameter(s) : *pips : netwib_ips where to work Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_del_ips(netwib_ips *pips, netwib_constips *pipstodel); /*-------------------------------------------------------------*/ /* Name : netwib_ips_contains_xyz Description : Check if a netwib_ip is in the list. Input parameter(s) : ip : netwib_ip to find Input/output parameter(s) : *pips : netwib_ips containing the list of addresses Output parameter(s) : *pyes : true if netwib_ip is found Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_ips_contains_ip(netwib_constips *pips, netwib_constip *pip, netwib_bool *pyes); netwib_err netwib_ips_contains_iprange(netwib_constips *pips, netwib_constip *pinfip, netwib_constip *psupip, netwib_bool *pyes); /*-------------------------------------------------------------*/ typedef enum { NETWIB_IPS_ENCODETYPE_HNRANGE = 1,/* "host1=host2,etc." */ NETWIB_IPS_ENCODETYPE_IPRANGE, /* "1.2.3.4-1.2.3.5,etc." */ NETWIB_IPS_ENCODETYPE_IPNUMBER, /* "1.1.1.0/24,etc." */ NETWIB_IPS_ENCODETYPE_IPMASK, /* "1.1.1.0/255.255.255.255" */ NETWIB_IPS_ENCODETYPE_HNBEST = NETWIB_IPS_ENCODETYPE_HNRANGE, NETWIB_IPS_ENCODETYPE_IPBEST = NETWIB_IPS_ENCODETYPE_IPRANGE, NETWIB_IPS_ENCODETYPE_BEST = NETWIB_IPS_ENCODETYPE_IPBEST } netwib_ips_encodetype; /*-------------------------------------------------------------*/ /* Name : netwib_buf_append_ips Description : Append a string representing a netwib_ips. Input parameter(s) : *pips : netwib_ips to append Input/output parameter(s) : pbuf : buffer updated Output parameter(s) : Normal return values : NETWIB_ERR_OK : ok */ netwib_err netwib_buf_append_ips(netwib_constips *pips, netwib_ips_encodetype encodetype, netwib_buf *pbuf);