Example #1
0
int cs_accept(int servfd)
{
    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);
    memset(&addr, '\0', addrlen);

    int clifd = accept(servfd, (struct sockaddr *)&addr, &addrlen);
    if (clifd < 0) {
        E("accept() failed.");
        return -1;
    }

	char ip_str[INET_ADDRSTRLEN];
    D(GREEN"accept client %d from %s port %d"NO, clifd,
      inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str)), 
      ntohs(addr.sin_port));

    sockfd_buf_t *rwbuf = sockfd_buf_init();
    if (rwbuf == NULL) {
        E("sockfd_buf_init() failed.");
        return -1;
    }

    sockfd_list[clifd] = rwbuf;
    register_readfd(clifd);

    return 0;
}
Example #2
0
int netsnmp_access_arp_load(netsnmp_arp_access *access)
{
    int r, fd = (uintptr_t) access->arch_magic;
    struct {
        struct nlmsghdr n;
        struct ndmsg r;
    } req;

    if (access->synchronized)
        return 0;

    if (fd == 0) {
        struct sockaddr_nl sa;

        fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
        if (fd < 0) {
            snmp_log(LOG_ERR,"netsnmp_access_arp_load: netlink socket create error\n");
            return -1;
        }
        access->arch_magic = (void *)(uintptr_t)fd;

        memset(&sa, 0, sizeof(sa));
        sa.nl_family = AF_NETLINK;
        sa.nl_groups = RTMGRP_NEIGH;
        if (bind(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0) {
            snmp_log(LOG_ERR,"netsnmp_access_arp_load: netlink bind failed\n");
            return -1;
        }

        if (register_readfd(fd, netsnmp_access_arp_read_netlink, access) != 0) {
            snmp_log(LOG_ERR,"netsnmp_access_arp_load: error registering netlink socket\n");
            return -1;
        }
    }

    DEBUGMSGTL(("access:netlink:arp", "synchronizing arp table\n"));

    access->generation++;

    memset(&req, 0, sizeof(req));
    req.n.nlmsg_len = sizeof(req);
    req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
    req.n.nlmsg_type = RTM_GETNEIGH;
    req.r.ndm_family = AF_UNSPEC;

    r = send(fd, &req, req.n.nlmsg_len, 0);
    if (r < 0) {
        snmp_log(LOG_ERR,"netsnmp_access_arp_refresh: send failed\n");
        return -1;
    }

    while (!access->synchronized)
        netsnmp_access_arp_read_netlink(fd, access);
    access->gc_hook(access);

    return 0;
}
Example #3
0
/**
 * @fn void init_ss7OmMIB(void)
 * @brief ss7OmMIB initialization routine.
 *
 * This is called when the agent starts up.  At a minimum, registration of the MIB variables
 * structure (ss7OmMIB_variables) should take place here.  By default the function also
 * registers the configuration handler and configuration store callbacks.
 *
 * Additional registrations that may be considered here are calls to regsiter_readfd(),
 * register_writefd() and register_exceptfd() for hooking into the snmpd event loop, but only when
 * used as a loadable module.  By default this function establishes a single file descriptor to
 * read, or upon which to handle exceptions.  Note that the snmpd only supports a maximum of 32
 * extneral file descriptors, so these should be used sparingly.
 *
 * When running as a loadable module, it is also necessary to hook into the snmpd event loop so that
 * the current request number can be deteremined.  This is accomplished by using a trick of the
 * external_signal_scheduled and external_signal_handler mechanism which is called on each event
 * loop when external_signal_scheduled is non-zero.  This is used to increment the sa_request value
 * on each snmpd event loop interation so that calls to MIB tree functions can determine whether
 * they belong to a fresh request or not (primarily for cacheing and possibly to clean up non-polled
 * file descriptors).
 */
void
init_ss7OmMIB(void)
{
	(void) my_fd;
	(void) zeroDotZero_oid;
	(void) snmpTrapOID_oid;
	DEBUGMSGTL(("ss7OmMIB", "init_ss7OmMIB: initializing...  "));
	/* register ourselves with the agent to handle our mib tree */
	REGISTER_MIB("ss7OmMIB", ss7OmMIB_variables, variable4, ss7OmMIB_variables_oid);
	snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_SHUTDOWN, term_ss7OmMIB, NULL);
	/* register our config handler(s) to deal with registrations */
	snmpd_register_config_handler("ss7OmMIB", parse_ss7OmMIB, NULL, "HELP STRING");
	/* we need to be called back later to store our data */
	snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA, store_ss7OmMIB, NULL);
	/* place any other initialization junk you need here */
	if (my_readfd >= 0) {
		register_readfd(my_readfd, ss7OmMIB_fd_handler, (void *) 0);
		register_exceptfd(my_readfd, ss7OmMIB_fd_handler, (void *) 1);
	}
	ss7OmMIBold_signal_handler = external_signal_handler[SIGCHLD];
	external_signal_handler[SIGCHLD] = &ss7OmMIB_loop_handler;
	external_signal_scheduled[SIGCHLD] = 1;
	DEBUGMSGTL(("ss7OmMIB", "done.\n"));
}
Example #4
0
int main(int argc, char *argv[])
{
    sqlite3 *db;
    if (sqlite3_open("db/cs.db", &db) != SQLITE_OK) {
        E("sqlite3_open() failed.");
        return -1;
    }

    int ret = sockfd_list_init(1024);
    if (ret < 0) {
        E("sockfd_list_init() failed.");
        return -1;
    }

    int servfd = socket(AF_INET, SOCK_STREAM, 0);
    if (servfd == -1) {
        E("%s", strerror(errno));
        return -1;
    }

    int optval = 1;
    ret = setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR,
            &optval, sizeof(optval));
    if (ret == -1) {
        E("%s", strerror(errno));
        return -1;
    }

#ifdef SO_REUSEPORT
    optval = 1;
    ret = setsockopt(servfd, SOL_SOCKET, SO_REUSEPORT,
            &optval, sizeof(optval));
    if (ret == -1) {
        E("%s", strerror(errno));
        return -1;
    }
#endif

    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);

    memset(&addr, '\0', addrlen);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = INADDR_ANY;

    ret = bind(servfd, (struct sockaddr *)&addr, addrlen);
    if (ret == -1) {
        E("%s", strerror(errno));
        return -1;
    }

    int backlog = 20;
    ret = listen(servfd, backlog);
    if (ret == -1) {
        E("%s", strerror(errno));
        return -1;
    }

    FD_ZERO(&rfds_g);
    FD_ZERO(&wfds_g);
    FD_ZERO(&efds_g);

    register_readfd(servfd);

    fd_set rfds, wfds, efds;

    struct timeval timeout;

    int n = 0;
    int i = 0;

    //DIP(INADDR_ANY);
    D("cs start 0.0.0.0 %d", PORT);
    while (1) {
        rfds = rfds_g;
        wfds = wfds_g;
        efds = efds_g;

        timeout.tv_sec = 1;
        timeout.tv_usec = 0;

        n = select(maxfd + 1, &rfds, &wfds, &efds, &timeout);
        if (n < 0) {
            if (errno == EINTR)
                continue;
            E("select() faile.");
            break;
        } else if (n == 0) {
            //D("timeout, nothing to be done.");
        } else {
            /* FIXME: while (n--) */
            for (i = 0; i <= maxfd; i++) {
                if (FD_ISSET(i, &rfds)) {
                    if (i == servfd) {
                        ret = cs_accept(i);
                        if (ret == -1) {
                            E("cs_accept() failed.");
                            break;
                        }
                    } else {
                        ret = cs_routine(i, db);
                        if (ret == -1) {
                            E("cs_routine() failed.");
                            break;
                        }
                    }
                } else if (FD_ISSET(i, &wfds)) {
                    D("write occurrence.");
                } else if (FD_ISSET(i, &efds)) {
                    E("except occurrence.");
                } else {
                    //E("undefined occurrence.");
                }
            }
        }
    }

    close(servfd);
    sqlite3_close(db);
    return 0;
}