Ejemplo n.º 1
0
int StartWSA(void)
{
#ifdef _WIN32
    if(me.uplink.winsock == true)
        return 0;
    int wsres = WSAStartup(MAKEWORD(2,2), &wsaData);
    switch(wsres)
    {
        case 0:
            logger(LOG_STATUS, "Successfully started Winsock.");
            me.uplink.winsock = true;
        case WSASYSNOTREADY:
            sigyn_fatal("Cannot start winsock: Underlying network is not ready for communication.");
        case WSAVERNOTSUPPORTED:
            /* Note: This should never happen. */
            sigyn_fatal("Cannot start winsock: This version of winsock is not supported by this winsock implementation.");
        case WSAEPROCLIM:
            sigyn_fatal("Cannot start winsock: Winsock task limit reached.")
        default:
            sigyn_fatal("Cannot start winsock: Unknown errno %d", wsres);
    }
    return wsres;
#else
    return 0;
#endif
}
Ejemplo n.º 2
0
Archivo: sigyn.c Proyecto: alyx/sigyn
int main(int argc, char *argv[])
{
    me.ev = mowgli_eventloop_create();

    signals_init();

    parse_commandline_options(argc, argv);

    me.config = mowgli_config_file_load(config_file);

    if(me.config == NULL)
        sigyn_fatal("Cannot load configuration file.");
    logger_init(me.config->entries);
    config_check(me.config);

    me.uplink.line = new_conn(me.uplink.hostname, me.uplink.port, me.uplink.ssl, read_irc, NULL);
    if (me.uplink.line == NULL)
        sigyn_fatal("Connection to uplink failed.");
    me.uplink.connected = true;

    loadmodules(me.config->entries);

    sigyn_introduce_client(me.client->nick, me.client->user, NULL);
    if (should_fork)
        daemonise(SYSCONFDIR "/sigyn.pid");
    mowgli_eventloop_run(me.ev);

    sigyn_cleanup();
    return EXIT_SUCCESS;
}
Ejemplo n.º 3
0
socket_t uplink_connect(char *uplink, uint16_t port, char *vhost)
{
	socket_t sock;
	int error, flags;
    unsigned int optval;
    struct addrinfo *res = NULL,
                    hints;

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    StartWSA();

    if ((error = getaddrinfo(uplink, NULL, &hints, &res)))
        sigyn_fatal("Cannot resolve hostname(%s): %s", uplink, gai_strerror(error));
    if (res->ai_addr == NULL)
    {
        freeaddrinfo(res);
        sigyn_fatal("Cannot resolve hostname (%s).");
    }

    logger(LOG_STATUS, "Attempting to connect to %s:%d", uplink, port);
    if (!(sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)))
    {
        freeaddrinfo(res);
        sigyn_fatal("Unable to create socket.");
    }

    if (sock > me.maxfd)
        me.maxfd = sock;

    if (vhost != NULL)
    {
        struct addrinfo *bindres = NULL;
        
        if ((error = getaddrinfo(vhost, NULL, &hints, &bindres)))
        {
            freeaddrinfo(res);
            close_portable(sock);
            sigyn_fatal("Cannot resolve vhost (%s): %s", vhost, gai_strerror(error));
        }
        if (bindres->ai_addr == NULL)
        {
            freeaddrinfo(res);
            freeaddrinfo(bindres);
            sigyn_fatal("Cannot resolve vhost (%s).");
        }

        optval = 1;
        setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval));

        if (bind(sock, bindres->ai_addr, bindres->ai_addrlen) < 0)
        {
            freeaddrinfo(res);
            freeaddrinfo(bindres);
            close_portable(sock);
            sigyn_fatal("Unable to bind to vhost (%s): %s", vhost, strerror(errno));
        }

        freeaddrinfo(bindres);
    }

    logger(LOG_DEBUG, "Setting file descriptor %d as non-blocking.", sock);

#ifdef _WIN32
    ioctlsocket(sock, FIONBIO, 1);
#else
    flags = fcntl(sock, F_GETFL, 0);
    flags |= O_NONBLOCK;
    fcntl(sock, F_SETFL, flags);
#endif

    switch(res->ai_family)
    {
        case AF_INET:
            ((struct sockaddr_in *) res->ai_addr)->sin_port = htons(port);
            break;
        case AF_INET6:
            ((struct sockaddr_in6 *) res->ai_addr)->sin6_port = htons(port);
            break;
    }

    if ((connect(sock, res->ai_addr, res->ai_addrlen) == -1)
            && errno != EINPROGRESS && errno != EINTR)
    {
        close_portable(sock);
        freeaddrinfo(res);
        if (vhost)
            sigyn_fatal("Failed to connect to %s (Using vhost %s): %s",
                    uplink, vhost, strerror(errno));
        else
            sigyn_fatal("Failed to connect to %s: %s", uplink, strerror(errno));
    }

    freeaddrinfo(res);

    return sock;
}