Пример #1
0
verifyne::Ticket *verifyne::Api::request_new_ticket(std::string purpose, verifyne::Ticket::TICKET_TYPE ticket_type)
{
    /* Generate fresh nonce */

    std::random_device rd;
    std::uniform_int_distribution<int> distribution(0,255);

    std::stringstream ss_nonce;
    for(int i = 0; i < 16; i++) {
        ss_nonce << std::hex << distribution(rd);
    }
    std::string nonce(ss_nonce.str());

    verifyne::ApiResponse *ar = new_ticket(purpose, nonce, ticket_type);
    verifyne::Ticket *ticket = new verifyne::Ticket(ar);

    delete ar;

    return ticket;
}
Пример #2
0
int main(int argc, char *argv[])
{
    int free_parking_lots = PARKING_LOT_SIZE;
    char *entrance_log,*exit_log; // Strings para log files
    char msg_buffer[30];
    char time_string[30];
    
    /* Auxiliares */
    int status;       // Estatus de procedimientos
    int i;            // Iteraciones
    int last_ticket;  // Último ticket
    struct msg *m;    // Auxiliar para lectura de mensajes
    pthread_t tid;    // Thread para socket
    

    if (argc != 7) {
        printf ("Uso: sem_svr -l <puerto_sem_svr> -i <bitácora_entrada> -o <bitácora_salida> \n");
        exit(0);
    }

    /* Port get for listening */
    if      (strcmp("-l",argv[1]) == 0 ) listen_port = atoi(argv[2]);
    else if (strcmp("-l",argv[3]) == 0 ) listen_port = atoi(argv[4]);
    else if (strcmp("-l",argv[5]) == 0 ) listen_port = atoi(argv[6]);
    else {
        perror("Error: No se ha especificado del puerto");
        exit(0);
    }

    if      (strcmp("-i",argv[1]) == 0 ) entrance_log = argv[2];
    else if (strcmp("-i",argv[3]) == 0 ) entrance_log = argv[4];
    else if (strcmp("-i",argv[5]) == 0 ) entrance_log = argv[6];
    else {
        perror("Error: No se ha especificado la bitacora de entrada");
        exit(0);
    }

    if      (strcmp("-o",argv[1]) == 0 ) exit_log = argv[2];
    else if (strcmp("-o",argv[3]) == 0 ) exit_log = argv[4];
    else if (strcmp("-o",argv[5]) == 0 ) exit_log = argv[6];
    else {
        perror("Error: No se ha especificado la bitacora de salida");
        exit(0);
    }
    /* Initialize parking lot */
    for (i = 0; i < PARKING_LOT_SIZE; ++i)
        parking_space[i] = NULL;
    /* initialize circular buffer for messages*/
    init_buffer(&cb,(sizeof(struct msg)));


    /* Iniciando hilo de socket de lectura */ 
    pthread_create(&tid, NULL, read_messages, NULL);
    pthread_detach(tid);

    /* Ciclo indefinido de espera de mensajes, procesamiento y respuesta*/
    while (1){
        // Entrega de tickets y aceptar tickets de salida
        while(free_parking_lots > 0 ) {

            /* Esperar a el socket haya recibido alg'un mensaje */
            while (its_empty(cb))
                sleep(0.5); 
            
            /* Consumir mensaje */
            m = read_cb(&cb);

            if (m->in_out=='e')
            {   
                last_ticket = new_ticket();
                --free_parking_lots;

                strftime(time_string
                        ,30
                        ,"%d%m%Y%H%M"
                        ,parking_space[last_ticket]);

                // formato BDDMMYYYYHHMMSSS con SSS como ticket serial
                sprintf(msg_buffer,"1%s%03d",time_string,last_ticket);

                write_action(entrance_log,WENT_IN,last_ticket);
                answerClient(m->client.sin_addr,msg_buffer); 

            }
            else if (m->in_out=='s' && parking_space[m->car_id] != NULL)
            {
                ++free_parking_lots;

                last_payment = ticket_price(m->car_id);

                sprintf(msg_buffer,"X%d",last_payment);
                answerClient(m->client.sin_addr,msg_buffer);

                write_action(exit_log,WENT_OUT,m->car_id);

                
            }
            else if (m->in_out=='s' && parking_space[m->car_id] == NULL)
                printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n");
            else printf("Accion inesperada\n");
            
        }
        

        /* Indicar que no hay puestos libres o aceptar ticket de salida */
        while(free_parking_lots == 0)
        {   
            while (its_empty(cb)) 
                sleep(0.5); 

            m = read_cb(&cb);

            if (m->in_out=='e') {
                strftime(time_string
                        ,20
                        ,"%d%m%Y%H%M"
                        ,parking_space[last_ticket]);

                sprintf(msg_buffer,"0%sXXX",time_string);

                answerClient(m->client.sin_addr,msg_buffer);  
                write_action(entrance_log,FULL,last_ticket);
            }
            else if (m->in_out=='s' && parking_space[m->car_id] != NULL){
                ++free_parking_lots;

                last_payment = ticket_price(m->car_id);

                sprintf(msg_buffer,"X%d",last_payment);
                answerClient(m->client.sin_addr,msg_buffer); 

                write_action(exit_log,WENT_OUT,m->car_id);
                
            }
            else if (m->in_out=='s' && parking_space[m->car_id] == NULL)
                printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n");
            else printf("Accion inesperada\n");
        }   
    }

}