Two new sysctls: net.inet.tcp.getcred and net.inet.udp.getcred. These take

a sockaddr_in[2] (local, then remote) and return a struct ucred. Example
code for these is at:
	http://www.FreeBSD.org/~green/inetd_ident.patch
	http://www.FreeBSD.org/~green/freebsd4.c (for pidentd)

Reviewed by:	bde
This commit is contained in:
Brian Feldman 1999-07-11 18:32:46 +00:00
parent 32b76dfa8a
commit 490d50b60a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=48758
3 changed files with 99 additions and 3 deletions

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95
* $Id: tcp_subr.c,v 1.55 1999/06/16 19:05:17 tegge Exp $
* $Id: tcp_subr.c,v 1.56 1999/07/05 08:46:55 msmith Exp $
*/
#include "opt_compat.h"
@ -43,6 +43,7 @@
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/proc.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/protosw.h>
@ -587,6 +588,37 @@ tcp_pcblist SYSCTL_HANDLER_ARGS
SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
tcp_pcblist, "S,xtcpcb", "List of active TCP connections");
static int
tcp_getcred SYSCTL_HANDLER_ARGS
{
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
error = suser(req->p);
if (error)
return (error);
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
return (error);
s = splnet();
inp = in_pcblookup_hash(&tcbinfo, addrs[1].sin_addr, addrs[1].sin_port,
addrs[0].sin_addr, addrs[0].sin_port, 0);
if (inp == NULL || inp->inp_socket == NULL ||
inp->inp_socket->so_cred == NULL) {
error = ENOENT;
goto out;
}
error = SYSCTL_OUT(req, inp->inp_socket->so_cred->pc_ucred,
sizeof(struct ucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0, tcp_getcred, "S,ucred", "Get the ucred of a TCP connection");
void
tcp_ctlinput(cmd, sa, vip)
int cmd;

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95
* $Id: tcp_subr.c,v 1.55 1999/06/16 19:05:17 tegge Exp $
* $Id: tcp_subr.c,v 1.56 1999/07/05 08:46:55 msmith Exp $
*/
#include "opt_compat.h"
@ -43,6 +43,7 @@
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/proc.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/protosw.h>
@ -587,6 +588,37 @@ tcp_pcblist SYSCTL_HANDLER_ARGS
SYSCTL_PROC(_net_inet_tcp, TCPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
tcp_pcblist, "S,xtcpcb", "List of active TCP connections");
static int
tcp_getcred SYSCTL_HANDLER_ARGS
{
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
error = suser(req->p);
if (error)
return (error);
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
return (error);
s = splnet();
inp = in_pcblookup_hash(&tcbinfo, addrs[1].sin_addr, addrs[1].sin_port,
addrs[0].sin_addr, addrs[0].sin_port, 0);
if (inp == NULL || inp->inp_socket == NULL ||
inp->inp_socket->so_cred == NULL) {
error = ENOENT;
goto out;
}
error = SYSCTL_OUT(req, inp->inp_socket->so_cred->pc_ucred,
sizeof(struct ucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0, tcp_getcred, "S,ucred", "Get the ucred of a TCP connection");
void
tcp_ctlinput(cmd, sa, vip)
int cmd;

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)udp_usrreq.c 8.6 (Berkeley) 5/23/95
* $Id: udp_usrreq.c,v 1.51 1999/05/03 23:57:32 billf Exp $
* $Id: udp_usrreq.c,v 1.52 1999/06/19 18:43:33 green Exp $
*/
#include <sys/param.h>
@ -39,6 +39,7 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/proc.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
@ -451,6 +452,37 @@ udp_pcblist SYSCTL_HANDLER_ARGS
SYSCTL_PROC(_net_inet_udp, UDPCTL_PCBLIST, pcblist, CTLFLAG_RD, 0, 0,
udp_pcblist, "S,xinpcb", "List of active UDP sockets");
static int
udp_getcred SYSCTL_HANDLER_ARGS
{
struct sockaddr_in addrs[2];
struct inpcb *inp;
int error, s;
error = suser(req->p);
if (error)
return (error);
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
return (error);
s = splnet();
inp = in_pcblookup_hash(&udbinfo, addrs[1].sin_addr, addrs[1].sin_port,
addrs[0].sin_addr, addrs[0].sin_port, 1);
if (inp == NULL || inp->inp_socket == NULL ||
inp->inp_socket->so_cred == NULL) {
error = ENOENT;
goto out;
}
error = SYSCTL_OUT(req, inp->inp_socket->so_cred->pc_ucred,
sizeof(struct ucred));
out:
splx(s);
return (error);
}
SYSCTL_PROC(_net_inet_udp, OID_AUTO, getcred, CTLTYPE_OPAQUE|CTLFLAG_RW,
0, 0, udp_getcred, "S,ucred", "Get the ucred of a UDP connection");
static int
udp_output(inp, m, addr, control, p)
register struct inpcb *inp;