kern_jail.c revision 46197
146197Sphk/* 246197Sphk * ---------------------------------------------------------------------------- 346197Sphk * "THE BEER-WARE LICENSE" (Revision 42): 446197Sphk * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you 546197Sphk * can do whatever you want with this stuff. If we meet some day, and you think 646197Sphk * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 746197Sphk * ---------------------------------------------------------------------------- 846197Sphk * 946197Sphk * $Id: malloc.c,v 1.44 1999/03/28 14:16:05 phk Exp $ 1046197Sphk * 1146197Sphk */ 1246155Sphk 1346155Sphk#include <sys/param.h> 1446155Sphk#include <sys/types.h> 1546155Sphk#include <sys/kernel.h> 1646155Sphk#include <sys/systm.h> 1746155Sphk#include <sys/errno.h> 1846155Sphk#include <sys/sysproto.h> 1946155Sphk#include <sys/malloc.h> 2046155Sphk#include <sys/proc.h> 2146155Sphk#include <sys/jail.h> 2246155Sphk#include <sys/socket.h> 2346155Sphk#include <net/if.h> 2446155Sphk#include <netinet/in.h> 2546155Sphk 2646155SphkMALLOC_DEFINE(M_PRISON, "prison", "Prison structures"); 2746155Sphk 2846155Sphkint 2946155Sphkjail(p, uap) 3046155Sphk struct proc *p; 3146155Sphk struct jail_args /* { 3246155Sphk syscallarg(struct jail *) jail; 3346155Sphk } */ *uap; 3446155Sphk{ 3546155Sphk int error; 3646155Sphk struct prison *pr; 3746155Sphk struct jail j; 3846155Sphk struct chroot_args ca; 3946155Sphk 4046155Sphk error = suser(p); 4146155Sphk if (error) 4246155Sphk return (error); 4346155Sphk error = copyin(uap->jail, &j, sizeof j); 4446155Sphk if (error) 4546155Sphk return (error); 4646155Sphk MALLOC(pr, struct prison *, sizeof *pr , M_PRISON, M_WAITOK); 4746155Sphk bzero((caddr_t)pr, sizeof *pr); 4846155Sphk error = copyinstr(j.hostname, &pr->pr_host, sizeof pr->pr_host, 0); 4946155Sphk if (error) 5046155Sphk goto bail; 5146155Sphk pr->pr_ip = j.ip_number; 5246155Sphk 5346155Sphk ca.path = j.path; 5446155Sphk error = chroot(p, &ca); 5546155Sphk if (error) 5646155Sphk goto bail; 5746155Sphk 5846155Sphk pr->pr_ref++; 5946155Sphk p->p_prison = pr; 6046155Sphk p->p_flag |= P_JAILED; 6146155Sphk return (0); 6246155Sphk 6346155Sphkbail: 6446155Sphk FREE(pr, M_PRISON); 6546155Sphk return (error); 6646155Sphk} 6746155Sphk 6846155Sphkint 6946155Sphkprison_ip(struct proc *p, int flag, u_int32_t *ip) 7046155Sphk{ 7146155Sphk u_int32_t tmp; 7246155Sphk 7346155Sphk if (!p->p_prison) 7446155Sphk return (0); 7546155Sphk if (flag) 7646155Sphk tmp = *ip; 7746155Sphk else 7846155Sphk tmp = ntohl(*ip); 7946155Sphk if (tmp == INADDR_ANY) { 8046155Sphk if (flag) 8146155Sphk *ip = p->p_prison->pr_ip; 8246155Sphk else 8346155Sphk *ip = htonl(p->p_prison->pr_ip); 8446155Sphk return (0); 8546155Sphk } 8646155Sphk if (p->p_prison->pr_ip != tmp) 8746155Sphk return (1); 8846155Sphk return (0); 8946155Sphk} 9046155Sphk 9146155Sphkvoid 9246155Sphkprison_remote_ip(struct proc *p, int flag, u_int32_t *ip) 9346155Sphk{ 9446155Sphk u_int32_t tmp; 9546155Sphk 9646194Sphk if (!p || !p->p_prison) 9746155Sphk return; 9846155Sphk if (flag) 9946155Sphk tmp = *ip; 10046155Sphk else 10146155Sphk tmp = ntohl(*ip); 10246155Sphk if (tmp == 0x7f000001) { 10346155Sphk if (flag) 10446155Sphk *ip = p->p_prison->pr_ip; 10546155Sphk else 10646155Sphk *ip = htonl(p->p_prison->pr_ip); 10746155Sphk return; 10846155Sphk } 10946155Sphk return; 11046155Sphk} 11146155Sphk 11246155Sphkint 11346155Sphkprison_if(struct proc *p, struct sockaddr *sa) 11446155Sphk{ 11546155Sphk struct sockaddr_in *sai = (struct sockaddr_in*) sa; 11646155Sphk int ok; 11746155Sphk 11846155Sphk if (sai->sin_family != AF_INET) 11946155Sphk ok = 0; 12046155Sphk else if (p->p_prison->pr_ip != ntohl(sai->sin_addr.s_addr)) 12146155Sphk ok = 1; 12246155Sphk else 12346155Sphk ok = 0; 12446155Sphk return (ok); 12546155Sphk} 126