Beispiel #1
0
/// Send all stored movements
void send_movements()
{
    if(queue == NULL)
        return;
        
    printf("\nSending data to server\n");
    SendData *data;
    int result;
    while(queue != NULL){
        data = SendData_create();
        printf("URL: %s\n", queue->URL);
        curl_connect(data, queue->URL);
        result = data->result;
        if(result == 0){
            if(data->size > 10)
                printf("Sent successfully with response: {%s}\n", data->memory);
            else
                printf("Sent successfully with response: { ... }\n");
        } else
            printf("Failed to send with error: [%i]\n", result);
        SendData_destroy(data);
        if(result != 0){
            return;
        }
        LinkedMovement *LM = queue;
        queue = queue->next;
        LinkedMovement_destroy(LM);
    }
}
int main(int argc, char *argv[]) {
#ifdef DEBUG
    int daemonize = 0;
#else
    int daemonize = 1;
#endif
    int c;
    pid_t pid, sid;
    CURLcode cr = CURLE_WRITE_ERROR; /* Check if this is the best initialization */
    time_t delay = 0;

    signal(SIGHUP, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);
    signal(SIGQUIT, signal_handler);

    while ((c = getopt(argc, argv, "nh|help")) != -1) {
        switch (c) {
            case 'h':
                PrintUsage (argc, argv);
                exit (EXIT_SUCCESS);
                break;
            case 'n':
                daemonize = 0;
                break;
            default:
                PrintUsage (argc, argv);
                exit (EXIT_SUCCESS);
                break;
        }
    }

#ifdef DEBUG
    setlogmask (LOG_UPTO (LOG_DEBUG));
    openlog (DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
#else
    setlogmask (LOG_UPTO (LOG_INFO));
    openlog (DAEMON_NAME, LOG_CONS, LOG_USER);
#endif

    /* daemon stuff */
    if (daemonize) {
        syslog (P_INF, "%s daemon starting up", DAEMON_NAME);

        if ((pid = fork ()) < 0) {
            syslog (P_ERR, "Could not fork child process: %m");
            exit (EXIT_FAILURE);
        } else if (pid > 0) {
            syslog (P_NTC, "Child process successfully forked");
            exit (EXIT_SUCCESS);
        }

        umask(0);

        sid = setsid();
        if (sid < 0) {
            syslog (P_ERR, "Could not create new session: %m");
            exit (EXIT_FAILURE);
        }

        if ((chdir ("/")) < 0) {
            syslog (P_ERR, "Could not change working dir: %m");
            exit (EXIT_FAILURE);
        }

        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }

    while ((cr == CURLE_WRITE_ERROR) || (cr == CURLE_OK) || (cr == CURLE_HTTP_RETURNED_ERROR)) {
        time_t uptime = 0, last_tcp_error = time(NULL);

        cr = curl_connect();

        if ((uptime = (time(NULL) - last_tcp_error)) > 240) {
            syslog(P_INF, "UP for more than 4 minutes, resetting delay");
            delay = 0;
        }

        if (cr == CURLE_HTTP_RETURNED_ERROR) {
            if (delay < 10)
                delay = 10;
            else
                delay *= 2;

            if (delay > 240)
                delay = 240;

            syslog(P_INF, "HTTP error - sleeping for %ld seconds", delay);
            sleep(delay);
        } else {
            if (delay < 1)
                delay = 1;
            else
                delay += 1;

            if (delay > 16)
                delay = 16;

            syslog(P_INF, "Connection error (%d) - sleeping for %ld seconds", cr, delay);
            sleep(delay);
        }
    }

    syslog (P_INF, "CURL ERROR: %d\n", cr);
    syslog (P_INF, "%s shutting down", DAEMON_NAME);

    exit (EXIT_SUCCESS);
}