// File: /workspace/github_c_makefile_star2_O0/carlitosmarin[P]Sistema-Ficheros-SOII/./src/directorios.c
// Function: mi_link
int mi_link (const char *camino1, const char *camino2) {
	int pid = 0, pi = 0, pe = 0;
	int origen = buscar_entrada(camino1, &pid, &pi, &pe, 0, 0);

	if(origen < 0) { //Tratamiento de errores
		switch(origen){
		case -1: printf("\"%s\" Camino no valido\n", camino1); break;
		case -2: printf("No tienes permisos de lectura\n"); break;
		case -3: printf("Error en la lectura de la entrada \"%s\"\n", camino1); break;
		case -4: printf("No existe la entrada \"%s\"\n", camino1); break;
		case -5: printf("Error a la hora de reservar un inodo"); break;
		case -6: printf("No existe directorio intermedio a \"%s\"", camino1); 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", camino1); break;
		case -9: printf("Ya existe la entrada \"%s\"\n", camino1); break;
		}
		return -1; //Error BE
	}
	int inodo = pi;
	struct inodo in = leer_inodo(inodo);
	if(in.tipo != 'f') return -2; //Error, es un directorio Error DIRECTORIO_NO_ENLAZA

	pid = 0, pi = 0, pe = 0;
	mi_waitSem();
	int destino = buscar_entrada(camino2, &pid, &pi, &pe, 1, 6);
	mi_signalSem();
	if(destino < 0) { //Tratamiento de errores
		switch(destino){
		case -1: printf("\"%s\" Camino no valido\n", camino2); break;
		case -2: printf("No tienes permisos de lectura\n"); break;
		case -3: printf("Error en la lectura de la entrada \"%s\"\n", camino2); break;
		case -4: printf("No existe la entrada \"%s\"\n", camino2); break;
		case -5: printf("Error a la hora de reservar un inodo"); break;
		case -6: printf("No existe directorio intermedio a \"%s\"", camino2); 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", camino2); break;
		case -9: printf("Ya existe la entrada \"%s\"\n", camino2); break;
		}
		return -1; //Error BE
	} //Entrada creada con exito
	struct entrada entr;
	if(mi_read_f(pid,&entr,pe*sizeof(struct entrada), sizeof(struct entrada)) < 0) return -3; //Error LECTURA
	mi_waitSem();
	liberar_inodo(pi); //Liberamos el inodo que se ha asociado a la entrada
	entr.inodo = inodo;
	if(mi_write_f(pid,&entr,pe*sizeof(struct entrada), sizeof(struct entrada)) < 0) return -4; //Error ESCRITURA
	mi_signalSem();

	in.cantLinks++; //Actualizamos la informacion de la cantidad de enlaces
	in.ctime = time(NULL); //Actualizamos la informacion del ctime
	mi_waitSem();
	escribir_inodo(in, inodo);
	mi_signalSem();
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x190, %rsp            # imm = 0x190
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl $0x0, -0x1c(%rbp)
movl $0x0, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x1c(%rbp), %rsi
leaq -0x20(%rbp), %rdx
leaq -0x24(%rbp), %rcx
xorl %r9d, %r9d
movl %r9d, %r8d
callq 0x45f0
movl %eax, -0x28(%rbp)
cmpl $0x0, -0x28(%rbp)
jge 0x51f7
movl -0x28(%rbp), %eax
addl $0x9, %eax
movl %eax, %ecx
movq %rcx, -0x100(%rbp)
subl $0x8, %eax
ja 0x51eb
movq -0x100(%rbp), %rax
leaq 0x1192(%rip), %rcx      # 0x62c8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rsi
leaq 0x125a(%rip), %rdi      # 0x63a4
movb $0x0, %al
callq 0x1090
jmp 0x51eb
leaq 0x125e(%rip), %rdi      # 0x63bb
movb $0x0, %al
callq 0x1090
jmp 0x51eb
movq -0x10(%rbp), %rsi
leaq 0x1266(%rip), %rdi      # 0x63da
movb $0x0, %al
callq 0x1090
jmp 0x51eb
movq -0x10(%rbp), %rsi
leaq 0x127a(%rip), %rdi      # 0x6402
movb $0x0, %al
callq 0x1090
jmp 0x51eb
leaq 0x1285(%rip), %rdi      # 0x641d
movb $0x0, %al
callq 0x1090
jmp 0x51eb
movq -0x10(%rbp), %rsi
leaq 0x1296(%rip), %rdi      # 0x6442
movb $0x0, %al
callq 0x1090
jmp 0x51eb
leaq 0x12ad(%rip), %rdi      # 0x6469
movb $0x0, %al
callq 0x1090
jmp 0x51eb
movq -0x10(%rbp), %rsi
leaq 0x12bd(%rip), %rdi      # 0x648d
movb $0x0, %al
callq 0x1090
jmp 0x51eb
movq -0x10(%rbp), %rsi
leaq 0x12d3(%rip), %rdi      # 0x64b7
movb $0x0, %al
callq 0x1090
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x5470
movl -0x20(%rbp), %eax
movl %eax, -0x2c(%rbp)
movl -0x2c(%rbp), %esi
leaq -0xb0(%rbp), %rdi
callq 0x1f20
movzbl -0xb0(%rbp), %eax
cmpl $0x66, %eax
je 0x5224
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x5470
movl $0x0, -0x1c(%rbp)
movl $0x0, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
movb $0x0, %al
callq 0x13e0
movq -0x18(%rbp), %rdi
leaq -0x1c(%rbp), %rsi
leaq -0x20(%rbp), %rdx
leaq -0x24(%rbp), %rcx
movl $0x1, %r8d
movl $0x6, %r9d
callq 0x45f0
movl %eax, -0xb4(%rbp)
movb $0x0, %al
callq 0x1400
cmpl $0x0, -0xb4(%rbp)
jge 0x5365
movl -0xb4(%rbp), %eax
addl $0x9, %eax
movl %eax, %ecx
movq %rcx, -0x108(%rbp)
subl $0x8, %eax
ja 0x5359
movq -0x108(%rbp), %rax
leaq 0x1000(%rip), %rcx      # 0x62a4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x18(%rbp), %rsi
leaq 0x10ec(%rip), %rdi      # 0x63a4
movb $0x0, %al
callq 0x1090
jmp 0x5359
leaq 0x10f0(%rip), %rdi      # 0x63bb
movb $0x0, %al
callq 0x1090
jmp 0x5359
movq -0x18(%rbp), %rsi
leaq 0x10f8(%rip), %rdi      # 0x63da
movb $0x0, %al
callq 0x1090
jmp 0x5359
movq -0x18(%rbp), %rsi
leaq 0x110c(%rip), %rdi      # 0x6402
movb $0x0, %al
callq 0x1090
jmp 0x5359
leaq 0x1117(%rip), %rdi      # 0x641d
movb $0x0, %al
callq 0x1090
jmp 0x5359
movq -0x18(%rbp), %rsi
leaq 0x1128(%rip), %rdi      # 0x6442
movb $0x0, %al
callq 0x1090
jmp 0x5359
leaq 0x113f(%rip), %rdi      # 0x6469
movb $0x0, %al
callq 0x1090
jmp 0x5359
movq -0x18(%rbp), %rsi
leaq 0x114f(%rip), %rdi      # 0x648d
movb $0x0, %al
callq 0x1090
jmp 0x5359
movq -0x18(%rbp), %rsi
leaq 0x1165(%rip), %rdi      # 0x64b7
movb $0x0, %al
callq 0x1090
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x5470
movl -0x1c(%rbp), %edi
movslq -0x24(%rbp), %rax
shlq $0x6, %rax
movl %eax, %edx
leaq -0xf4(%rbp), %rsi
movl $0x40, %ecx
callq 0x3d00
cmpl $0x0, %eax
jge 0x5394
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x5470
movb $0x0, %al
callq 0x13e0
movl -0x20(%rbp), %edi
callq 0x21e0
movl -0x2c(%rbp), %eax
movl %eax, -0xb8(%rbp)
movl -0x1c(%rbp), %edi
movslq -0x24(%rbp), %rax
shlq $0x6, %rax
movl %eax, %edx
leaq -0xf4(%rbp), %rsi
movl $0x40, %ecx
callq 0x38a0
cmpl $0x0, %eax
jge 0x53db
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x5470
movb $0x0, %al
callq 0x1400
movl -0x90(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x90(%rbp)
xorl %eax, %eax
movl %eax, %edi
callq 0x1130
movq %rax, -0x98(%rbp)
movb $0x0, %al
callq 0x13e0
movl -0x2c(%rbp), %edi
movups -0x40(%rbp), %xmm0
movq %rsp, %rax
movq %rax, -0x110(%rbp)
movups %xmm0, 0x70(%rax)
movups -0x50(%rbp), %xmm0
movups %xmm0, 0x60(%rax)
movups -0x60(%rbp), %xmm0
movups %xmm0, 0x50(%rax)
movups -0x70(%rbp), %xmm0
movups %xmm0, 0x40(%rax)
movups -0xb0(%rbp), %xmm0
movups -0xa0(%rbp), %xmm1
movups -0x90(%rbp), %xmm2
movups -0x80(%rbp), %xmm3
movups %xmm3, 0x30(%rax)
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x1e40
movb $0x0, %al
callq 0x1400
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x190, %rsp            # imm = 0x190
popq %rbp
retq
nopl (%rax)