示例#1
0
int log_init()
{
    log_filter = get_log_level_from_config();   
    log_info_message("log filter is %s", log_level_string(log_filter));
    pthread_mutex_init(&log_thread_mutex, NULL);
    if(0 != pthread_create(&log_thread_t, NULL, log_monitor, NULL))
    {
        log_error_message("log monitor thread fail");
        pthread_mutex_destroy(&log_thread_mutex);
        return -1;
    }
    return 0;
}
int socket_init()
{
    char *ip = NULL;
    g_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == g_sockfd)
    {
        log_error_message("socket fail"); 
        return -1;     
    } 
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
    server_addr.sin_port = htons(SERVER_PORT);   
    
    ip = inet_ntoa(server_addr.sin_addr); 
    if(NULL == ip)
    {
        log_error_message("inet_ntoa fail");
        return -1;
    }
    int on;
    on = 1;
    setsockopt(g_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );    
    if(-1 == bind(g_sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)))
    {
        log_error_message("bind fail");
        return -1;
    }

    if(-1 == listen(g_sockfd, 3))
    {
        log_error_message("listen fail");
        return -1;
    }
    log_info_message("server ip:%s listen in:%d", ip, ntohs(server_addr.sin_port));
    return g_sockfd;
}
int main(int argc, char **argv) {
    char log_text[2000];
    char* nombre = string_substring_from(argv[1], 2);
    char* nombre_log = string_duplicate(nombre);
    char* log = ".log";
    string_append(&nombre_log, log);
    inicializar_log(nombre_log, "Programa");
    habilitar_log_info();
    sprintf(log_text, "Proceso Programa %s Iniciado", nombre);
    log_info_message(log_text);
    log_info_message("Chequeando el path del script...");
    if (argv[1] == NULL ) {
        log_error_message("El path del script no puede ser vacio.");
        finalizar_log();
        return EXIT_FAILURE;
    }

//	CONEXION CON KERNEL
    t_KER_PRO_CPU_UMV mensajeAEnviar = obtener_nueva_shared_str();
    t_KER_PRO_CPU_UMV* mensajeARecibir;
    log_debug_message("Se inicia la conexion con el KERNEL");
    int socket;
//	ACA VA LO DE LA VARIABLE DE ENTORNO
    char* rutaConfiguracion = getenv("ANSISOP_CONFIG");
    t_config *config = config_create(rutaConfiguracion);
    int puerto = config_get_int_value(config, "Puerto");
    char* ip = config_get_string_value(config, "IP");
    sprintf(log_text, "LA IP ES: %s\n", ip);
    log_info_message(log_text);
    sprintf(log_text, "EL PUERTO ES: %i\n", puerto);
    log_info_message(log_text);
    socket = conectar_a_servidor(ip, puerto);
    if (socket == -1) {
        return EXIT_FAILURE;
    }
    log_debug_message("Conectado\n");

//	SE LEVANTA EL SCRIPT
    sprintf(log_text, "Se levantan datos del script en el path:%s", argv[1]);
    log_info_message(log_text);

    int num = 0;
    log_debug_message("se abre el archivo");
    FILE* script;
    script = fopen(argv[1], "r");
    log_debug_message("se abrio el archivo");
    int tamanio;
    fseek(script, 0, SEEK_END);
    tamanio = ftell(script) + 1;
    sprintf(log_text, "El tamanio del script es: (%d)", tamanio);
    log_info_message(log_text);
    char codigo[tamanio];
    rewind(script);
    char aux;
    while (feof(script) == 0) {
        aux = fgetc(script);
        codigo[num] = aux;
        num++;
    }
    log_debug_message("se termino de leer");

//	printf("num vale: (%d)\n", num);
    num = num - 1;
//	printf("ahora num vale: (%d)\n", num);

    sprintf(log_text, "LEO: ('nueva linea')y pongo en posicion (%d)", num);
    log_debug_message(log_text);
    codigo[num] = '\n';
    num++;
    sprintf(log_text, "LEO: ('barra 0')y pongo en posicion (%d)", num);
    log_debug_message(log_text);
    codigo[num] = '\0';

    sprintf(log_text, "El script es: \n%s", codigo);
    log_debug_message(log_text);

    sprintf(log_text, "La longitud del codigo es: %i\n", strlen(codigo));
    log_info_message(log_text);

    fclose(script);

    mensajeAEnviar.codigo = codigo;
    mensajeAEnviar.mensaje = nombre;
    log_debug_message("se copia el codigo");

    sprintf(log_text, "El codigo copiado en el mensaje es: (%s)",
            mensajeAEnviar.codigo);
    log_debug_message(log_text);

//	SE ENVIA EL HANDSHAKE

    log_info_message(
        "Se envia HANDSHAKE al PLP con el Codigo y el Nombre del programa\n");
    enviar_mensaje_a_servidor(socket, HANDSHAKE_PROGRAMA_PLP, &mensajeAEnviar);
    void *msj = recibir_mensaje_de_servidor(socket);
    if (msj != NULL ) {
        mensajeARecibir = (t_KER_PRO_CPU_UMV*) msj;
    } else {
        log_debug_message("ERROR AL RECIBIR MENSAJE NULO");
        return -1;
    }
    if (mensajeARecibir->gen_msg.id_MSJ != HANDSHAKE_PROGRAMA_PLP
            || mensajeARecibir->OK != 1) {
        sprintf(log_text, "%s\n", mensajeARecibir->mensaje);
        log_info_message(log_text);
        return -1;
    } else {
        log_info_message("Respuesta Handshake entre PROGRAMA-KERNEL recibida");
    }

    while (1) {
        log_info_message(
            "\nEL PROGRAMA SE QUEDA ESPERANDO MENSAJES DE IMPRIMIR/ IMPRIMIR TEXTO O FINALIZAR EJECUCION\n");
        msj = recibir_mensaje_de_servidor(socket);
        if (msj != NULL ) {
            mensajeARecibir = (t_KER_PRO_CPU_UMV*) msj;
        } else {
            log_debug_message("ERROR AL RECIBIR MENSAJE NULO");
            return -1;
        }

        switch (mensajeARecibir->gen_msg.id_MSJ) {
        case IMPRIMIR: {
            log_info_message("LLEGO MENSAJE CON ID IMPRIMIR");
            sprintf(log_text, "SE IMPRIME EL VALOR DE LA VARIABLE: %i\n",
                    mensajeARecibir->valor);
            log_info_message(log_text);
            break;
        }
        case IMPRIMIR_TEXTO: {
//			SE HACE LO DE IMPRIMIR TEXTO
            log_info_message("LLEGO MENSAJE CON ID IMPRIMIR TEXTO");
            sprintf(log_text, "SE IMPRIME EL TEXTO:\n\n %s\n",
                    mensajeARecibir->texto);
            log_info_message(log_text);
            break;
        }
        case FINALIZACION_EJECUCION_PROGRAMA: {
            log_info_message(
                "\n---------------LLEGO UN MENSAJE DE FINALIZACION----------------\n");
            log_info_message("\nLA EJECUCION DE ESTE PROGRAMA HA CONCLUIDO\n");
            return EXIT_SUCCESS;
            break;
        }
        default: {
            log_info_message(
                "\n---------------LLEGO UN MENSAJE DESCONOCIDO A PROGRAMA----------------\n");
        }
        }
    }
    return EXIT_SUCCESS;
}