Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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;
}
Esempio n. 7
0
//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);
}