From mblapp@fuchur.lan.attic.ch  Sun Mar 25 05:23:54 2001
Return-Path: <mblapp@fuchur.lan.attic.ch>
Received: from fuchur.lan.attic.ch (fuchur.lan.attic.ch [194.235.47.21])
	by hub.freebsd.org (Postfix) with ESMTP id E0A0C37B71D
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 25 Mar 2001 05:23:52 -0800 (PST)
	(envelope-from mblapp@fuchur.lan.attic.ch)
Received: (from root@localhost)
	by fuchur.lan.attic.ch (8.11.3/8.11.3) id f2PDORH40308;
	Sun, 25 Mar 2001 15:24:27 +0200 (CEST)
	(envelope-from mblapp)
Message-Id: <200103251324.f2PDORH40308@fuchur.lan.attic.ch>
Date: Sun, 25 Mar 2001 15:24:27 +0200 (CEST)
From: mb@imp.ch
Reply-To: mb@imp.ch
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [Fix] af_unix rpc compatility
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         26071
>Category:       kern
>Synopsis:       [Fix] af_unix rpc compatility
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    gnats-admin
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 25 05:30:01 PST 2001
>Closed-Date:    Sun Mar 25 07:36:06 PST 2001
>Last-Modified:  Wed Oct 26 06:37:16 GMT 2005
>Originator:     
>Release:        
>Organization:
>Environment:
>Description:

- Adding compatibility functions for af_unix sockets. The new functions
are slightly different from the old ones, so it's a good thing to have
compat stups.

- Also readd CLGET_LOCAL_ADDR which is needed by the compat code.

>How-To-Repeat:

>Fix:

http://home.teleport.ch/freebsd/af_unix.diff

--- lib/libc/rpc/rpc_soc.c	Sun Mar 25 14:16:58 2001
+++ lib/libc/rpc/rpc_soc.c	Sun Mar 25 14:14:41 2001
@@ -450,4 +450,84 @@
 	return (dummy);
 }
 
+/*
+ * Create a client handle for a unix connection. Obsoleted by clnt_vc_create()
+ */
+CLIENT *
+clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
+	struct sockaddr_un *raddr;
+	u_long prog;
+	u_long vers;
+	register int *sockp;
+	u_int sendsz;
+	u_int recvsz;
+{
+	struct netbuf nbuf;
+	int len;
+
+	if (*sockp < 0) {
+		*sockp = socket(AF_UNIX, SOCK_STREAM, 0);
+		len = strlen(raddr->sun_path) + sizeof(raddr->sun_family) +
+		    sizeof(raddr->sun_len) + 1;
+		raddr->sun_len = len;
+		if ((*sockp < 0)
+		    || (connect(*sockp, (struct sockaddr *)raddr, len) < 0)) {
+			rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+			rpc_createerr.cf_error.re_errno = errno;
+			if (*sockp != -1)
+				(void)_close(*sockp);
+			return (NULL);
+		}
+	}
+	nbuf.len = raddr->sun_len = SUN_LEN(raddr);
+	nbuf.maxlen = sizeof (struct sockaddr_un);
+	nbuf.buf = raddr;
+			
+	return(clnt_vc_create(*sockp, &nbuf, prog, vers, sendsz, recvsz));
+}
+
+/*
+ * Creates, registers, and returns a (rpc) unix based transporter.
+ * Obsoleted by svc_vc_create().
+ */
+SVCXPRT *
+svcunix_create(sock, sendsize, recvsize, path)
+        register int sock;
+        u_int sendsize;
+        u_int recvsize;
+        char *path;
+{
+	struct sockaddr_un addr;
+	int len = sizeof(struct sockaddr_un);
+
+	memset(&addr, 0, sizeof (addr));
+	addr.sun_family = AF_UNIX;
+	strcpy(addr.sun_path, path);
+	len = strlen(addr.sun_path) + sizeof(addr.sun_family) +
+	    sizeof(addr.sun_len) + 1;
+	addr.sun_len = len;
+
+	if (sock == RPC_ANYSOCK) {
+		if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+			return ((SVCXPRT *)NULL);
+	}
+
+	bind(sock, (struct sockaddr *)&addr, len);
+
+	return(svc_vc_create(sock, sendsize, recvsize));
+}
+
+/*
+ * Like svunix_create(), except the routine takes any *open* UNIX file
+ * descriptor as its first input. Obsoleted by svc_fd_create();
+ */
+SVCXPRT *
+svcunixfd_create(fd, sendsize, recvsize)
+        int fd;
+        u_int sendsize;
+        u_int recvsize;
+{
+ 	return (svc_fd_create(fd, sendsize, recvsize));
+}
+
 #endif /* PORTMAP */
--- include/rpc/clnt.h	Sun Mar 25 15:15:51 2001
+++ include/rpc/clnt.h	Sun Mar 25 15:00:56 2001
@@ -230,6 +230,11 @@
 #define CLGET_RETRY_TIMEOUT 5   /* get retry timeout (timeval) */
 
 /*
+ * Operations which GSSAPI needs. (Bletch.)
+ */
+#define CLGET_LOCAL_ADDR    19  /* get local addr (sockaddr) */
+
+/*
  * void
  * CLNT_DESTROY(rh);
  * 	CLIENT *rh;
@@ -335,6 +340,11 @@
 extern CLIENT *clnt_vc_create __P((const int, const struct netbuf *,
 				   const rpcprog_t, const rpcvers_t,
 				   const u_int, const u_int));
+/*
+ * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create().
+ */
+extern CLIENT *clntunix_create  __P((struct sockaddr_un *,
+				     u_long, u_long, int *, u_int, u_int));
 /*
  *	const int fd;				-- open file descriptor
  *	const struct netbuf *svcaddr;		-- servers address
--- include/rpc/svc.h	Fri Mar 23 19:00:05 2001
+++ include/rpc/svc.h	Sun Mar 25 15:06:09 2001
@@ -381,6 +381,11 @@
  *      const u_int recvsize;                   -- max recv size
  */
 
+/*
+ * Added for compatibility to old rpc 4.0. Obsoleted by svc_vc_create().
+ */
+extern SVCXPRT *svcunix_create __P((int, u_int, u_int, char *));
+
 extern SVCXPRT *svc_dg_create __P((const int, const u_int, const u_int));
         /*
          * const int fd;                                -- open connection
@@ -399,6 +404,11 @@
  *      const u_int sendsize;                   -- max send size
  *      const u_int recvsize;                   -- max recv size
  */
+
+/*
+ * Added for compatibility to old rpc 4.0. Obsoleted by svc_fd_create().
+ */
+extern SVCXPRT *svcunixfd_create __P((int, u_int, u_int));
 
 /*
  * Memory based rpc (for speed check and testing)
>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: roam 
State-Changed-When: Sun Mar 25 07:36:06 PST 2001 
State-Changed-Why:  
Misfiled; originator shall refile. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=26071 
>Unformatted:
 System: FreeBSD fuchur.lan.attic.ch 5.0-CURRENT FreeBSD 5.0-CURRENT #8: Tue Mar 20 14:39:22 CET 2001 root@fuchur.lan.attic.ch:/usr/src/sys/compile/MARTIN i386
 
