JunkBox_Lib  1.10.2
ipaddr_tool.h File Reference

IP Address Tool Header. More...

#include "network.h"
#include "tlist.h"
Include dependency graph for ipaddr_tool.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

tListread_ipaddr_file (char *fn)
 
tListread_ipaddr_fp (FILE *fp)
 
tListto_ipaddress_list (tList *lp)
 
int is_host_in_list (tList *lp, unsigned char *, char *host)
 
int is_ipaddr_num_in_list (tList *lp, unsigned char *ipnum)
 
void print_address_in_list (FILE *fp, tList *lp)
 

Detailed Description

Author
Fumi Iseki
Date
2005 09/21

Definition in file ipaddr_tool.h.

Function Documentation

◆ is_host_in_list()

int is_host_in_list ( tList lp,
unsigned char *  num,
char *  hname 
)

int is_host_in_list(tList* lp, unsigned char* num, char* hname)

リストlpの キー部に格納されている ホスト情報と num, hname が同じネットワークに属するか どうかをチェックする.num と hname はどちらか一方が指定されていれば十分である.

先ず,lpのキー部(FQDN)と hname が比較される.つまり,キー部がドメイン名の一部の場合は hnameと比較する(後方一致).
次に,lpのキー部がドメイン名でない場合(IPアドレスの場合)は num と比較される.

Parameters
lpチェックするIPアドレス(文字列)の格納されているリスト.
num比較するIPアドレス(1byte unsigned 整数型)4Byte. 8Byte型(addr/mask)でも作動するが,ネットマスク部はされる.
hname比較するホスト名(文字列).通常は numから逆引きされたもの.
Return values
TRUEリスト中に同じネットワークに属するエントリが存在する.
FALSEリスト中に同じネットワークに属するエントリは存在しない.

Definition at line 143 of file ipaddr_tool.c.

144 {
145  unsigned char* addr;
146 
147  if (lp==NULL) return FALSE;
148  if (lp->ldat.key.buf==NULL) return FALSE;
149  if (hname==NULL && num==NULL) return FALSE;
150 
151  while (lp!=NULL) {
152  if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
153  addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 0);
154  if (addr==NULL && hname!=NULL) {
155  if (!strnrvscmp((const char*)lp->ldat.key.buf, hname, (int)strlen((const char*)lp->ldat.key.buf))) return TRUE;
156  }
157  else if(addr!=NULL && num!=NULL) {
158  if (is_same_network_num_ipv4(addr, num, &(addr[4]))) return TRUE;
159  }
160  }
161  lp = lp->next;
162  }
163 
164  return FALSE;
165 }
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
#define is_same_network_num_ipv4(a1, a2, m)
Definition: network.h:263
#define to_address_num8_ipv4(a, m)
IPv4 アドレス(文字列)→ [IPv4 アドレス],[ネットマスク](数字8byte)
Definition: network.h:249
int strnrvscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.一致するなら 0
Definition: tools.c:674

References FALSE, is_same_network_num_ipv4, strnrvscmp(), to_address_num8_ipv4, and TRUE.

Here is the call graph for this function:

◆ is_ipaddr_num_in_list()

int is_ipaddr_num_in_list ( tList lp,
unsigned char *  num 
)

int is_ipaddr_num_in_list(tList* lp, unsigned char* num)

リストlpの キー部に格納されている ホスト情報と num が同じネットワークに属するかどうかをチェックする.
リストのキー部がFQDNであってもチェック可能.

Parameters
lpチェックするIPアドレス(文字列)の格納されているリスト.
num比較するIPアドレス(バイナリ)4Byte. 8Byte型(addr/mask)でも作動するが,ネットマスク部は無視される.
Return values
TRUEリスト中に同じネットワークに属するエントリが存在する.
FALSEリスト中に同じネットワークに属するエントリは存在しない.

Definition at line 181 of file ipaddr_tool.c.

182 {
183  unsigned char* addr;
184 
185  if (lp==NULL || num==NULL) return FALSE;
186  if (lp->ldat.key.buf==NULL) return FALSE;
187 
188  while (lp!=NULL) {
189  if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
190  addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
191  if (addr!=NULL) {
192  if (is_same_network_num_ipv4(num, addr, &(addr[4]))) return TRUE;
193  }
194  }
195  lp = lp->next;
196  }
197 
198  return FALSE;
199 }

References FALSE, is_same_network_num_ipv4, to_address_num8_ipv4, and TRUE.

◆ print_address_in_list()

void print_address_in_list ( FILE *  fp,
tList lp 
)

void print_address_in_list(FILE* fp, tList* lp)

リスト中のドメイン名,またはIPアドレスを表示する. FQDNはIPアドレスに変換して表示する.

Parameters
fp出力先のファイル記述子
lpドメイン名またはIPアドレスをキー部に格納したリストへのポインタ

Definition at line 211 of file ipaddr_tool.c.

212 {
213  unsigned char* addr;
214 
215  while (lp!=NULL) {
216  if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
217  addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
218  if (addr!=NULL) {
219  fprintf(fp, "[%d.%d.%d.%d/%d.%d.%d.%d]\n", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
220  }
221  else { // 恐らくドメイン名
222  fprintf(fp, "[%s]\n", lp->ldat.key.buf);
223  }
224  }
225  lp = lp->next;
226  }
227  return;
228 }

References to_address_num8_ipv4.

◆ read_ipaddr_file()

tList* read_ipaddr_file ( char *  fn)

tList* read_ipaddr_file(char* fn)

ファイルから IPアドレスを読み込んで,[IPアドレス]/[ネットマスク] の形式に 変換して,リストに格納する.FQDNはIPアドレスに変換される.
FQDNでないドメイン名,文字列は / 以後を無視して文字列のままリストに格納する.

データの読み取り時に次の処理が行なわれる.

  • 前後の空白,CR,LFは削除される
  • 空行は無視される.
  • # 以降は無視される.
Parameters
fnファイル名
Returns
リストへのポインタ

Definition at line 25 of file ipaddr_tool.c.

26 {
27  tList* lp;
28  tList* lt;
29 
30  lp = read_tList_file(fn, 2);
31  if (lp==NULL) return NULL;
32 
33  lt = to_ipaddress_list(lp);
34  del_all_tList(&lp);
35 
36  return lt;
37 }
tList * to_ipaddress_list(tList *lp)
Definition: ipaddr_tool.c:83
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition: tlist.c:769
tList * read_tList_file(const char *fname, int mode)
ファイルから一行ずつ読み込んでリストのキー部に格納.空行はリストに加えない.
Definition: tlist.c:2127

References del_all_tList(), read_tList_file(), and to_ipaddress_list().

Here is the call graph for this function:

◆ read_ipaddr_fp()

tList* read_ipaddr_fp ( FILE *  fp)

tList* read_ipaddr_fp(FILE* fp)

ファイルから IPアドレスを読み込んで,[IPアドレス]/[ネットマスク] の形式に 変換して,リストに格納する.FQDNはIPアドレスに変換される.
FQDNでないドメイン名,文字列は / 以後を無視して文字列のままリストに格納する.

データの読み取り時に次の処理が行なわれる.

  • 前後の空白,CR,LFは削除される
  • 空行は無視される.
  • # で始まる,または 空白(複数)# で始まる行は無視される.
Parameters
fpファイルポインタ
Returns
リストへのポインタ

Definition at line 55 of file ipaddr_tool.c.

56 {
57  tList* lp;
58  tList* lt;
59 
60  lp = read_tList_fp(fp, 1);
61  if (lp==NULL) return NULL;
62 
63  lt = to_ipaddress_list(lp);
64  del_all_tList(&lp);
65 
66  return lt;
67 }
tList * read_tList_fp(FILE *fp, int mode)
ファイルポインタが示すファイルから一行ずつ読み込んでリストのキー部に格納.
Definition: tlist.c:2158

References del_all_tList(), read_tList_fp(), and to_ipaddress_list().

Here is the call graph for this function:

◆ to_ipaddress_list()

tList* to_ipaddress_list ( tList lp)

tList* to_ipaddress_list(tList* lp)

リスト中の IPアドレスを [IPアドレス]/[ネットマスク] の形式に 変換して,新しいリストに格納する.FQDNはIPアドレスに変換される.
変換に to_address_num8() を使用.CIDER対応.

FQDNでないドメイン名,文字列は / 以後を無視して文字列のまま 新しいリストに格納する. 後の is_host_in_list()などを高速に行なうための前処理.

Parameters
lp変換前(ファイルなどから読み込んだまま)のデータの入ったリスト
Returns
変換して新しく生成したリスト.

Definition at line 83 of file ipaddr_tool.c.

84 {
85  unsigned char* num;
86  char* addr;
87  tList* ls = NULL;
88  tList* lt = NULL;
89 
90  if (lp==NULL) return NULL;
91  if (lp->ldat.key.buf==NULL) return NULL;
92 
93  while (lp!=NULL) {
94  if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
95  if ((lp->ldat.key.buf)[0]!='#') {
96  num = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
97  if (num!=NULL) {
98  addr = to_address_char8_ipv4(num);
99  free(num);
100  if (addr!=NULL) {
101  ls = add_tList_node_str(ls, addr, NULL);
102  free(addr);
103  } // ここで addr==NULL となる場合はメモリ不足のみ
104  }
105  else {
106  addr = awk((char*)lp->ldat.key.buf, '/', 1);
107  if (addr!=NULL) {
108  int i = 0;
109  while(addr[i]!='\0' && addr[i]!=',' && addr[i]!=' ') i++;
110  addr[i] = '\0';
111  ls = add_tList_node_str(ls, addr, NULL);
112  free(addr);
113  }
114  }
115  if (lt==NULL) lt = ls;
116  }
117  }
118  lp = lp->next;
119  }
120 
121  return lt;
122 }
#define to_address_char8_ipv4(a)
[IPv4 アドレス],[ネットマスク](数字8byte)→ IPv4 アドレス(文字列)
Definition: network.h:251
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition: tlist.h:142
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition: tools.c:567

References add_tList_node_str, awk(), to_address_char8_ipv4, and to_address_num8_ipv4.

Referenced by read_ipaddr_file(), and read_ipaddr_fp().

Here is the call graph for this function:
Here is the caller graph for this function: