iblock/main.c

51 lines
1.2 KiB
C
Raw Normal View History

2021-02-25 23:10:12 +00:00
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdio.h>
#include <err.h>
#include <netdb.h>
2021-02-28 09:54:36 +00:00
#include <unistd.h>
#include <syslog.h>
2021-02-25 23:10:12 +00:00
int main(void){
struct sockaddr sock;
socklen_t slen = sizeof(sock);
char host[1024] = "";
char port[1044] = "";
2021-02-28 09:54:36 +00:00
char cmd[1000] = "";
2021-02-25 23:10:12 +00:00
int status;
2021-02-28 09:54:36 +00:00
unveil("/usr/bin/doas", "rx");
unveil("/sbin/pfctl", "rx");
pledge("exec inet dns stdio", NULL);
2021-02-25 23:10:12 +00:00
if(getpeername(0, &sock, &slen))
err(1, "getpeername");
status = getnameinfo(&sock, slen, host, sizeof host, port, sizeof port,
NI_NUMERICHOST|NI_NUMERICSERV);
if(status > 0)
{
2021-02-28 09:54:36 +00:00
syslog(LOG_DAEMON, "getnameinfo error");
2021-02-25 23:10:12 +00:00
exit(1);
}
2021-02-28 09:54:36 +00:00
syslog(LOG_DAEMON, "blocking %s", host);
snprintf(cmd, sizeof(cmd), "/sbin/pfctl -t blocked -T add %s", host);
syslog(LOG_DAEMON, "%s", cmd);
2021-02-25 23:10:12 +00:00
switch(sock. sa_family)
{
case AF_INET:
2021-02-28 09:54:36 +00:00
execlp(cmd, cmd, NULL);
2021-02-25 23:10:12 +00:00
break;
2021-02-28 09:54:36 +00:00
// case AF_INET6:
// printf("%s %s\n", host, cmd);
// break;
2021-02-25 23:10:12 +00:00
default:
2021-02-28 09:54:36 +00:00
exit(2);
//puts("run from console");
2021-02-25 23:10:12 +00:00
}
}