// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x280, %rsp            # imm = 0x280
movq %rdi, -0x10(%rbp)
movl $0x0, -0x14(%rbp)
movl $0x0, -0x18(%rbp)
movl $0x0, -0x1c(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x14(%rbp), %rsi
leaq -0x18(%rbp), %rdx
leaq -0x1c(%rbp), %rcx
xorl %r9d, %r9d
movl %r9d, %r8d
callq 0x45f0
movl %eax, -0x20(%rbp)
cmpl $0x0, -0x20(%rbp)
jge 0x55b3
movl -0x20(%rbp), %eax
addl $0x9, %eax
movl %eax, %ecx
movq %rcx, -0x1f0(%rbp)
subl $0x8, %eax
ja 0x55a7
movq -0x1f0(%rbp), %rax
leaq 0xdfa(%rip), %rcx       # 0x62ec
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rsi
leaq 0xe9e(%rip), %rdi       # 0x63a4
movb $0x0, %al
callq 0x1090
jmp 0x55a7
leaq 0xea2(%rip), %rdi       # 0x63bb
movb $0x0, %al
callq 0x1090
jmp 0x55a7
movq -0x10(%rbp), %rsi
leaq 0xeaa(%rip), %rdi       # 0x63da
movb $0x0, %al
callq 0x1090
jmp 0x55a7
movq -0x10(%rbp), %rsi
leaq 0xebe(%rip), %rdi       # 0x6402
movb $0x0, %al
callq 0x1090
jmp 0x55a7
leaq 0xec9(%rip), %rdi       # 0x641d
movb $0x0, %al
callq 0x1090
jmp 0x55a7
movq -0x10(%rbp), %rsi
leaq 0xeda(%rip), %rdi       # 0x6442
movb $0x0, %al
callq 0x1090
jmp 0x55a7
leaq 0xef1(%rip), %rdi       # 0x6469
movb $0x0, %al
callq 0x1090
jmp 0x55a7
movq -0x10(%rbp), %rsi
leaq 0xf01(%rip), %rdi       # 0x648d
movb $0x0, %al
callq 0x1090
jmp 0x55a7
movq -0x10(%rbp), %rsi
leaq 0xf17(%rip), %rdi       # 0x64b7
movb $0x0, %al
callq 0x1090
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x577d
movl -0x14(%rbp), %esi
leaq -0x120(%rbp), %rdi
callq 0x1f20
leaq -0xa0(%rbp), %rdi
leaq -0x120(%rbp), %rsi
movl $0x80, %edx
callq 0x1120
movl -0x7c(%rbp), %eax
shrq $0x6, %rax
movl %eax, -0x124(%rbp)
movl -0x124(%rbp), %eax
subl $0x1, %eax
cmpl -0x1c(%rbp), %eax
je 0x5657
movl -0x14(%rbp), %edi
movl -0x124(%rbp), %eax
subl $0x1, %eax
cltq
shlq $0x6, %rax
movl %eax, %edx
leaq -0x164(%rbp), %rsi
movl $0x40, %ecx
callq 0x3d00
cmpl $0x0, %eax
jge 0x562b
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x577d
movb $0x0, %al
callq 0x13e0
movl -0x14(%rbp), %edi
movslq -0x1c(%rbp), %rax
shlq $0x6, %rax
movl %eax, %edx
leaq -0x164(%rbp), %rsi
movl $0x40, %ecx
callq 0x38a0
movb $0x0, %al
callq 0x1400
movb $0x0, %al
callq 0x13e0
movl -0x14(%rbp), %edi
movl -0x124(%rbp), %eax
subl $0x1, %eax
cltq
shlq $0x6, %rax
movl %eax, %esi
callq 0x42b0
cmpl $0x0, %eax
jge 0x5688
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x577d
movb $0x0, %al
callq 0x1400
movl -0x18(%rbp), %esi
leaq -0x1e8(%rbp), %rdi
callq 0x1f20
leaq -0xa0(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
movl $0x80, %edx
callq 0x1120
cmpl $0x1, -0x80(%rbp)
jne 0x56e8
movb $0x0, %al
callq 0x13e0
movl -0x18(%rbp), %edi
callq 0x21e0
cmpl $0x0, %eax
jge 0x56dc
movl $0xfffffffa, -0x4(%rbp) # imm = 0xFFFFFFFA
jmp 0x577d
movb $0x0, %al
callq 0x1400
jmp 0x5774
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x88(%rbp)
movl -0x80(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x80(%rbp)
movb $0x0, %al
callq 0x13e0
movl -0x18(%rbp), %edi
movups -0x30(%rbp), %xmm0
movq %rsp, %rax
movq %rax, -0x1f8(%rbp)
movups %xmm0, 0x70(%rax)
movups -0x40(%rbp), %xmm0
movups %xmm0, 0x60(%rax)
movups -0x50(%rbp), %xmm0
movups %xmm0, 0x50(%rax)
movups -0x60(%rbp), %xmm0
movups %xmm0, 0x40(%rax)
movups -0xa0(%rbp), %xmm0
movups -0x90(%rbp), %xmm1
movups -0x80(%rbp), %xmm2
movups -0x70(%rbp), %xmm3
movups %xmm3, 0x30(%rax)
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x1e40
cmpl $0x0, %eax
jge 0x576d
movl $0xfffffffb, -0x4(%rbp) # imm = 0xFFFFFFFB
jmp 0x577d
movb $0x0, %al
callq 0x1400
jmp 0x5776
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x280, %rsp            # imm = 0x280
popq %rbp
retq
nopl (%rax)