📄 hosts.c
字号:
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include "sipd.h"#define MAX_HOST 128#define DEBUG if(debug==1){#define DEND }#define AUTH "AUTH"struct hosts_t { char domain[128]; char ip[32]; int port; int auth; char passwd[128];};static struct hosts_t hosts[MAX_HOST];static struct hosts_t defaults;static int search_table(char *domain,char *ip, int *port,int *auth,char *passwd);static int search_route(MESSAGE *domain,char *ip, int *port,int *auth,char *passwd);void InitHosts(char *fname){ FILE *fp; char buff[128]; char tag[128]; char domain[128]; char auth[128]; char passwd[128]; char ip[128]; int n; int port; int i=0; if(fname==NULL) { printf("Hosts file open error \n"); exit(1); return; } defaults.domain[0]='\0'; for(n=0;n<MAX_HOST;n++){ hosts[n].domain[0]='\0'; hosts[n].passwd[0]='\0'; hosts[n].port=hosts[n].auth=0; } fp=fopen(fname,"r"); if(fp==NULL) { logging(4,"Hosts file open error(2)"); exit(1); return; } for(i=0;fgets(buff,100,fp);){ tag[0]=domain[0]=ip[0]=auth[0]='\0'; port=0; if(*buff=='\0'||*buff=='#'||*buff=='\n') continue; if(strncmp(buff,"PROXY",5)!=0)continue; n=sscanf(buff,"%s%s%s%d%s%s",tag,domain,ip,&port,auth,passwd); if(n!=4 && n!=6) { logging(3,"Host file format Error"); logging(3,buff); continue; } if(strcmp(domain,"default")==0){ strcpy(defaults.domain,domain); strcpy(defaults.ip,ip); defaults.port=port; if(strcmp(auth,AUTH)==0){ defaults.auth=YES; strncpy(defaults.passwd,passwd,127); }else{ defaults.auth=NO; } }else{ strcpy(hosts[i].domain,domain); strcpy(hosts[i].ip,ip); hosts[i].port=port; if(strcmp(auth,AUTH)==0){ hosts[i].auth=YES; strncpy(hosts[i].passwd,passwd,127); }else{ hosts[i].auth=NO; }DEBUG printf("proxy %s %s %d %d\n", hosts[i].domain, hosts[i].ip, hosts[i].port, hosts[i].auth);DEND i++; if(i>=MAX_HOST) break; } } fclose(fp); return;}static int search_table(char *domain,char *ip, int *port,int *auth,char *passwd){ int i; char *ptr1; char *ptr2; if(strcmp(domain,HOSTID)==0){ //极尸案でル〖ティング稍墙 logging(2,"Request URI is this server,respnded 404"); return NG; } for(i=0;i<MAX_HOST && hosts[i].domain[0]!='\0';i++){ if(hosts[i].domain[0]=='*'){ ptr1=&hosts[i].domain[1]; ptr2=strstr(domain,ptr1); if(ptr2!=NULL && (strlen(ptr1)==strlen(ptr2))){ strcpy(ip,hosts[i].ip); strcpy(passwd,hosts[i].passwd); *port=hosts[i].port; *auth=hosts[i].auth; return OK; } } else{ if(strcmp(domain,hosts[i].domain)==0){ strcpy(ip,hosts[i].ip); strcpy(passwd,hosts[i].passwd); *port=hosts[i].port; *auth=hosts[i].auth; return OK; } } } if(defaults.domain[0]=='\0'){ return NG; } strcpy(ip,defaults.ip); strcpy(passwd,defaults.passwd); *port=defaults.port; *auth=defaults.auth; return OK;} static int search_route(MESSAGE *mes,char *ip, int *port,int *pauth,char *ppasswd){ int ret; URI *ptr; char host[CLEN]; int aport; int auth; char passwd[128]; //Routeヘッダのトップの案黎から、啪流黎を疯年する //Reoutレコ〖ドの黎片を艰り叫す ptr=mes->header.route; mes->header.route=ptr->next; //IPとポ〖トを藐叫する ret=search_table(ptr->host,host,&aport,&auth,passwd); if(ret==OK){ //ホスト叹からIPに恃垂された strcpy(ip,host); strcpy(ppasswd,passwd); *port=aport; *pauth=auth; }else{ strcpy(ip,ptr->host); *port=ptr->port; *pauth=NO; } ret=OK; if(*port==0) *port=SIP_PORT; //极尸になっていたらエラ〖 if(strcmp(ip,HOSTID)==0){ //极尸案でル〖ティング稍墙 logging(2,"Request URI is this server(2),respnded 404"); free(ptr); return NG; } //リクエストURIが极尸になっていたら、艰り叫したRouteレコ〖ドで惧今き if(strcmp(mes->start.requri.host,HOSTID)==0){ memcpy(&mes->start.requri,ptr,sizeof(URI)); } //レコ〖ドメモリエリアをフリ〖する free(ptr); return ret;}int SearchTransferAddress(MESSAGE *mes,char *ip, int *port,int *auth,char *passwd){ int ret; if(mes==NULL || ip==NULL||port==NULL) { logging(3,"Input Para Error(Search Hosts)"); return NG; } if(mes->header.route!=NULL){ //Route ヘッダがあれば、そこにおくる ret=search_route(mes,ip,port,auth,passwd); }else{ //Request URIを傅に沸烯山を浮瑚する ret=search_table(mes->start.requri.host,ip,port,auth,passwd); } return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -