user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<set_eattr>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,%r12
  mov    %esi,%r14d
  mov    %edx,%r13d
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    0x1c(%rsp),%rsi
  mov    $0x1,%r9d
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  call   <open_master_conn@plt>
  test   %eax,%eax
  js     L199
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <getuid@plt>
  mov    %eax,0xc(%rsp)
  lea    0x30(%rsp),%r15
  mov    %r15,0x20(%rsp)
  lea    0x20(%rsp),%rbx
  mov    $0x1da,%esi
  mov    %rbx,%rdi
  call   <put32bit@plt>
  mov    $0xe,%esi
  mov    %rbx,%rdi
  call   <put32bit@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <put32bit@plt>
  mov    0x1c(%rsp),%esi
  mov    %rbx,%rdi
  call   <put32bit@plt>
  mov    0xc(%rsp),%esi
  mov    %rbx,%rdi
  call   <put32bit@plt>
  mov    %r14d,%esi
  mov    %rbx,%rdi
  call   <put8bit@plt>
  mov    %r13d,%esi
  mov    %rbx,%rdi
  call   <put8bit@plt>
  mov    $0x2710,%ecx
  mov    $0x16,%edx
  mov    %r15,%rsi
  mov    %ebp,%edi
  call   <tcptowrite@plt>
  cmp    $0x16,%eax
  jne    L105
  lea    0x30(%rsp),%rsi
  mov    $0x2710,%ecx
  mov    $0x8,%edx
  mov    %ebp,%edi
  call   <tcptoread@plt>
  cmp    $0x8,%eax
  jne    L132
  lea    0x30(%rsp),%rax
  mov    %rax,0x28(%rsp)
  lea    0x28(%rsp),%r14
  mov    %r14,%rdi
  call   <get32bit@plt>
  mov    %eax,%ebx
  mov    %r14,%rdi
  call   <get32bit@plt>
  mov    %eax,%r14d
  cmp    $0x1db,%ebx
  jne    L103
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,%rbx
  mov    $0x2710,%ecx
  mov    %r14d,%edx
  mov    %rax,%rsi
  mov    %ebp,%edi
  call   <tcptoread@plt>
  cmp    %r14d,%eax
  jne    L185
  mov    $0x0,%edi
  call   <close_master_conn@plt>
  mov    %rbx,0x28(%rsp)
  lea    0x28(%rsp),%rdi
  call   <get32bit@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  jne    L4
  lea    -0x4(%r14),%eax
  cmp    $0x5,%r14d
  je     L11
  cmp    $0xc,%eax
  jne    L147
  lea    0x28(%rsp),%r15
  mov    %r15,%rdi
  call   <get32bit@plt>
  mov    %eax,%r14d
  mov    %r15,%rdi
  call   <get32bit@plt>
  mov    %eax,0xc(%rsp)
  mov    %r15,%rdi
  call   <get32bit@plt>
  mov    %eax,%r15d
  test   $0x4,%r13b
  jne    L175
  test   %r14d,%r14d
  je     L194
  mov    %r12,%rsi
  lea    D64(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L188:
  mov    %rbx,%rdi
  call   <free@plt>
L81:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L128
  mov    %ebp,%eax
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L105:
  mov    %r12,%rsi
  lea    D118(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <close_master_conn@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L132:
  mov    %r12,%rsi
  lea    D126(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <close_master_conn@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L103:
  mov    %r12,%rsi
  lea    D6(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <close_master_conn@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L185:
  mov    %r12,%rsi
  lea    D126(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    $0x1,%edi
  call   <close_master_conn@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L4:
  mov    %r12,%rsi
  lea    D20(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L11:
  mov    0x28(%rsp),%rax
  mov    (%rax),%edi
  call   <mfsstrerr@plt>
  mov    %rax,%rdx
  mov    %r12,%rsi
  lea    D28(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L147:
  mov    %r12,%rsi
  lea    D134(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    $0xffffffff,%ebp
  jmp    L81
L194:
  mov    %r12,%rsi
  lea    D88(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L188
L175:
  mov    %r12,%rsi
  lea    D48(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%r9d
  mov    $0x0,%r8d
  mov    $0x1,%ecx
  mov    %r14d,%edx
  lea    D87(%rip),%r12
  mov    %r12,%rsi
  lea    D115(%rip),%rdi
  call   <print_number@plt>
  mov    $0x1,%r9d
  mov    $0x0,%r8d
  mov    $0x1,%ecx
  mov    0xc(%rsp),%edx
  mov    %r12,%rsi
  lea    D73(%rip),%rdi
  call   <print_number@plt>
  mov    $0x1,%r9d
  mov    $0x0,%r8d
  mov    $0x1,%ecx
  mov    %r15d,%edx
  mov    %r12,%rsi
  lea    D135(%rip),%rdi
  call   <print_number@plt>
  jmp    L188
L199:
  mov    $0xffffffff,%ebp
  jmp    L81
L128:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: tag: D64
type_guessed: string
name: extract_symbolic_data
arguments: tag: D118
type_guessed: string
name: extract_symbolic_data
arguments: tag: D126
type_guessed: string
name: extract_symbolic_data
arguments: tag: D6
type_guessed: string
name: extract_symbolic_data
arguments: tag: D20
type_guessed: string
name: extract_symbolic_data
arguments: tag: D28
type_guessed: string
name: extract_symbolic_data
arguments: tag: D134
type_guessed: string
name: extract_symbolic_data
arguments: tag: D88
type_guessed: string
name: extract_symbolic_data
arguments: tag: D48
type_guessed: string
name: extract_symbolic_data
arguments: tag: D87
type_guessed: string
name: extract_symbolic_data
arguments: tag: D115
type_guessed: string
name: extract_symbolic_data
arguments: tag: D73
type_guessed: string
name: extract_symbolic_data
arguments: tag: D135
type_guessed: string

tool: D64: %s: attribute(s) changed


tool: D118: %s: master query: send error


tool: D126: %s: master query: receive error


tool: D6: %s: master query: wrong answer (type)


tool: D20: %s: master query: wrong answer (queryid)


tool: D28: %s: %s


tool: D134: %s: master query: wrong answer (leng)


tool: D88: %s: attribute(s) not changed


tool: D48: %s:


tool: D87: 


tool: D115:  inodes with attributes changed:     

tool: D73:  inodes with attributes not changed: 

tool: D135:  inodes with permission denied:      

assistant: ```c
int set_eattr(const char *fname, uint8_t eattr, uint8_t mode) {
  uint8_t reqbuff[22], *wptr, *buff;
  const uint8_t *rptr;
  uint32_t cmd, leng, inode, uid;
  uint32_t changed, notchanged, notpermitted;
  int fd;
  fd = open_master_conn(fname, &inode, NULL, NULL, 0, 1);
  if (fd < 0) {
    return -1;
  }
  uid = getuid();
  wptr = reqbuff;
  put32bit(&wptr, (0 + 474));
  put32bit(&wptr, 14);
  put32bit(&wptr, 0);
  put32bit(&wptr, inode);
  put32bit(&wptr, uid);
  put8bit(&wptr, eattr);
  put8bit(&wptr, mode);
  if (tcptowrite(fd, reqbuff, 22, 10000) != 22) {
    printf("%s: master query: send error\n", fname);
    close_master_conn(1);
    return -1;
  }
  if (tcptoread(fd, reqbuff, 8, 10000) != 8) {
    printf("%s: master query: receive error\n", fname);
    close_master_conn(1);
    return -1;
  }
  rptr = reqbuff;
  cmd = get32bit(&rptr);
  leng = get32bit(&rptr);
  if (cmd != (0 + 475)) {
    printf("%s: master query: wrong answer (type)\n", fname);
    close_master_conn(1);
    return -1;
  }
  buff = malloc(leng);
  if (tcptoread(fd, buff, leng, 10000) != (int32_t)leng) {
    printf("%s: master query: receive error\n", fname);
    free(buff);
    close_master_conn(1);
    return -1;
  }
  close_master_conn(0);
  rptr = buff;
  cmd = get32bit(&rptr);
  if (cmd != 0) {
    printf("%s: master query: wrong answer (queryid)\n", fname);
    free(buff);
    return -1;
  }
  leng -= 4;
  if (leng == 1) {
    printf("%s: %s\n", fname, mfsstrerr(*rptr));
    free(buff);
    return -1;
  } else if (leng != 12) {
    printf("%s: master query: wrong answer (leng)\n", fname);
    free(buff);
    return -1;
  }
  changed = get32bit(&rptr);
  notchanged = get32bit(&rptr);
  notpermitted = get32bit(&rptr);
  if ((mode & 4) == 0) {
    if (changed) {
      printf("%s: attribute(s) changed\n", fname);
    } else {
      printf("%s: attribute(s) not changed\n", fname);
    }
  } else {
    printf("%s:\n", fname);
    print_number(" inodes with attributes changed:     ", "\n", changed, 1, 0, 1);
    print_number(" inodes with attributes not changed: ", "\n", notchanged, 1, 0, 1);
    print_number(" inodes with permission denied:      ", "\n", notpermitted, 1, 0, 1);
  }
  free(buff);
  return 0;
}
```