Quellcode durchsuchen

Added IPv6 support for 'external' command and -e

Now, 2 external addresses can be specified: one for IPv4 and one for
IPv6
z3APA3A vor 11 Jahren
Ursprung
Commit
f1e017394d
6 geänderte Dateien mit 52 neuen und 24 gelöschten Zeilen
  1. 11 2
      src/3proxy.c
  2. 5 3
      src/common.c
  3. 6 6
      src/datatypes.c
  4. 25 8
      src/proxymain.c
  5. 4 4
      src/structures.h
  6. 1 1
      src/version.h

+ 11 - 2
src/3proxy.c

@@ -732,7 +732,16 @@ static int h_internal(int argc, unsigned char ** argv){
 }
 
 static int h_external(int argc, unsigned char ** argv){
-	conf.extip = getip(argv[1]);
+	int res;
+#ifndef NOIPV6
+	struct sockaddr_in6 sa6;
+	res = getip46(46, argv[1], (struct sockaddr *)&sa6);
+	if(!res) return 1; 
+	memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&conf.extsa:(void *)&conf.extsa6, &sa6, SASIZE(&sa6)); 
+#else
+	res = getip46(46, argv[1], (struct sockaddr *)&conf.extsa);
+	if(!res) return 1; 
+#endif
 	return 0;
 }
 
@@ -2040,7 +2049,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
 
   {
 	char * args[] = {"auth", "iponly", NULL};
-  	h_auth(2, args);
+  	h_auth(2, (unsigned char **)args);
   }
 
   res = readconfig(fp);

+ 5 - 3
src/common.c

@@ -65,9 +65,11 @@ struct extparam conf = {
 	NULL, NULL,
 	NONE, NONE,
 	NULL,
-	{AF_INET}, 
-	INADDR_ANY, 
-	0,
+#ifndef NOIPV6
+	{AF_INET},{AF_INET6},{AF_INET}, 
+#else
+	{AF_INET},{AF_INET}, 
+#endif
 	NULL,
 	NULL,
 	doconnect,

+ 6 - 6
src/datatypes.c

@@ -564,12 +564,12 @@ static void * ef_server_intsa(struct node * node){
 	return &((struct srvparam *)node->value) -> intsa;
 }
 
-static void * ef_server_extip(struct node * node){
-	return &((struct srvparam *)node->value) -> extip;
+static void * ef_server_extsa(struct node * node){
+	return &((struct srvparam *)node->value) -> extsa;
 }
 
-static void * ef_server_extport(struct node * node){
-	return &((struct srvparam *)node->value) -> extport;
+static void * ef_server_extsa6(struct node * node){
+	return &((struct srvparam *)node->value) -> extsa6;
 }
 
 static void * ef_server_acl(struct node * node){
@@ -754,8 +754,8 @@ static struct property prop_server[] = {
 	{prop_server + 3, "targetport", ef_server_targetport, TYPE_PORT, "portmapper target port"},
 	{prop_server + 4, "starttime", ef_server_starttime, TYPE_DATETIME, "service started seconds"},
 	{prop_server + 5, "intsa", ef_server_intsa, TYPE_SA, "ip address of internal interface"},
-	{prop_server + 6, "extip", ef_server_extip, TYPE_IP, "ip address of external interface"},
-	{prop_server + 7, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"},
+	{prop_server + 6, "extsa", ef_server_extsa, TYPE_SA, "ip address of external interface"},
+	{prop_server + 7, "extsa6", ef_server_extsa6, TYPE_SA, "ipv6 address of external interface"},
 	{prop_server + 8, "auth", ef_server_auth, TYPE_STRING, "service authentication type"},
 	{prop_server + 9, "acl", ef_server_acl, TYPE_ACE, "access control list"},
 	{prop_server + 10, "singlepacket", ef_server_singlepacket, TYPE_INTEGER, "is single packet redirection"},

+ 25 - 8
src/proxymain.c

@@ -176,7 +176,15 @@ int MODULEMAINFUNC (int argc, char** argv){
 			getip46(46, argv[i]+2, (struct sockaddr *)&srv.intsa);
 			break;
 		 case 'e':
-			srv.extip = getip((unsigned char *)argv[i]+2);
+			{
+#ifndef NOIPV6
+				struct sockaddr_in6 sa6;
+				error = !getip46(46, argv[i]+2, (struct sockaddr *)&sa6);
+				if(!error) memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&srv.extsa:(void *)&srv.extsa6, &sa6, SASIZE(&sa6)); 
+#else
+				error = !getip46(46, argv[i]+2, (struct sockaddr *)&srv.extsa);
+#endif
+			}
 			break;
 		 case 'p':
 			*SAPORT(&srv.intsa) = htons(atoi(argv[i]+2));
@@ -313,6 +321,10 @@ int MODULEMAINFUNC (int argc, char** argv){
  srvinit2(&srv, &defparam);
  if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET;
  if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port);
+ *SAFAMILY(&srv.extsa) = AF_INET;
+#ifndef NOIPV6
+ *SAFAMILY(&srv.extsa6) = AF_INET6;
+#endif
  if(hostname)parsehostname(hostname, &defparam, childdef.port);
 
 
@@ -535,6 +547,10 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
  *SAFAMILY(&param->req) = *SAFAMILY(&param->sins) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET;
  pthread_mutex_init(&srv->counter_mutex, NULL);
  memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa));
+ memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa));
+#ifndef NOIPV6
+ memcpy(&srv->extsa6, &conf.extsa6, sizeof(srv->extsa6));
+#endif
 }
 
 void srvinit2(struct srvparam * srv, struct clientparam *param){
@@ -550,12 +566,9 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){
 	else srv->logformat = (unsigned char *)mystrdup((char *)srv->logformat);
  }
  if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget);
- if(!*SAFAMILY(&srv->intsa)) *SAFAMILY(&srv->intsa) = AF_INET;
  memcpy(&param->sincr, &srv->intsa, sizeof(param->sincr));
- if(!srv->extip) srv->extip = conf.extip;
- param->sins.sin_addr.s_addr = param->extip = srv->extip;
- if(!srv->extport) srv->extport = htons(conf.extport);
- param->sins.sin_port = param->extport = srv->extport;
+/* FIX ME */
+ memcpy(&param->sins, &srv->extsa, sizeof(param->sins));
 }
 
 void srvfree(struct srvparam * srv){
@@ -858,9 +871,13 @@ void freeconf(struct extparam *confp){
  confp->authfunc = ipauth;
  confp->bandlimfunc = NULL;
  memset(&confp->intsa, 0, sizeof(confp->intsa));
+ memset(&confp->extsa, 0, sizeof(confp->extsa));
+#ifndef NOIPV6
+ memset(&confp->extsa6, 0, sizeof(confp->extsa6));
+ *SAFAMILY(&confp->extsa6) = AF_INET6;
+#endif
  *SAFAMILY(&confp->intsa) = AF_INET;
- confp->extip = 0;
- *SAPORT(&confp->intsa) = confp->extport = 0;
+ *SAFAMILY(&confp->extsa) = AF_INET;
  confp->singlepacket = 0;
  confp->maxchild = 100;
  resolvfunc = NULL;

+ 4 - 4
src/structures.h

@@ -356,10 +356,11 @@ struct srvparam {
 	unsigned logdumpsrv, logdumpcli;
 #ifndef NOIPV6
 	struct sockaddr_in6 intsa;
+	struct sockaddr_in6 extsa6;
 #else
 	struct sockaddr_in intsa;
 #endif
-	unsigned long extip;
+	struct sockaddr_in extsa;
 	pthread_mutex_t counter_mutex;
 	struct pollfd fds;
 	FILE *stdlog;
@@ -372,7 +373,6 @@ struct srvparam {
 	unsigned char * logformat;
 	unsigned char * logtarget;
 	unsigned char * nonprintable;
-	unsigned short extport;
 	unsigned short targetport;
 	unsigned char replace;
 	time_t time_start;
@@ -484,11 +484,11 @@ struct extparam {
 	char * counterfile;
 #ifndef NOIPV6
 	struct sockaddr_in6 intsa;
+	struct sockaddr_in6 extsa6;
 #else
 	struct sockaddr_in intsa;
 #endif
-	unsigned long extip;
-	unsigned short extport;
+	struct sockaddr_in extsa;
 	struct passwords *pwl;
 	struct auth * authenticate;
 	AUTHFUNC authfunc;

+ 1 - 1
src/version.h

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