walters / rpms / nfs-utils

Forked from rpms/nfs-utils 6 years ago
Clone
85ed8ab
commit a04f8b5a3ea94b7a9d96d339b6ccde5f2e67a2d1
85ed8ab
Author: Olga Kornievskaia <aglo@citi.umich.edu>
85ed8ab
Date:   Wed May 7 10:54:51 2008 -0400
85ed8ab
85ed8ab
    Check the info file nfs/rpc_pipefs/nfs/clnt?/info to
85ed8ab
    see if a port number was supplied. If so, use it rather
85ed8ab
    than the default port number.
85ed8ab
    
85ed8ab
    Signed-off-by: Olga Kornievskaia <aglo@citi.umich.edu>
85ed8ab
    Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
85ed8ab
    Signed-off-by: Steve Dickson <steved@redhat.com>
85ed8ab
85ed8ab
diff --git a/utils/gssd/gssd.h b/utils/gssd/gssd.h
85ed8ab
index e17edde..6f14c34 100644
85ed8ab
--- a/utils/gssd/gssd.h
85ed8ab
+++ b/utils/gssd/gssd.h
85ed8ab
@@ -80,6 +80,7 @@ struct clnt_info {
85ed8ab
 	int			krb5_poll_index;
85ed8ab
 	int			spkm3_fd;
85ed8ab
 	int			spkm3_poll_index;
85ed8ab
+	int			port;
85ed8ab
 };
85ed8ab
 
85ed8ab
 void init_client_list(void);
85ed8ab
diff --git a/utils/gssd/gssd_proc.c b/utils/gssd/gssd_proc.c
85ed8ab
index 6860cc8..bac7295 100644
85ed8ab
--- a/utils/gssd/gssd_proc.c
85ed8ab
+++ b/utils/gssd/gssd_proc.c
85ed8ab
@@ -102,7 +102,7 @@ int pollsize;  /* the size of pollaray (in pollfd's) */
85ed8ab
 /* XXX buffer problems: */
85ed8ab
 static int
85ed8ab
 read_service_info(char *info_file_name, char **servicename, char **servername,
85ed8ab
-		  int *prog, int *vers, char **protocol) {
85ed8ab
+		  int *prog, int *vers, char **protocol, int *port) {
85ed8ab
 #define INFOBUFLEN 256
85ed8ab
 	char		buf[INFOBUFLEN];
85ed8ab
 	static char	dummy[128];
85ed8ab
@@ -112,6 +112,8 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
85ed8ab
 	char		program[16];
85ed8ab
 	char		version[16];
85ed8ab
 	char		protoname[16];
85ed8ab
+	char		cb_port[128];
85ed8ab
+	char		*p;
85ed8ab
 	in_addr_t	inaddr;
85ed8ab
 	int		fd = -1;
85ed8ab
 	struct hostent	*ent = NULL;
85ed8ab
@@ -143,6 +145,10 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
85ed8ab
 		goto fail;
85ed8ab
 	}
85ed8ab
 
85ed8ab
+	cb_port[0] = '\0';
85ed8ab
+	if ((p = strstr(buf, "port")) != NULL)
85ed8ab
+		sscanf(p, "port: %127s\n", cb_port);
85ed8ab
+
85ed8ab
 	/* check service, program, and version */
85ed8ab
 	if(memcmp(service, "nfs", 3)) return -1;
85ed8ab
 	*prog = atoi(program + 1); /* skip open paren */
85ed8ab
@@ -163,6 +169,8 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
85ed8ab
 	if (!(*servicename = calloc(strlen(buf) + 1, 1)))
85ed8ab
 		goto fail;
85ed8ab
 	memcpy(*servicename, buf, strlen(buf));
85ed8ab
+	if (cb_port[0] != '\0')
85ed8ab
+		*port = atoi(cb_port);
85ed8ab
 
85ed8ab
 	if (!(*protocol = strdup(protoname)))
85ed8ab
 		goto fail;
85ed8ab
@@ -238,7 +246,7 @@ process_clnt_dir_files(struct clnt_info * clp)
85ed8ab
 	if ((clp->servicename == NULL) &&
85ed8ab
 	     read_service_info(info_file_name, &clp->servicename,
85ed8ab
 				&clp->servername, &clp->prog, &clp->vers,
85ed8ab
-				&clp->protocol))
85ed8ab
+				&clp->protocol, &clp->port))
85ed8ab
 		return -1;
85ed8ab
 	return 0;
85ed8ab
 }
85ed8ab
@@ -587,6 +595,8 @@ int create_auth_rpc_client(struct clnt_info *clp,
85ed8ab
 			 clp->servername, uid);
85ed8ab
 		goto out_fail;
85ed8ab
 	}
85ed8ab
+	if (clp->port)
85ed8ab
+		((struct sockaddr_in *)a->ai_addr)->sin_port = htons(clp->port);
85ed8ab
 	if (a->ai_protocol == IPPROTO_TCP) {
85ed8ab
 		if ((rpc_clnt = clnttcp_create(
85ed8ab
 					(struct sockaddr_in *) a->ai_addr,