user: Converte this assembly snippet into its equivalent C code:

```asm
<tty_open>:
  endbr64
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  mov    D289(%rip),%rax
  mov    (%rax),%esi
  call   <access@plt>
  test   %rax,%rax
  jne    L41
  mov    D283(%rip),%rax
  mov    %r12,%rdi
  mov    (%rax),%esi
  mov    D158(%rip),%rax
  or     (%rax),%esi
  call   <open@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  js     L41
  mov    %rsp,%r13
  mov    %eax,%edi
  mov    %r13,%rsi
  call   <tcgetattr@plt>
  test   %eax,%eax
  js     L62
  mov    D298(%rip),%rcx
  mov    D126(%rip),%rax
  mov    %r12d,%edi
  movdqa (%rsp),%xmm0
  mov    0x10(%rsp),%rdx
  mov    (%rax),%eax
  or     (%rcx),%eax
  mov    D138(%rip),%rcx
  mov    %rdx,0x10(%rbx)
  movups %xmm0,(%rbx)
  or     (%rcx),%eax
  mov    D27(%rip),%rcx
  or     (%rcx),%eax
  mov    D31(%rip),%rcx
  not    %eax
  and    %eax,(%rsp)
  mov    D213(%rip),%rax
  mov    (%rax),%eax
  or     (%rcx),%eax
  mov    D216(%rip),%rcx
  or     (%rcx),%eax
  mov    D95(%rip),%rcx
  not    %eax
  and    0x4(%rsp),%eax
  or     (%rcx),%eax
  mov    D196(%rip),%rcx
  mov    %eax,0x4(%rsp)
  mov    D182(%rip),%rax
  mov    (%rax),%eax
  or     (%rcx),%eax
  mov    D156(%rip),%rcx
  or     (%rcx),%eax
  mov    D265(%rip),%rcx
  or     (%rcx),%eax
  not    %eax
  and    0x8(%rsp),%eax
  mov    D240(%rip),%rsi
  mov    D35(%rip),%rcx
  mov    (%rcx),%ecx
  or     (%rsi),%ecx
  mov    D259(%rip),%rsi
  or     (%rsi),%ecx
  mov    D12(%rip),%rsi
  or     (%rsi),%ecx
  or     %ecx,%eax
  mov    D268(%rip),%rcx
  mov    %eax,0x8(%rsp)
  mov    D305(%rip),%rax
  mov    (%rax),%eax
  or     (%rcx),%eax
  mov    D39(%rip),%rcx
  or     (%rcx),%eax
  mov    D303(%rip),%rcx
  or     (%rcx),%eax
  mov    D183(%rip),%rcx
  or     (%rcx),%eax
  mov    D272(%rip),%rcx
  or     (%rcx),%eax
  mov    D122(%rip),%rcx
  or     (%rcx),%eax
  mov    D37(%rip),%rcx
  or     (%rcx),%eax
  mov    D59(%rip),%rcx
  or     (%rcx),%eax
  not    %eax
  and    %eax,0xc(%rsp)
  mov    D205(%rip),%rax
  mov    (%rax),%rax
  movl   $0x0,(%rdx,%rax,4)
  mov    D109(%rip),%rax
  mov    (%rax),%rax
  movl   $0xa,(%rdx,%rax,4)
  mov    D267(%rip),%rax
  mov    %r13,%rdx
  mov    (%rax),%esi
  call   <tcsetattr@plt>
  test   %eax,%eax
  js     L41
L8:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L50
  add    $0x20,%rsp
  mov    %r12d,%eax
  pop    %rbx
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L41:
  mov    $0xffffffff,%r12d
  jmp    L8
L62:
  mov    %r12d,%edi
  mov    $0xffffffff,%r12d
  call   <close@plt>
  jmp    L8
L50:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int tty_open(char *name, struct termios *sv_tios) {
  int ret;
  int fd;
  struct termios tios;
  if (access(name, F_OK) || (fd = open(name, O_RDWR | O_NONBLOCK)) < 0) {
    return -1;
  }
  if ((ret = tcgetattr(fd, &tios)) < 0) {
    close(fd);
    return -1;
  }
  *sv_tios = tios;
  tios.c_iflag &= ~(IXON | IXOFF | INLCR | ICRNL);
  tios.c_oflag &= ~(OPOST | ONLCR | OCRNL);
  tios.c_oflag |= ONLRET;
  tios.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | PARENB);
  tios.c_cflag |= CLOCAL | CREAD | B9600 | CS8;
  tios.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHOKE | ECHONL | ECHOCTL | ISIG | IEXTEN);
  tios.c_cc[VMIN] = 0;
  tios.c_cc[VTIME] = 10;
  if ((ret = tcsetattr(fd, TCSAFLUSH, &tios)) < 0) {
    return -1;
  }
  return fd;
}
```