user: 请从给定的汇编指令推导出C源代码:

```asm
<ftserve_recv_cmd>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x240,%rsp
  mov    %edi,-0x224(%rbp)
  mov    %rsi,-0x230(%rbp)
  mov    %rdx,-0x238(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0xc8,-0x21c(%rbp)
  lea    -0x210(%rbp),%rax
  mov    $0x200,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x230(%rbp),%rax
  mov    $0x5,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x238(%rbp),%rax
  mov    $0x200,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x210(%rbp),%rcx
  mov    -0x224(%rbp),%eax
  mov    $0x200,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <recv_data@plt>
  cmp    $0xffffffff,%eax
  jne    L84
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <perror@plt>
  mov    $0xffffffff,%eax
  jmp    L96
L84:
  lea    -0x210(%rbp),%rcx
  mov    -0x230(%rbp),%rax
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  lea    -0x210(%rbp),%rax
  add    $0x5,%rax
  mov    %rax,-0x218(%rbp)
  mov    -0x218(%rbp),%rdx
  mov    -0x238(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x230(%rbp),%rax
  lea    D51(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L73
  movl   $0xdd,-0x21c(%rbp)
  jmp    L43
L73:
  mov    -0x230(%rbp),%rax
  lea    D7(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L65
  mov    -0x230(%rbp),%rax
  lea    D27(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L65
  mov    -0x230(%rbp),%rax
  lea    D50(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L65
  mov    -0x230(%rbp),%rax
  lea    D34(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L93
L65:
  movl   $0xc8,-0x21c(%rbp)
  jmp    L43
L93:
  movl   $0x1f6,-0x21c(%rbp)
L43:
  mov    -0x21c(%rbp),%edx
  mov    -0x224(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <send_response@plt>
  mov    -0x21c(%rbp),%eax
L96:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L18
  call   <__stack_chk_fail@plt>
L18:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D13
type: string
name: parse_data
arguments: tag: D51
type: string
name: parse_data
arguments: tag: D7
type: string
name: parse_data
arguments: tag: D27
type: string
name: parse_data
arguments: tag: D50
type: string
name: parse_data
arguments: tag: D34
type: string

tool: D13: recv error


tool: D51: QUIT

tool: D7: USER

tool: D27: PASS

tool: D50: LIST

tool: D34: RETR

assistant: ```c
int ftserve_recv_cmd(int sock_control, char *cmd, char *arg) {
  int rc = 200;
  char buffer[512];
  memset(buffer, 0, 512);
  memset(cmd, 0, 5);
  memset(arg, 0, 512);
  if ((recv_data(sock_control, buffer, sizeof(buffer))) == -1) {
    perror("recv error\n");
    return -1;
  }
  strncpy(cmd, buffer, 4);
  char *tmp = buffer + 5;
  strcpy(arg, tmp);
  if (strcmp(cmd, "QUIT") == 0) {
    rc = 221;
  } else if ((strcmp(cmd, "USER") == 0) || (strcmp(cmd, "PASS") == 0) || (strcmp(cmd, "LIST") == 0) || (strcmp(cmd, "RETR") == 0)) {
    rc = 200;
  } else {
    rc = 502;
  }
  send_response(sock_control, rc);
  return rc;
}
```