z3APA3A 11 лет назад
Родитель
Сommit
50db0015d3
6 измененных файлов с 23 добавлено и 29 удалено
  1. 9 1
      src/3proxy.c
  2. 9 26
      src/auth.c
  3. 2 0
      src/plugins.c
  4. 1 1
      src/proxy.h
  5. 1 0
      src/structures.h
  6. 1 1
      src/version.h

+ 9 - 1
src/3proxy.c

@@ -1022,8 +1022,16 @@ static int h_nserver(int argc, unsigned char **argv){
 }
 
 static int h_authnserver(int argc, unsigned char **argv){
+  char *str;
 
-	authnserver = getip(argv[1]);
+	if((str = strchr((char *)argv[1], '/')))
+		*str = 0;
+	if(!getip46(46, argv[1], (struct sockaddr *)&authnserver.addr)) return 1;
+	*SAPORT(&authnserver.addr) = htons(53);
+	if(str) {
+		authnserver.usetcp = strstr(str + 1, "tcp")? 1:0;
+		*str = '/';
+	}
 	return 0;
 }
 

+ 9 - 26
src/auth.c

@@ -957,7 +957,7 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign
 }
 
 struct nserver nservers[MAXNSERVERS] = {{{0},0}, {{0},0}, {{0},0}, {{0},0}, {{0},0}};
-unsigned long authnserver;
+struct nserver authnserver;
 
 
 unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientparam* param, int makeauth){
@@ -968,7 +968,7 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa
 	if((retval = hashresolv(&dns_table, name, retttl))) {
 		return retval;
 	}
-	n = (makeauth && authnserver)? 1 : numservers;
+	n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers;
 	for(i=0; i<n; i++){
 		unsigned short nq, na;
 		unsigned char b[4098], *buf, *s1, *s2;
@@ -993,25 +993,22 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa
 		memset(sinsr, 0, sizeof(addr));
 		
 
-		if(makeauth && authnserver){
-			if((sock=so._socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) break;
-			*SAFAMILY(sinsl) = AF_INET;
-			*SAFAMILY(sinsr) = AF_INET;
+		if(makeauth && !SAISNULL(&authnserver.addr)){
+			usetcp = authnserver.usetcp;
+			*SAFAMILY(sinsl) = *SAFAMILY(&authnserver.addr);
 		}
 		else {
 			usetcp = nservers[i].usetcp;
-			if((sock=so._socket(SASOCK(&nservers[i].addr), usetcp?SOCK_STREAM:SOCK_DGRAM, usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) break;
 			*SAFAMILY(sinsl) = *SAFAMILY(&nservers[i].addr);
-
 		}
+		if((sock=so._socket(SASOCK(sinsl), usetcp?SOCK_STREAM:SOCK_DGRAM, usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) break;
 		if(so._bind(sock,sinsl,sizeof(addr))){
 			so._shutdown(sock, SHUT_RDWR);
 			so._closesocket(sock);
 			break;
 		}
-		if(makeauth && authnserver){
-			((struct sockaddr_in *)sinsr)->sin_addr.s_addr = authnserver;
-			((struct sockaddr_in *)sinsr)->sin_port = htons(53);
+		if(makeauth && !SAISNULL(&authnserver.addr)){
+			memcpy(sinsr, &authnserver.addr, sizeof(addr));
 		}
 		else {
 			memcpy(sinsr, &nservers[i].addr, sizeof(addr));
@@ -1292,18 +1289,4 @@ void logsql(struct clientparam * param, const unsigned char *s) {
 }
 
 #endif
- 
-#ifdef WITHMAIN
-int main(int argc, unsigned char * argv[]) {
-	unsigned ip = 0;
- WSADATA wd;
- WSAStartup(MAKEWORD( 1, 1 ), &wd);
-	if(argc == 2)ip=getip(argv[1]);
-	if(!hp) {
-		printf("Not found");
-		return 0;
-	}
-	printf("Name: '%s'\n", getnamebyip(ip);
-	return 0;
-}
-#endif
+ 

+ 2 - 0
src/plugins.c

@@ -79,6 +79,7 @@ struct symbol symbols[] = {
 	{symbols+48, "parsestr", (void *) parsestr},
 	{symbols+49, "make_ace", (void *) make_ace},
 	{symbols+50, "freeacl", (void *) freeacl},
+	{symbols+51, "getip46", (void *) getip46},
 	{NULL, "", NULL}
 };
 
@@ -109,6 +110,7 @@ struct pluginlink pluginlink = {
 	dobuf2,
 	scanaddr,
 	getip,
+	getip46,
 	sockmap,
 	ACLmatches,		
 	alwaysauth,

+ 1 - 1
src/proxy.h

@@ -185,7 +185,7 @@ unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nb
 int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask);
 int myinet_ntop(int af, void *src, char *dst, socklen_t size);
 extern struct nserver nservers[MAXNSERVERS];
-extern unsigned long authnserver;
+struct nserver authnserver;
 unsigned long getip(unsigned char *name);
 unsigned long getip46(int family, unsigned char *name,  struct sockaddr *sa);
 unsigned long myresolver(unsigned char *);

+ 1 - 0
src/structures.h

@@ -655,6 +655,7 @@ struct pluginlink {
 	int (*dobuf2)(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
 	int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask);
 	unsigned long (*getip)(unsigned char *name);
+	unsigned long (*getip46)(int family, unsigned char *name,  struct sockaddr *sa);
 	int (*sockmap)(struct clientparam * param, int timeo);
 	int (*ACLMatches)(struct ace* acentry, struct clientparam * param);
 	int (*alwaysauth)(struct clientparam * param);

+ 1 - 1
src/version.h

@@ -1,2 +1,2 @@
 #define VERSION "3proxy-0.8b-devel"
-#define BUILDDATE "141213192542"
+#define BUILDDATE "141213225630"