Exemplo n.º 1
0
int main(int argc, char* argv[])
{
    int c, s, val, threaded = 0;
    socklen_t salen;
    struct sockaddr_in saddr, client_saddr;
    short port = 1234;
    
    while ((c = getopt(argc, argv, "tp:")) != EOF) {
        switch (c) {
        case 'p':
            port = atoi(optarg);
            break;
        case 't':
            threaded = 1;
            break;
        default:
            usage(argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    val = 1;
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    bzero(&saddr, sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);
    saddr.sin_addr.s_addr = INADDR_ANY;
    
    if (bind(s, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    if (listen(s, 5) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    if ((c = accept(s, (struct sockaddr*)&client_saddr, &salen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    if (threaded)
        exit(create_read_and_exec_thread(c));
    else
        exit(read_and_exec(c));
}
Exemplo n.º 2
0
int main(int argc, char *argv[]) {
    if (argc != 2) {
        print_err("Arguments failure");
    }

    pid_t main_pid = fork();
    switch(main_pid) {
        case 0:
            break;
        case -1:
            print_err("Can't fork main");
        default:
            exit(0);
    }

    if(setsid()<0) {
        print_err("Can't start new session");
    }
    pid_t nsession_pid = fork();
    switch(nsession_pid) {
        case 0:
            break;
        case -1:
            print_err("Can't fork from deamon");
        default:
            return 0;
    }

    pid_t daemon_pid = getpid();
    int tmp_fd = open("/tmp/netsh.pid", O_WRONLY | O_CREAT);
    char* buf = new char[64];
    int digits = sprintf(buf, "%d\n", daemon_pid);
    ssize_t written_count = write(tmp_fd, buf, digits);
    if (written_count == -1) {
        close(tmp_fd);
        print_err("Failed to write pid to file");
    }
    close(tmp_fd);
    //Done pre part

    const int epoll_size = 32;
    struct epoll_event event;
    struct epoll_event *events;

    //prepare socket
    int socket_fd = create_and_bind(argv[1]);
    make_socket_non_blocking(socket_fd);
    if (listen(socket_fd, SOMAXCONN) == -1) {
        print_err("Can't setup listener");
    }

    //Setup epoll
    int epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        print_err("Can't create epoll");
    }
    event.data.fd = socket_fd;
    event.events = EPOLLIN | EPOLLET;
    int ectl_status = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &event);
    if (ectl_status == -1) {
        print_err("Can't register fd in epoll");
    }

    events = calloc(epoll_size, sizeof(event));

    while (1)
    {
        int n, i;

        n = epoll_wait (epoll_fd, events, epoll_size, -1);
        for (i = 0; i < n; i++)
        {
            if ((events[i].events & EPOLLERR) ||
                (events[i].events & EPOLLHUP) ||
                (!(events[i].events & EPOLLIN)))
            {
                close (events[i].data.fd);
                continue;
            }

            else if (socket_fd == events[i].data.fd)
            {
                while (1)
                {
                    struct sockaddr in_addr;
                    socklen_t in_len;
                    int infd;
                    char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

                    in_len = sizeof in_addr;
                    infd = accept (socket_fd, &in_addr, &in_len);
                    if (infd == -1)
                    {
                        if ((errno == EAGAIN) ||
                            (errno == EWOULDBLOCK))
                        {
                            break;
                        }
                        else
                        {
                            perror ("Can't accept");
                            break;
                        }
                    }
                    int unblock_status = make_socket_non_blocking (infd);
                    if (unblock_status == -1)
                        print_err("Can't unblock socket");

                    event.data.fd = infd;
                    event.events = EPOLLIN | EPOLLET;
                    int epc_status = epoll_ctl (epoll_fd, EPOLL_CTL_ADD, infd, &event);
                    if (epc_status == -1)
                    {
                        print_err("Can't add flags");
                    }
                }
                continue;
            }
            else if (events[i].events == EPOLLIN)
            {
                int done = 0;
                read_and_exec(events[i].data.fd);

                if (1)
                {
                    close (events[i].data.fd);
                }
            } else if (events[i].events == EPOLLOUT) {

            }
        }
    }
    return 0;
}
Exemplo n.º 3
0
void* read_and_exec_thread(void* arg)
{
    return (void*)read_and_exec((int)arg);
}