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

```asm
<checkWlanCli>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,%r12
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  movq   $0x0,0x40(%rsp)
  movq   $0x0,0x48(%rsp)
  movq   $0x0,0x50(%rsp)
  movq   $0x0,0x58(%rsp)
  movq   $0x0,0x60(%rsp)
  movq   $0x0,0x68(%rsp)
  movq   $0x0,0x70(%rsp)
  movq   $0x0,0x78(%rsp)
  movq   $0x0,0x20(%rsp)
  movq   $0x0,0x28(%rsp)
  movq   $0x0,0x30(%rsp)
  movq   $0x0,0x38(%rsp)
  movq   $0x0,0x18(%rsp)
  lea    D14(%rip),%rdi
  call   <system@plt>
  lea    D45(%rip),%rdi
  call   <system@plt>
  lea    D30(%rip),%rsi
  lea    D13(%rip),%rdi
  call   <popen@plt>
  test   %rax,%rax
  je     L47
  mov    %rax,%rbp
  lea    D47(%rip),%r13
L64:
  lea    0x40(%rsp),%rdi
  mov    %rbp,%rdx
  mov    $0x40,%esi
  call   <fgets@plt>
  test   %rax,%rax
  je     L53
  mov    %rsp,%rcx
  lea    0x20(%rsp),%rbx
  lea    0x40(%rsp),%rdi
  lea    0x14(%rsp),%rax
  push   %rax
  lea    0x18(%rsp),%rax
  push   %rax
  lea    0x1c(%rsp),%rax
  push   %rax
  lea    0x30(%rsp),%rax
  push   %rax
  lea    0x28(%rsp),%r9
  lea    0x24(%rsp),%r8
  mov    %rbx,%rdx
  mov    %r13,%rsi
  call   <sscanf@plt>
  add    $0x20,%rsp
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0xf,%eax
  jle    L16
  lea    0x20(%rsp),%rsi
  mov    $0x11,%edx
  mov    %r12,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L64
  lea    0x20(%rsp),%rdx
  mov    %r12,%rsi
  lea    D8(%rip),%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <pclose@plt>
  mov    $0x1,%eax
  jmp    L40
L16:
  mov    %rbp,%rdi
  call   <pclose@plt>
  mov    $0x0,%eax
  jmp    L40
L53:
  mov    %rbp,%rdi
  call   <pclose@plt>
  mov    $0x0,%eax
L40:
  mov    0x88(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L25
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L47:
  mov    $0xffffffff,%eax
  jmp    L40
L25:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D14
type: string
name: disassemble_data
arguments: label: D45
type: string
name: disassemble_data
arguments: label: D30
type: string
name: disassemble_data
arguments: label: D13
type: string
name: disassemble_data
arguments: label: D47
type: string
name: disassemble_data
arguments: label: D8
type: string

tool: D14: echo  > /proc/wl_list

tool: D45: iwpriv ra0 show stainfo

tool: D30: r

tool: D13: cat /proc/wl_list

tool: D47: %s %d %d %d %s %d %d %d

tool: D8: usermac = %s,mac_str = %s


assistant: ```c
int checkWlanCli(char *usermac) {
  FILE *fp;
  char buf[64] = {0};
  char mac_str[32] = {0};
  int aid, psm, mimops, mcs, sgi, stbc;
  char bw[8] = {0};
  system("echo "
         " > /proc/wl_list");
  system("iwpriv ra0 show stainfo");
  fp = popen("cat /proc/wl_list", "r");
  if (!fp) {
    return -1;
  }
  while (fgets(buf, sizeof(buf), fp)) {
    sscanf(buf, "%s %d %d %d %s %d %d %d", mac_str, &aid, &psm, &mimops, bw, &mcs, &sgi, &stbc);
    if (16 > strlen(mac_str)) {
      pclose(fp);
      return 0;
    }
    if (0 == memcmp(usermac, mac_str, 17)) {
      printf("usermac = %s,mac_str = %s\n", usermac, mac_str);
      pclose(fp);
      return 1;
    }
  }
  pclose(fp);
  return 0;
}
```