Просмотр исходного кода

qnetd: Make proper support for ipv4/6

- Add option for forcing ip version 4 or 6
- Choose new default port. It's now 5403. Exactly one less than used by
  corosync.
- Fix compiler warning

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 10 лет назад
Родитель
Сommit
2960122481
4 измененных файлов с 23 добавлено и 16 удалено
  1. 13 5
      qdevices/corosync-qnetd.c
  2. 8 10
      qdevices/nss-sock.c
  3. 1 1
      qdevices/qnet-config.h
  4. 1 0
      qdevices/qnetd-client-net.c

+ 13 - 5
qdevices/corosync-qnetd.c

@@ -218,14 +218,14 @@ static void
 usage(void)
 {
 
-	printf("usage: %s [-df] [-l listen_addr] [-p listen_port] [-s tls]\n", QNETD_PROGRAM_NAME);
+	printf("usage: %s [-46df] [-l listen_addr] [-p listen_port] [-s tls]\n", QNETD_PROGRAM_NAME);
 	printf("%14s[-c client_cert_required] [-m max_clients]\n", "");
 }
 
 static void
 cli_parse(int argc, char * const argv[], char **host_addr, uint16_t *host_port, int *foreground,
     int *debug_log, int *bump_log_priority, enum tlv_tls_supported *tls_supported,
-    int *client_cert_required, size_t *max_clients)
+    int *client_cert_required, size_t *max_clients, PRIntn *address_family)
 {
 	int ch;
 	char *ep;
@@ -239,9 +239,16 @@ cli_parse(int argc, char * const argv[], char **host_addr, uint16_t *host_port,
 	*tls_supported = QNETD_DEFAULT_TLS_SUPPORTED;
 	*client_cert_required = QNETD_DEFAULT_TLS_CLIENT_CERT_REQUIRED;
 	*max_clients = QNETD_DEFAULT_MAX_CLIENTS;
+	*address_family = PR_AF_UNSPEC;
 
-	while ((ch = getopt(argc, argv, "fdc:l:m:p:s:")) != -1) {
+	while ((ch = getopt(argc, argv, "46fdc:l:m:p:s:")) != -1) {
 		switch (ch) {
+		case '4':
+			*address_family = PR_AF_INET;
+			break;
+		case '6':
+			*address_family = PR_AF_INET6;
+			break;
 		case 'f':
 			*foreground = 1;
 			break;
@@ -305,9 +312,10 @@ main(int argc, char *argv[])
 	enum tlv_tls_supported tls_supported;
 	int client_cert_required;
 	size_t max_clients;
+	PRIntn address_family;
 
 	cli_parse(argc, argv, &host_addr, &host_port, &foreground, &debug_log, &bump_log_priority,
-	    &tls_supported, &client_cert_required, &max_clients);
+	    &tls_supported, &client_cert_required, &max_clients, &address_family);
 
 	if (foreground) {
 		qnetd_log_init(QNETD_LOG_TARGET_STDERR);
@@ -354,7 +362,7 @@ main(int argc, char *argv[])
 
 	qnetd_log_printf(LOG_DEBUG, "Creating listening socket");
 	instance.server.socket = nss_sock_create_listen_socket(instance.host_addr,
-	    instance.host_port, PR_AF_INET6);
+	    instance.host_port, address_family);
 	if (instance.server.socket == NULL) {
 		qnetd_err_nss();
 	}

+ 8 - 10
qdevices/nss-sock.c

@@ -110,8 +110,8 @@ nss_sock_create_socket(PRIntn af, int reuse_addr)
 
 /*
  * Create listen socket and bind it to address. hostname can be NULL and then
- * any address is used. Address family (af) can be ether PR_AF_INET6 or
- * PR_AF_INET.
+ * any address is used. Address family (af) can be ether PR_AF_INET6,
+ * PR_AF_INET or PR_AF_UNSPEC.
  */
 PRFileDesc *
 nss_sock_create_listen_socket(const char *hostname, uint16_t port, PRIntn af)
@@ -119,7 +119,6 @@ nss_sock_create_listen_socket(const char *hostname, uint16_t port, PRIntn af)
 	PRNetAddr addr;
 	PRFileDesc *sock;
 	PRAddrInfo *addr_info;
-	PRIntn tmp_af;
 	void *addr_iter;
 
 	sock = NULL;
@@ -130,6 +129,9 @@ nss_sock_create_listen_socket(const char *hostname, uint16_t port, PRIntn af)
 		if (PR_InitializeNetAddr(PR_IpAddrAny, port, &addr) != PR_SUCCESS) {
 			return (NULL);
 		}
+		if (af == PR_AF_UNSPEC) {
+			af = PR_AF_INET6;
+		}
 		addr.raw.family = af;
 
 		sock = nss_sock_create_socket(af, 1);
@@ -143,11 +145,7 @@ nss_sock_create_listen_socket(const char *hostname, uint16_t port, PRIntn af)
 			return (NULL);
 		}
 	} else {
-		tmp_af = PR_AF_UNSPEC;
-		if (af == PR_AF_INET)
-			tmp_af = PR_AF_INET;
-
-		addr_info = PR_GetAddrInfoByName(hostname, tmp_af, PR_AI_ADDRCONFIG);
+		addr_info = PR_GetAddrInfoByName(hostname, af, PR_AI_ADDRCONFIG);
 		if (addr_info == NULL) {
 			return (NULL);
 		}
@@ -156,8 +154,8 @@ nss_sock_create_listen_socket(const char *hostname, uint16_t port, PRIntn af)
 
 		while ((addr_iter = PR_EnumerateAddrInfo(addr_iter, addr_info, port,
 		    &addr)) != NULL) {
-			if (addr.raw.family == af) {
-				sock = nss_sock_create_socket(af, 1);
+			if (af == PR_AF_UNSPEC || addr.raw.family == af) {
+				sock = nss_sock_create_socket(addr.raw.family, 1);
 				if (sock == NULL) {
 					continue ;
 				}

+ 1 - 1
qdevices/qnet-config.h

@@ -47,7 +47,7 @@ extern "C" {
  */
 
 #define QNETD_PROGRAM_NAME			"corosync-qnetd"
-#define QNETD_DEFAULT_HOST_PORT			4433
+#define QNETD_DEFAULT_HOST_PORT			5403
 #define QNETD_LISTEN_BACKLOG			10
 #define QNETD_MAX_CLIENT_SEND_BUFFERS		10
 #define QNETD_MAX_CLIENT_SEND_SIZE		(1 << 15)

+ 1 - 0
qdevices/qnetd-client-net.c

@@ -40,6 +40,7 @@
 #include "qnetd-log.h"
 #include "qnetd-client-net.h"
 #include "qnetd-client-send.h"
+#include "qnetd-client-msg-received.h"
 
 static int
 qnetd_client_net_write_finished(struct qnetd_instance *instance, struct qnetd_client *client)