Annotation of embedaddon/miniupnpd/ipfw/ipfwaux.c, revision 1.1
1.1 ! misho 1: /*
! 2: * MiniUPnP project
! 3: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
! 4: * (c) 2009-2012 Jardel Weyrich
! 5: * This software is subject to the conditions detailed
! 6: * in the LICENCE file provided within the distribution
! 7: */
! 8:
! 9: #include "ipfwaux.h"
! 10: #include <stdio.h>
! 11: #include <stdlib.h>
! 12: #include <string.h>
! 13: #include <syslog.h>
! 14: #include <unistd.h>
! 15:
! 16: int ipfw_exec(int optname, void * optval, uintptr_t optlen) {
! 17: static int sock = -1;
! 18: int result;
! 19:
! 20: switch (optname) {
! 21: case IP_FW_INIT:
! 22: if (sock == -1)
! 23: sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
! 24: if (sock < 0) {
! 25: syslog(LOG_ERR, "socket(SOCK_RAW): %m");
! 26: return -1;
! 27: }
! 28: break;
! 29: case IP_FW_TERM:
! 30: if (sock != -1)
! 31: close(sock);
! 32: sock = -1;
! 33: break;
! 34: case IP_FW_ADD:
! 35: case IP_FW_DEL:
! 36: result = setsockopt(sock, IPPROTO_IP, optname, optval, optlen);
! 37: if (result == -1) {
! 38: syslog(LOG_ERR, "setsockopt(): %m");
! 39: return -1;
! 40: }
! 41: break;
! 42: case IP_FW_GET:
! 43: result = getsockopt(sock, IPPROTO_IP, optname, optval, (socklen_t *)optlen);
! 44: if (result == -1) {
! 45: syslog(LOG_ERR, "getsockopt(): %m");
! 46: return -1;
! 47: }
! 48: break;
! 49: default:
! 50: syslog(LOG_ERR, "unhandled option");
! 51: return -1;
! 52: }
! 53:
! 54: return 0;
! 55: }
! 56:
! 57: void ipfw_free_ruleset(struct ip_fw ** rules) {
! 58: if (rules == NULL || *rules == NULL)
! 59: return;
! 60: free(*rules);
! 61: *rules = NULL;
! 62: }
! 63:
! 64: int ipfw_fetch_ruleset(struct ip_fw ** rules, int * total_fetched, int count) {
! 65: int fetched;
! 66: socklen_t size;
! 67:
! 68: if (rules == NULL || *total_fetched < 0 || count < 1)
! 69: return -1;
! 70:
! 71: size = sizeof(struct ip_fw) * (*total_fetched + count);
! 72: *rules = (struct ip_fw *)realloc(*rules, size);
! 73: if (*rules == NULL) {
! 74: syslog(LOG_ERR, "realloc(): %m");
! 75: return -1;
! 76: }
! 77:
! 78: (*rules)->version = IP_FW_CURRENT_API_VERSION;
! 79: if (ipfw_exec(IP_FW_GET, *rules, (uintptr_t)&size) < 0)
! 80: return -1;
! 81: fetched = *total_fetched;
! 82: *total_fetched = size / sizeof(struct ip_fw);
! 83:
! 84: return *total_fetched - fetched;
! 85: }
! 86:
! 87: int ipfw_validate_protocol(int value) {
! 88: switch (value) {
! 89: case IPPROTO_TCP:
! 90: case IPPROTO_UDP:
! 91: break;
! 92: default:
! 93: syslog(LOG_ERR, "invalid protocol");
! 94: return -1;
! 95: }
! 96: return 0;
! 97: }
! 98:
! 99: int ipfw_validate_ifname(const char * const value) {
! 100: int len = strlen(value);
! 101: if (len < 2 || len > FW_IFNLEN) {
! 102: syslog(LOG_ERR, "invalid interface name");
! 103: return -1;
! 104: }
! 105: return 0;
! 106: }
! 107:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>