// File: /workspace/github_c_makefile_star2_O3/carlitosmarin[P]Sistema-Ficheros-SOII/./src/directorios.c
// Function: mi_unlink
int mi_unlink (const char *camino) {
	int pid = 0, pi = 0, pe = 0;
	int BE = buscar_entrada(camino, &pid, &pi, &pe, 0, 0);
	if(BE < 0) { //Tratamiento de errores
		switch(BE){
		case -1: printf("\"%s\" Camino no valido\n", camino); break;
		case -2: printf("No tienes permisos de lectura\n"); break;
		case -3: printf("Error en la lectura de la entrada \"%s\"\n", camino); break;
		case -4: printf("No existe la entrada \"%s\"\n", camino); break;
		case -5: printf("Error a la hora de reservar un inodo"); break;
		case -6: printf("No existe directorio intermedio a \"%s\"", camino); break;
		case -7: printf("Error a la hora de liberar un inodo"); break;
		case -8: printf("Error en la escritura de la entrada \"%s\"\n", camino); break;
		case -9: printf("Ya existe la entrada \"%s\"\n", camino); break;
		}
		return -1; //Error BE
	} else {
		struct inodo in;
		in = leer_inodo(pid);
		int nentradas = in.tamBytesLogicos/sizeof(struct entrada);

		//Si no es la ultima entrada
		if(nentradas-1 != pe) {
			struct entrada entr;
			if(mi_read_f(pid, &entr, (nentradas-1) * sizeof(struct entrada), sizeof(struct entrada)) < 0) return -2; //Error LECTURA
			mi_waitSem();
			mi_write_f(pid,&entr, pe*sizeof(struct entrada), sizeof(struct entrada)); //Error ESCRITURA
			mi_signalSem();
		}
		mi_waitSem();
		if(mi_truncar_f(pid,(nentradas-1)*sizeof(struct entrada)) < 0) return -4; //Error TRUNCAR
		mi_signalSem();

		in = leer_inodo(pi);

		//Si no tiene mas links, borramos el el propio fichero o directorio
		if(in.cantLinks == 1) {
			mi_waitSem();
			if(liberar_inodo(pi) < 0) return -6; //Error LIBERAR_INODO
			mi_signalSem();
		} else { //Si no, actualizamos
			in.ctime = time(NULL);
			in.cantLinks--; //Restamos el link que hemos quitado
			mi_waitSem();
			if(escribir_inodo(in, pi) < 0)return -5; //Escribimos el inodo Error ESCRIBIR_INODO
			mi_signalSem();
		}
	}
	return 0;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x190, %rsp            # imm = 0x190
movq %rdi, %rbx
xorl %eax, %eax
leaq 0x8c(%rsp), %rsi
movl %eax, (%rsi)
leaq 0x88(%rsp), %rdx
movl %eax, (%rdx)
leaq 0x84(%rsp), %rcx
movl %eax, (%rcx)
xorl %r8d, %r8d
xorl %r9d, %r9d
callq 0x2de3
testl %eax, %eax
js 0x3757
movl 0x8c(%rsp), %ebx
leaq 0x110(%rsp), %r14
movq %r14, %rdi
movl %ebx, %esi
callq 0x1995
movl 0x24(%r14), %ebp
shrl $0x6, %ebp
decl %ebp
movl 0x84(%rsp), %r14d
cmpl %r14d, %ebp
jne 0x3776
shll $0x6, %ebp
jmp 0x37c0
addl $0x9, %eax
leaq 0xb67(%rip), %rcx       # 0x42c8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xcff(%rip), %rdi       # 0x4470
jmp 0x38dc
shll $0x6, %ebp
leaq 0x90(%rsp), %rsi
movl %ebx, %edi
movl %ebp, %edx
movl $0x40, %ecx
callq 0x2881
testl %eax, %eax
js 0x387c
xorl %eax, %eax
callq 0x1355
shll $0x6, %r14d
leaq 0x90(%rsp), %rsi
movl %ebx, %edi
movl %r14d, %edx
movl $0x40, %ecx
callq 0x2524
xorl %eax, %eax
callq 0x1361
xorl %eax, %eax
callq 0x1355
movl %ebx, %edi
movl %ebp, %esi
callq 0x2c58
testl %eax, %eax
js 0x382e
xorl %eax, %eax
callq 0x1361
movl 0x88(%rsp), %ebx
leaq 0x90(%rsp), %r14
movq %r14, %rdi
movl %ebx, %esi
callq 0x1995
leaq 0x110(%rsp), %rax
movl $0x10, %ecx
movq %rax, %rdi
movq %r14, %rsi
rep  movsq (%rsi), %es:(%rdi)
movl 0x20(%rax), %ebp
cmpl $0x1, %ebp
jne 0x3838
xorl %eax, %eax
callq 0x1355
movl %ebx, %edi
callq 0x1b31
testl %eax, %eax
jns 0x3871
movl $0xfffffffa, %ebx       # imm = 0xFFFFFFFA
jmp 0x38eb
movl $0xfffffffc, %ebx       # imm = 0xFFFFFFFC
jmp 0x38eb
xorl %edi, %edi
callq 0x1120
leaq 0x110(%rsp), %r14
movq %rax, 0x18(%r14)
decl %ebp
movl %ebp, 0x20(%r14)
xorl %eax, %eax
callq 0x1355
movl $0x10, %ecx
movq %rsp, %rdi
movq %r14, %rsi
rep  movsq (%rsi), %es:(%rdi)
movl %ebx, %edi
callq 0x191c
testl %eax, %eax
js 0x3883
xorl %ebx, %ebx
xorl %eax, %eax
callq 0x1361
jmp 0x38eb
movl $0xfffffffe, %ebx       # imm = 0xFFFFFFFE
jmp 0x38eb
movl $0xfffffffb, %ebx       # imm = 0xFFFFFFFB
jmp 0x38eb
leaq 0xb45(%rip), %rdi       # 0x43d6
jmp 0x389a
leaq 0xb88(%rip), %rdi       # 0x4422
xorl %eax, %eax
callq 0x1090
jmp 0x38e6
leaq 0xb51(%rip), %rdi       # 0x43fb
jmp 0x38dc
leaq 0xc4e(%rip), %rdi       # 0x4501
callq 0x1060
jmp 0x38e6
leaq 0xb85(%rip), %rdi       # 0x4446
jmp 0x38dc
leaq 0xaf1(%rip), %rdi       # 0x43bb
jmp 0x38dc
leaq 0xac0(%rip), %rdi       # 0x4393
jmp 0x38dc
leaq 0xaa0(%rip), %rdi       # 0x437c
movq %rbx, %rsi
xorl %eax, %eax
callq 0x1090
movl $0xffffffff, %ebx       # imm = 0xFFFFFFFF
movl %ebx, %eax
addq $0x190, %rsp            # imm = 0x190
popq %rbx
popq %r14
popq %rbp
retq