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

```asm
<handle_scsi>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_device_get_devtype@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L87
  mov    -0x18(%rbp),%rax
  lea    D0(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L54
L87:
  mov    -0x28(%rbp),%rax
  jmp    L20
L54:
  mov    -0x28(%rbp),%rax
  lea    D60(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <udev_device_get_sysattr_value@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L21
  mov    -0x28(%rbp),%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <skip_subsystem@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  lea    D1(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <path_prepend@plt>
  jmp    L31
L21:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <udev_device_get_syspath@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  lea    D34(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L57
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <handle_scsi_fibre_channel@plt>
  mov    %rax,-0x28(%rbp)
  jmp    L31
L57:
  mov    -0x8(%rbp),%rax
  lea    D19(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L62
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <handle_scsi_sas@plt>
  mov    %rax,-0x28(%rbp)
  jmp    L31
L62:
  mov    -0x8(%rbp),%rax
  lea    D10(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L108
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <handle_scsi_iscsi@plt>
  mov    %rax,-0x28(%rbp)
  jmp    L31
L108:
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <handle_scsi_default@plt>
  mov    %rax,-0x28(%rbp)
L31:
  mov    -0x28(%rbp),%rax
L20:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D0
type_guessed: string
name: read_data
arguments: data_label: D60
type_guessed: string
name: read_data
arguments: data_label: D3
type_guessed: string
name: read_data
arguments: data_label: D1
type_guessed: string
name: read_data
arguments: data_label: D34
type_guessed: string
name: read_data
arguments: data_label: D19
type_guessed: string
name: read_data
arguments: data_label: D10
type_guessed: string

tool: D0: scsi_device

tool: D60: ieee1394_id

tool: D3: scsi

tool: D1: ieee1394-0x%s

tool: D34: /rport-

tool: D19: /end_device-

tool: D10: /session

assistant: ```c
struct udev_device *handle_scsi(struct udev_device *parent, char **path) {
  const char *devtype;
  const char *name;
  const char *id;
  devtype = udev_device_get_devtype(parent);
  if (devtype == NULL || strcmp(devtype, "scsi_device") != 0)
    return parent;
  id = udev_device_get_sysattr_value(parent, "ieee1394_id");
  if (id != NULL) {
    parent = skip_subsystem(parent, "scsi");
    path_prepend(path, "ieee1394-0x%s", id);
    goto out;
  }
  name = udev_device_get_syspath(parent);
  if (strstr(name, "/rport-") != NULL) {
    parent = handle_scsi_fibre_channel(parent, path);
    goto out;
  }
  if (strstr(name, "/end_device-") != NULL) {
    parent = handle_scsi_sas(parent, path);
    goto out;
  }
  if (strstr(name, "/session") != NULL) {
    parent = handle_scsi_iscsi(parent, path);
    goto out;
  }
  parent = handle_scsi_default(parent, path);
out:
  return parent;
}
```