static void test_parsear() { // t_cpu* cpuPrimera = crearCPU(); // t_header* header = malloc(sizeof(header)); // char* buffer; // void* extra; // header->tipoMensaje= CONTEXTO_MPROC; // header->tamanioMensaje = strlen(buffer); // char* rutaArchivoMcod = {"/home/utnso/corto.cod"}; // t_pcb* pcb = malloc(sizeof(t_pcb)); // pcb->pid = crearPid(); // pcb->rutaArchivoMcod = rutaArchivoMcod; // pcb->tieneDesalojo = false; // pcb->tamanioRafaga = 10; // pcb->proximaInstruccion = 0; char* texto = { "iniciar 2;leer 0;leer 1;finalizar;" }; char** resultado; char** subInstruccion; char** palabra_instruccion; resultado = string_n_split(texto, 2, ";"); CU_ASSERT_STRING_EQUAL(resultado[0], "iniciar 2"); CU_ASSERT_STRING_EQUAL(resultado[1], "leer 0;leer 1;finalizar;"); subInstruccion = string_split(resultado[1], ";"); CU_ASSERT_STRING_EQUAL(subInstruccion[0], "leer 0"); CU_ASSERT_STRING_EQUAL(subInstruccion[1], "leer 1"); CU_ASSERT_STRING_EQUAL(subInstruccion[2], "finalizar"); palabra_instruccion = string_split(resultado[0], " "); CU_ASSERT_STRING_EQUAL(palabra_instruccion[0], "iniciar"); CU_ASSERT_STRING_EQUAL(palabra_instruccion[1], "2"); int cantPaginas = 0; cantPaginas = atoi(palabra_instruccion[1]); CU_ASSERT_EQUAL(cantPaginas, 2); // recibirMensajeVarios(header, buffer, extra, // cpuPrimera); }
static void test_string_n_split_is_empty() { char* line = ""; char** substrings = string_n_split(line, 10, ";"); CU_ASSERT_PTR_NOT_NULL(substrings); CU_ASSERT_PTR_NULL(substrings[0]); free(substrings); }
static void test_string_n_split_when_separator_isnt_included() { char *line = "Hola planeta tierra"; char ** substrings = string_n_split(line, 5, ";"); CU_ASSERT_PTR_NOT_NULL(substrings); CU_ASSERT_STRING_EQUAL(substrings[0], line); CU_ASSERT_PTR_NULL(substrings[1]); string_iterate_lines(substrings, (void *) free); free(substrings); }
static void test_string_n_split_when_n_is_less_than_splitted_elements() { char *line = "Hola planeta tierra"; char** substrings = string_n_split(line, 2, " "); CU_ASSERT_PTR_NOT_NULL(substrings); CU_ASSERT_STRING_EQUAL(substrings[0], "Hola"); CU_ASSERT_STRING_EQUAL(substrings[1], "planeta tierra"); CU_ASSERT_PTR_NULL(substrings[2]); string_iterate_lines(substrings, (void*) free); free(substrings); }
static void test_parsear_cod_leer(){ char* texto = { "iniciar 2;leer 0;leer 1;finalizar;" }; char** resultado; char** subInstruccion; char** palabra_instruccion; resultado = string_n_split(texto, 2, ";"); CU_ASSERT_STRING_EQUAL(resultado[0], "iniciar 2"); CU_ASSERT_STRING_EQUAL(resultado[1], "leer 0;leer 1;finalizar;"); subInstruccion = string_split(resultado[1], ";"); CU_ASSERT_STRING_EQUAL(subInstruccion[0], "leer 0"); CU_ASSERT_STRING_EQUAL(subInstruccion[1], "leer 1"); CU_ASSERT_STRING_EQUAL(subInstruccion[2], "finalizar"); palabra_instruccion = string_split(resultado[0], " "); CU_ASSERT_STRING_EQUAL(palabra_instruccion[0], "iniciar"); CU_ASSERT_STRING_EQUAL(palabra_instruccion[1], "2"); int cantPaginas = 0; cantPaginas = atoi(palabra_instruccion[1]); CU_ASSERT_EQUAL(cantPaginas, 2); }
int leerPersistencia() { pthread_mutex_init(&mPersistFile, NULL); sem_init(&sPersistencia, 0, 0); persistFile = fopen("./FileSystem.persist", "r"); if (persistFile == NULL) return EXIT_SUCCESS; char* linea = malloc(MAX_BUFF_SIZE); int ret = 0; int index = 1; //El 0 es el directorio raiz que esta por default if (buscarSeccion(SECCION_LISTA_DIRS) == EXIT_SUCCESS) { ret = fgets(linea,MAX_BUFF_SIZE,persistFile); while((ret != NULL) && (strstr(linea,"#") == NULL)) { char** lDir = string_split(linea,";"); t_reg_directorio* dir = malloc(sizeof(t_reg_directorio)); strcpy(dir->directorio,lDir[0]); dir->padre = atoi(lDir[1]); list_add_in_index(listaDirs,index,dir); ret = fgets(linea,MAX_BUFF_SIZE,persistFile); index++; } } if (buscarSeccion(SECCION_LISTA_CONEXIONES) == EXIT_SUCCESS) { ret = fgets(linea,MAX_BUFF_SIZE,persistFile); while((ret != NULL) && (strstr(linea,"#") == NULL)) { char** lConexion = string_n_split(linea, 4, ";"); Conexion_t* conexion = malloc(sizeof(Conexion_t)); strcpy(conexion->nombre, lConexion[0]); conexion->estado = NO_DISPONIBLE; conexion->sockfd = -1; conexion->totalBloques = atoi(lConexion[2]); conexion->estadoBloques = calloc(conexion->totalBloques,sizeof(bool)); sem_init(&(conexion->respuestasR),0,1); sem_init(&(conexion->respuestasP),0,0); pthread_mutex_init(&(conexion->mSocket), NULL); pthread_mutex_init(&(conexion->mEstadoBloques), NULL); for (int i=0;i<conexion->totalBloques;i++) { if (lConexion[3][i] == '1') { conexion->estadoBloques[i] = true; }else { conexion->estadoBloques[i] = false; } } list_add(conexiones,conexion); ret = fgets(linea,MAX_BUFF_SIZE,persistFile); } } if (buscarSeccion(SECCION_LISTA_ARCHIVOS) == EXIT_SUCCESS) { ret = fgets(linea,MAX_BUFF_SIZE,persistFile); while((ret != NULL) && (strstr(linea,"#") == NULL)) { char** lArchivo = string_n_split(linea,5,";"); char** lBloques = string_split(lArchivo[4],"//"); t_reg_archivo* archivo = malloc(sizeof(t_reg_archivo)); list_add(listaArchivos,archivo); strcpy(archivo->nombre,lArchivo[0]); archivo->dirPadre = atoi(lArchivo[1]); archivo->estado = NO_DISPONIBLE; archivo->tamanio = atoll(lArchivo[3]); pthread_mutex_init(&(archivo->mBloques),NULL); archivo->bloques = list_create(); int i = 0; char** lUbicaciones; while(lBloques[i] != NULL) { t_list* ubicaciones = list_create(); list_add_in_index(archivo->bloques, i, ubicaciones); lUbicaciones = string_n_split(lBloques[i],3,";"); while (lUbicaciones[0] != NULL) { t_ubicacion_bloque* ubicacion = malloc(sizeof(t_ubicacion_bloque)); ubicacion->nodo = getConexionByNombre(lUbicaciones[0]); ubicacion->bloque = atoi(lUbicaciones[1]); list_add(ubicaciones,ubicacion); if ((lUbicaciones[2] != NULL) && (strcmp(lUbicaciones[2],"\n") != 0)) { lUbicaciones = string_n_split(lUbicaciones[2],3,";"); }else { lUbicaciones[0] = NULL; } } i++; } ret = fgets(linea,MAX_BUFF_SIZE,persistFile); } } return EXIT_SUCCESS; }
//Recibe y procesa un mensaje recibido void receiptMessage(void * arguments) { args_receiptMessage * args = arguments; int numbytes; /* bytes recibidos por cada lectura (0 = desconexion del cliente) */ char buffer[MAXDATASIZE]; /* buffer de lectura */ bool bufferUsed; /* determina si se analizo por lo menos una vez un nuevo set de datos */ unsigned int n = -1; /* cantidad de argumentos del packete que recibo */ int i = 0; /* ayuda a saber la ultima posicion de lectura en el buffer (tambien se usa como i en otros casos) */ int j = 0; /* j de for */ int seps = 0; /* cantidad de separadores ,(coma) contados en el encabezado del paquete */ char * packet_head; /* encabezado del paquete */ char * packet_body; /* cuerpo del paquete */ char * exceeded; /* datos excedidos del final del paquete */ char * str_tmp; /* temporar para operaciones de string */ bool isExceeded = false; /* determina si hay datos excedidos cargados en el buffer */ bool fullHead = false; /* determina si ya fue recibido el encabezado del paquete */ int bytesBody = 0; /* determina los bytes que contendrá el cuerpo del paquete */ char ** head = NULL; /* encabezado divido por n, name y bytes de los args */ char * b; /* utilizado para extraer bytes del buffer */ void (*fn)(); /* utilizado para guardar la funcion que hay que ejecutar del cliente */ char ** packet_args; /* Argumentos que se envian por la funcion */ //loopeo while(1) { //si en la ultima lectura dejo informacion excedida la guardo if(isExceeded) exceeded = string_duplicate(buffer); //Pongo en blanco el buffer buffer[0] = '\0'; //Espero a recibir un mensaje del job, si se produce un error lo informo error y finalizo hilo if ((numbytes=recv(args->connection->socket, buffer, MAXDATASIZE-1, 0)) == -1) { //perror("recv"); break; } //si en la ultima lectura dejo informacion excedida la agrego al inicio del buffer if(isExceeded) { exceeded = string_new(); string_append(&exceeded, buffer); buffer[sizeof(exceeded)] = '\0'; //mejor que memset? strcpy(buffer, exceeded); free(exceeded); } //finalizo el hilo if(numbytes == 0) break; else { //Corta el bufer hasta donde recibe informacion buffer[numbytes] = '\0'; //analizo el buffer si es la primera vez que lo voy a analizar o si queda informacion excedida para seguir analizando //(Analizar significa, buscar paquetes completos y ejecutarlos) bufferUsed = false; while(!bufferUsed || isExceeded) { bufferUsed = true; isExceeded = false; i = 0; //si comienzo a leer un nuevo paquete inicializo el head y el body if(n == -1) { packet_head = string_new(); packet_body = string_new(); } //recorro buffer hasta armar cabezal si no esta armado if(!fullHead) { for(i = 0; i < strlen(buffer); i++) { b = buffer[i]; //primer caracter es [n] (cantidad de args) if(n == -1) n = atoi(&b); //cuento comas else if(b == ',') seps++; //voy completando cabezal string_append(&packet_head, &b); //fianlizo cuando llego al ultimo separador if(n+2 == seps) { fullHead = true; i++; //dejo posicion en el primer byte del cuerpo del paquete break; } } } //cabezal completo if(fullHead) { //si el cabezal no fue explodiado, le doy explode y calculo los bytes del cabezal if(head == NULL) { //hago explode head = string_n_split(packet_head, n+2, ","); for(j = 2; j < n+2; j++) bytesBody += atoi(head[j]); } //Agrego al cuerpo del packete todos los datos str_tmp = string_substring_from(buffer, i); string_append(&packet_body, str_tmp); free(str_tmp); //paquete completo if(bytesBody <= strlen(packet_body)) { //si el paquete esta excedido, corto el paquete en la posicion correspondiente y guardo el excedente sobre el buffer if(bytesBody < strlen(packet_body)) { isExceeded = true; exceeded = string_substring_from(packet_body, bytesBody); str_tmp = string_substring_until(packet_body, bytesBody); free(packet_body); packet_body = str_tmp; buffer[0] = '\0'; strcpy(buffer, exceeded); free(exceeded); } //llamo a la funcion que maneja los mensajes recibidos if(args->fns_receipts != NULL) { i = 0; //armo argumentos en array packet_args = malloc(sizeof(char*)*n); for(j = 2; j < n+2; j++) { char * part = string_substring(packet_body, i, atoi(head[j])); packet_args[j-2] = part; i += atoi(head[j]); } //Si n=0 el split no toma el vacio despues de la coma final.. quito ultima coma if(n==0) head[1][strlen(head[1])-1] = '\0'; //Ejecuto la función solicitada, si no existe la función muestro error fn = dictionary_get(args->fns_receipts, head[1]); if(fn != NULL) fn(args->connection, packet_args); else printf("Cliente SOCK%d(%s:%d) intento ejecutar la función inexistente '%s'.\n", args->connection->socket, args->connection->ip, args->connection->port, head[1]); //libero argumentos for(i = 0; i < n; i++) free(packet_args[i]); free(packet_args); } free(packet_head); free(packet_body); for(i = 0; i < n+3; i++) free(head[i]); free(head); n = -1; seps = 0; fullHead = false; bytesBody = 0; head = NULL; } } } } } //cierro socket close(args->connection->socket); //Informo a la funcion que maneja los cierres (si existe y la estructura de conexion lo permite) if(args->connection->run_fn_connectionClosed && args->fn_connectionClosed != NULL) args->fn_connectionClosed(args->connection); //libero memoria if(isExceeded) free(exceeded); if(n != -1) { free(packet_head); free(packet_body); } free(args); }