O MacOS tem uma contrapartida para o unshare(2) do Linux ?
Eu gostaria que o seguinte falhasse em ambos os sistemas.
#define _GNU_SOURCE
#include <stdlib.h>
#include <sched.h>
int main()
{
#if __linux__
if(0>unshare(CLONE_NEWNET)) return EXIT_FAILURE;
#elif __APPLE__
/*?*/
#endif
//this should fail on either system
if(0!=system("curl www.google.com")) return EXIT_FAILURE;
}
O Mac OS X não tem namespaces como o Linux, mas se você quiser bloquear a rede, parece que você pode usar
sandbox_init()
para obter um efeito semelhante. Consulte a página do manual para obter uma descrição.Existem dois perfis internos que parecem suportar um caso de uso semelhante ao que você descreve:
kSBXProfileNoInternet
, onde a rede TCP/IP é proibida; ekSBXProfileNoNetwork
, onde todas as redes baseadas em soquetes são proibidas. (Embora o último possa estar mais próximo do que o namespace de rede Linux está fazendo aqui, o primeiro pode ser suficiente para suas necessidades.)Observe que esta função está documentada como obsoleta , e aqueles que desejam colocar um aplicativo em sandbox devem consultar o recurso App Sandbox , então você pode querer dar uma olhada nisso também. Não sei se o App Sandbox usaria o mesmo mecanismo (código que você executa de uma plataforma
#ifdef
), por isso sugerisandbox_init()
primeiro.