cannot freebsd jail by c
James Gritton
jamie at freebsd.org
Sat May 21 21:49:15 UTC 2016
On 2016-05-21 08:52, 梅凱 wrote:
> This is my part c code:
>
>
> 11 int main()
> 12 {
> 13 in_addr_t addr_t=inet_addr("192.168.2.1");
> 14
> 15 struct in_addr in_addr=inet_makeaddr(addr_t,AF_INET);
> 16
> 17
> 18 struct jail j={
> 19 .version=JAIL_API_VERSION,
> 20 .path="./jail_test",
> 21 .hostname="myjail",
> 22 .ip4s=addr_t,
> 23 .ip6s=0,
> 24 .ip4=&in_addr,
> 25 .ip6=NULL
> 26 };
> 27
> 28 errno=0;
> 29 int rs=jail(&j);
> 30 if(0==rs){
> 31 printf("create jail ok!!!\r\n");
> 32 return 0;
> 33 }
> 34
> 35 switch(errno){
> 36 case EPERM:
> 37 printf("eperm\r\n");
> 38 break;
> 39 case EFAULT:
> 40 printf("efault\r\n");
> 41 break;
> 42 case EINVAL:
> 43 printf("einval\r\n");
> 44 break;
> 45 case EAGAIN:
> 46 printf("eagain\r\n");
> 47 break;
> 48 default:
> 49 printf("---------------\r\n");
> 50 break;
> 51 }
> 52 return 0;
> 53 }
>
> Unfortunately,the errno return EINVAL,it means “The version number of
> the argument is not correct.”,why?
Actually, jail(2) can give EINVAL not only for the reason listed, but
also for some of the reasons mentioned under jail_set. Really, it means
just some value was wrong.
In this case there were two errors. You passed addr_t in .ip4s, but
that's supposed to be the number of addresses and not the address itself
- pass 1 instead. Also, the path of "./jail_test" won't work; it needs
to be a full pathname instead. Fix those two and the jail will create
correctly.
- Jamie
More information about the freebsd-jail
mailing list