// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#define _POSIX_C_SOURCE 200809L
#define _GNU_SOURCE
#define _DARWIN_C_SOURCE

#include "bootserver.h"

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <lib/netboot/netboot.h>
#include <libgen.h>
#include <limits.h>
#include <net/if.h>
#include <netinet/in.h>
#include <poll.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>

#define ANSI_RED "\x1b[31m"
#define ANSI_GREEN "\x1b[32m"
#define ANSI_YELLOW "\x1b[33m"
#define ANSI_BLUE "\x1b[34m"
#define ANSI_MAGENTA "\x1b[35m"
#define ANSI_CYAN "\x1b[36m"
#define ANSI_RESET "\x1b[0m"
#define ANSI_CLEARLINE "\33[2K\r"

#define MAX_FVM_IMAGES 4
#define MAX_FIRMWARE_IMAGES 4

#define ANSI(name) (use_color == false || is_redirected) ? "" : ANSI_##name

#define log(args...)                                                  \
  do {                                                                \
    char logline[1024];                                               \
    snprintf(logline, sizeof(logline), args);                         \
    fprintf(stderr, "%s [%s] %s\n", date_string(), appname, logline); \
  } while (false)

#define RETRY_DELAY_SEC 1

char* appname;
int64_t us_between_packets = DEFAULT_US_BETWEEN_PACKETS;

static bool use_tftp = true;
static bool use_color = true;
static size_t total_file_size;
static bool file_info_printed;
static int progress_reported;
static int packets_sent;
static char filename_in_flight[PATH_MAX];
static struct timeval start_time, end_time;
static bool is_redirected;
static const char spinner[] = {'|', '/', '-', '\\'};
static bool no_bind = false;
static bool reuseport = false;

struct firmware {
  const char* type;
  const char* image;
};

char* date_string(void) {
  static char date_buf[80];
  time_t t = time(NULL);
  struct tm tm = *localtime(&t);

  snprintf(date_buf, sizeof(date_buf), "%4d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900,
           tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  return date_buf;
}

char* sockaddr_str(struct sockaddr_in6* addr) {
  static char buf[128];
  char tmp[INET6_ADDRSTRLEN];
  snprintf(buf, sizeof(buf), "[%s]:%d",
           inet_ntop(AF_INET6, &addr->sin6_addr, tmp, INET6_ADDRSTRLEN), ntohs(addr->sin6_port));
  return buf;
}

void initialize_status(const char* name, size_t size) {
  total_file_size = size;
  progress_reported = 0;
  packets_sent = 0;
  snprintf(filename_in_flight, sizeof(filename_in_flight), "%s", name);
}

void update_status(size_t bytes_so_far) {
  char progress_str[PATH_MAX];
  size_t offset = 0;

#define UPDATE_LOG(args...)                                               \
  do {                                                                    \
    if (offset < PATH_MAX) {                                              \
      offset += snprintf(progress_str + offset, PATH_MAX - offset, args); \
    }                                                                     \
  } while (false)

  packets_sent++;

  bool is_last_piece = (bytes_so_far == total_file_size);
  if (total_file_size == 0) {
    return;
  }

  if (is_redirected) {
    int percent_sent = (bytes_so_far * 100 / (total_file_size));
    if (percent_sent - progress_reported >= 5) {
      fprintf(stderr, "\t%d%%...", percent_sent);
      progress_reported = percent_sent;
    }
  } else {
    if (packets_sent > 1024 || is_last_piece) {
      packets_sent = 0;
      static int spin = 0;

      size_t divider = (total_file_size > 0) ? total_file_size : 1;
      UPDATE_LOG("[%c] %5.01f%% of ", spinner[(spin++) % 4],
                 100.0 * (float)bytes_so_far / (float)divider);
      if (total_file_size < 1024) {
        UPDATE_LOG(" %3zu.0  B", total_file_size);
      } else if (total_file_size < 1024 * 1024) {
        UPDATE_LOG(" %5.1f KB", (float)total_file_size / 1024.0);
      } else if (total_file_size < 1024 * 1024 * 1024) {
        UPDATE_LOG(" %5.1f MB", (float)total_file_size / 1024.0 / 1024.0);
      } else {
        UPDATE_LOG(" %5.1f GB", (float)total_file_size / 1024.0 / 1024.0 / 1024.0);
      }

      struct timeval now;
      gettimeofday(&now, NULL);
      int64_t sec = (int64_t)(now.tv_sec - start_time.tv_sec);
      int64_t usec = (int64_t)(now.tv_usec - start_time.tv_usec);
      int64_t elapsed_usec = sec * 1000000 + usec;
      float bytes_in_sec;
      bytes_in_sec = (float)bytes_so_far * 1000000 / ((float)elapsed_usec);
      if (bytes_in_sec < 1024) {
        UPDATE_LOG("  %5.1f  B/s", bytes_in_sec);
      } else if (bytes_in_sec < 1024 * 1024) {
        UPDATE_LOG("  %5.1f KB/s", bytes_in_sec / 1024.0);
      } else if (bytes_in_sec < 1024 * 1024 * 1024) {
        UPDATE_LOG("  %5.1f MB/s", bytes_in_sec / 1024.0 / 1024.0);
      } else {
        UPDATE_LOG("  %5.1f GB/s", bytes_in_sec / 1024.0 / 1024.0 / 1024.0);
      }

      if (is_last_piece) {
        UPDATE_LOG(".");
      } else {
        UPDATE_LOG(" ");
      }

      // Simplify the file path if from "//out/".
      char* relative_path = strstr(filename_in_flight, "/out/");
      if (!relative_path) {
        UPDATE_LOG("  %s%s%s", ANSI(GREEN), filename_in_flight, ANSI(RESET));
      } else {
        // Path starting with "//" indicates the relative path wrt
        // the base directory of Fuchsia source code.
        UPDATE_LOG("  %s/%s%s", ANSI(GREEN), relative_path, ANSI(RESET));
      }
      fprintf(stderr, "%s%s", ANSI_CLEARLINE, progress_str);
    }
  }
}

static int xfer(struct sockaddr_in6* addr, const char* local_name, const char* remote_name) {
  int result;
  is_redirected = !isatty(fileno(stdout));
  gettimeofday(&start_time, NULL);
  file_info_printed = false;
  if (use_tftp) {
    bool first = true;
    while ((result = tftp_xfer(addr, local_name, remote_name, true)) == -EAGAIN) {
      if (first) {
        fprintf(stderr, "Target busy, waiting.");
        first = false;
      } else {
        fprintf(stderr, ".");
      }
      sleep(1);
      gettimeofday(&start_time, NULL);
    }
  } else {
    result = netboot_xfer(addr, local_name, remote_name);
  }
  gettimeofday(&end_time, NULL);
  if (end_time.tv_usec < start_time.tv_usec) {
    end_time.tv_sec -= 1;
    end_time.tv_usec += 1000000;
  }
  fprintf(stderr, "\n");
  return result;
}

// Similar to xfer, but reads from remote to local.
static int xfer2(struct sockaddr_in6* addr, const char* local_name, const char* remote_name) {
  int result;
  is_redirected = !isatty(fileno(stdout));
  gettimeofday(&start_time, NULL);
  file_info_printed = false;
  if (use_tftp) {
    bool first = true;
    while ((result = tftp_xfer(addr, local_name, remote_name, false)) == -EAGAIN) {
      if (first) {
        fprintf(stderr, "Target busy, waiting.");
        first = false;
      } else {
        fprintf(stderr, ".");
      }
      sleep(1);
      gettimeofday(&start_time, NULL);
    }
  } else {
    log("Skipping read operation. Only supported using tftp.");
    result = 0;
  }
  gettimeofday(&end_time, NULL);
  if (end_time.tv_usec < start_time.tv_usec) {
    end_time.tv_sec -= 1;
    end_time.tv_usec += 1000000;
  }
  fprintf(stderr, "\n");
  return result;
}

void usage(void) {
  fprintf(
      stderr,
      "usage:   %s [ <option> ]* [<zbi>] -- [ <kerneloption> ]* ]\n"
      "\n"
      "options:\n"
      "  -1         only boot once, then exit\n"
      "  -a         only boot device with this IPv6 address\n"
      "  -b <sz>    tftp block size (default=%d, ignored with --netboot)\n"
      "  -i <NN>    number of microseconds between packets\n"
      "             set between 50-500 to deal with poor bootloader network stacks (default=%d)\n"
      "             (ignored with --tftp)\n"
      "  -n         only boot device with this nodename\n"
      "  -w <sz>    tftp window size (default=%d, ignored with --netboot)\n"
      "  --board_name <name>      name of the board files are meant for\n"
      "  --boot <file>            use the supplied file as a kernel\n"
      "  --fvm <file>             use the supplied file as a sparse FVM image (up to 4 times)\n"
      "  --fxfs <file>            use the supplied file as an Fxfs image\n"
      "  --bootloader <file>      use the supplied file as a BOOTLOADER image\n"
      "  --firmware <file>        use the supplied file as a FIRMWARE image of default type\n"
      "  --firmware-<type> <file> use the supplied file as a FIRMWARE image of the given type\n"
      "  --zircona <file>         use the supplied file as a ZIRCON-A ZBI\n"
      "  --zirconb <file>         use the supplied file as a ZIRCON-B ZBI\n"
      "  --zirconr <file>         use the supplied file as a ZIRCON-R ZBI\n"
      "  --vbmetaa <file>         use the supplied file as a AVB vbmeta_a image\n"
      "  --vbmetab <file>         use the supplied file as a AVB vbmeta_b image\n"
      "  --vbmetar <file>         use the supplied file as a AVB vbmeta_r image\n"
      "  --authorized-keys <file> use the supplied file as an authorized_keys file\n"
      "  --init-partition-tables <path>  initialize block device specified with partition tables\n"
      "  --wipe-partition-tables <path>  wipe partition tables from block device specified\n"
      "  --fail-fast  exit on first error\n"
      "  --netboot    use the netboot protocol\n"
      "  --tftp       use the tftp protocol (default)\n"
      "  --nocolor    disable ANSI color (false)\n"
      "  --allow-zedboot-version-mismatch warn on zedboot version mismatch rather than fail\n"
      "  --fail-fast-if-version-mismatch  error if zedboot version does not match\n"
      "  --no-bind    do not bind to bootserver port. Should be used with -a <IPV6>\n"
      "  --reuseport  allow other programs to bind the listen port\n",
      appname, DEFAULT_TFTP_BLOCK_SZ, DEFAULT_US_BETWEEN_PACKETS, DEFAULT_TFTP_WIN_SZ);
  exit(1);
}

void drain(int fd) {
  char buf[4096];
  if (fcntl(fd, F_SETFL, O_NONBLOCK) == 0) {
    while (read(fd, buf, sizeof(buf)) > 0)
      ;
    fcntl(fd, F_SETFL, 0);
  }
}

int send_boot_command(struct sockaddr_in6* ra) {
  // Construct message
  netboot_message_header_t hdr;
  static int cookie = 0;
  hdr.magic = NETBOOT_MAGIC;
  hdr.cookie = cookie++;
  hdr.cmd = NETBOOT_COMMAND_BOOT;
  hdr.arg = 0;

  // Send to NETBOOT_PORT_SERVER
  struct sockaddr_in6 target_addr;
  memcpy(&target_addr, ra, sizeof(struct sockaddr_in6));
  target_addr.sin6_port = htons(NETBOOT_PORT_SERVER);
  int s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
  if (s < 0) {
    log("cannot create socket %d", s);
    return -1;
  }
  ssize_t send_result =
      sendto(s, &hdr, sizeof(hdr), 0, (struct sockaddr*)&target_addr, sizeof(target_addr));
  if (send_result == sizeof(hdr)) {
    close(s);
    log("Issued boot command to %s\n\n", sockaddr_str(ra));
    return 0;
  }
  close(s);
  log("failure sending boot command to %s", sockaddr_str(ra));
  return -1;
}

int send_reboot_command(struct sockaddr_in6* ra) {
  // Construct message
  netboot_message_header_t hdr;
  static int cookie = 0;
  hdr.magic = NETBOOT_MAGIC;
  hdr.cookie = cookie++;
  hdr.cmd = NETBOOT_COMMAND_REBOOT;
  hdr.arg = 0;

  // Send to NETBOOT_PORT_SERVER
  struct sockaddr_in6 target_addr;
  memcpy(&target_addr, ra, sizeof(struct sockaddr_in6));
  target_addr.sin6_port = htons(NETBOOT_PORT_SERVER);
  int s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
  if (s < 0) {
    log("cannot create socket %d", s);
    return -1;
  }
  ssize_t send_result =
      sendto(s, &hdr, sizeof(hdr), 0, (struct sockaddr*)&target_addr, sizeof(target_addr));
  if (send_result == sizeof(hdr)) {
    close(s);
    log("Issued reboot command to %s\n\n", sockaddr_str(ra));
    return 0;
  }
  close(s);
  log("failure sending reboot command to %s", sockaddr_str(ra));
  return -1;
}

static int validate_board_name(const char* board_name, const char* board_info_file) {
  chmod(board_info_file, S_IRWXU);
  int fd = open(board_info_file, O_RDONLY);
  if (fd < 0) {
    log("Unable to read the board info file [%s]", board_info_file);
    return -1;
  }

  netboot_board_info_t board_info = {};
  if (read(fd, &board_info, sizeof(board_info)) < (ssize_t)sizeof(board_info)) {
    log("Unable to read the board info file [%s]", board_info_file);
    goto err;
  }
  if (strncmp(board_info.board_name, board_name, sizeof(board_info.board_name)) != 0) {
    log("Expected target to be [%s], but found target is [%s]\n", board_name,
        board_info.board_name);
    log("Confirm that your `fx set` matches the target's board.");
    goto err;
  }

  return 0;
err:
  close(fd);
  return -1;
}

int main(int argc, char** argv) {
  bool fail_fast = false;
  bool fail_fast_if_version_mismatch = false;
  struct in6_addr allowed_addr;
  int32_t allowed_scope_id = -1;
  struct sockaddr_in6 addr;
  char tmp[INET6_ADDRSTRLEN];
  char cmdline[4096];
  char* cmdnext = cmdline;
  char* nodename = NULL;
  int sock = 1;
  size_t num_fvms = 0;
  size_t num_firmware = 0;
  const char* tmpdir = getenv("TMPDIR");
  char netboot_board_info_template[] = "%s/board_info.XXXXXX";
  char board_info_file[PATH_MAX];
  const char block_device_path_template[] = "%s/block_device_path.XXXXXX";
  char block_device_path[PATH_MAX];
  const char* board_name = NULL;
  const char* bootloader_image = NULL;
  struct firmware firmware_images[MAX_FIRMWARE_IMAGES];
  const char* zircona_image = NULL;
  const char* zirconb_image = NULL;
  const char* zirconr_image = NULL;
  const char* vbmetaa_image = NULL;
  const char* vbmetab_image = NULL;
  const char* vbmetar_image = NULL;
  const char* authorized_keys = NULL;
  const char* fvm_images[MAX_FVM_IMAGES] = {NULL, NULL, NULL, NULL};
  const char* fxfs_image = NULL;
  const char* kernel_fn = NULL;
  const char* init_partition_tables_device_path = NULL;
  const char* wipe_partition_tables_device_path = NULL;
  int once = 0;
  bool allow_zedboot_version_mismatch = false;
  int status;

  if (tmpdir == NULL) {
    tmpdir = "/tmp";
  }

  memset(&allowed_addr, 0, sizeof(allowed_addr));
  cmdline[0] = 0;
  if ((appname = strrchr(argv[0], '/')) != NULL) {
    appname++;
  } else {
    appname = argv[0];
  }

  while (argc > 1) {
    if (argv[1][0] != '-') {
      if (kernel_fn == NULL) {
        kernel_fn = argv[1];
      } else {
        usage();
      }
    } else if (!strcmp(argv[1], "--fvm")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--fvm' option requires an argument (FVM image)\n");
        return -1;
      }
      if (num_fvms == MAX_FVM_IMAGES) {
        fprintf(stderr, "'--fvm' supplied too many times\n");
        return -1;
      }
      fvm_images[num_fvms++] = argv[1];
    } else if (!strcmp(argv[1], "--fxfs")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--fxfs' option requires an argument (path to image)\n");
        return -1;
      }
      fxfs_image = argv[1];
    } else if (!strcmp(argv[1], "--bootloader")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--bootloader' option requires an argument (BOOTLOADER image)\n");
        return -1;
      }
      bootloader_image = argv[1];
    } else if (!strncmp(argv[1], "--firmware", strlen("--firmware"))) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--firmware' options require an argument (FIRMWARE image)\n");
        return -1;
      }
      if (num_firmware == MAX_FIRMWARE_IMAGES) {
        // It's fine to increase MAX_FIRMWARE_IMAGES if necessary, it's just
        // used for simplicity to avoid implementing a growable list in C.
        fprintf(stderr, "'--firmware' supplied too many times\n");
        return -1;
      }

      // Extract the type from the argument name.
      const char* type = argv[0] + strlen("--firmware");
      if (type[0] == '\0') {
        // No type given, use the current (empty) string.
      } else if (type[0] == '-') {
        // Skip the '-' delimiter and use the remainder as the type.
        type++;

        if (strlen(type) > NETBOOT_FIRMWARE_TYPE_MAX_LENGTH - 1) {
          fprintf(stderr, "firmware type '%s' is too long (max %d characters, including NUL)\n",
                  type, NETBOOT_FIRMWARE_TYPE_MAX_LENGTH);
          return -1;
        }
      } else {
        fprintf(stderr, "invalid argument '%s', use '--firmware[-type]'\n", argv[0]);
        fprintf(stderr, "examples: '--firmware', '--firmware-foo'\n");
        return -1;
      }

      firmware_images[num_firmware].type = type;
      firmware_images[num_firmware].image = argv[1];
      num_firmware++;
    } else if (!strcmp(argv[1], "--zircona")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--zircona' option requires an argument (ZIRCON-A image)\n");
        return -1;
      }
      zircona_image = argv[1];
    } else if (!strcmp(argv[1], "--zirconb")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--zirconb' option requires an argument (ZIRCON-B image)\n");
        return -1;
      }
      zirconb_image = argv[1];
    } else if (!strcmp(argv[1], "--zirconr")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--zirconr' option requires an argument (ZIRCON-R image)\n");
        return -1;
      }
      zirconr_image = argv[1];
    } else if (!strcmp(argv[1], "--vbmetaa")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--vbmetaa' option requires an argument (vbmeta_a image)\n");
        return -1;
      }
      vbmetaa_image = argv[1];
    } else if (!strcmp(argv[1], "--vbmetab")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--vbmetab' option requires an argument (vbmeta_b image)\n");
        return -1;
      }
      vbmetab_image = argv[1];
    } else if (!strcmp(argv[1], "--vbmetar")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--vbmetar' option requires an argument (vbmeta_r image)\n");
        return -1;
      }
      vbmetar_image = argv[1];
    } else if (!strcmp(argv[1], "--authorized-keys")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--authorized-keys' option requires an argument (authorized_keys)\n");
        return -1;
      }
      authorized_keys = argv[1];
    } else if (!strcmp(argv[1], "--fail-fast")) {
      fail_fast = true;
    } else if (!strcmp(argv[1], "--fail-fast-if-version-mismatch")) {
      fail_fast_if_version_mismatch = true;
    } else if (!strcmp(argv[1], "--boot")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--boot' option requires an argument (a kernel image)\n");
        return -1;
      }
      kernel_fn = argv[1];
    } else if (!strcmp(argv[1], "-1")) {
      once = 1;
    } else if (!strcmp(argv[1], "-b")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'-b' option requires an argument (tftp block size)\n");
        return -1;
      }
      errno = 0;
      static uint16_t block_size;
      block_size = strtoll(argv[1], NULL, 10);
      if (errno != 0 || block_size <= 0) {
        fprintf(stderr, "invalid arg for -b: %s\n", argv[1]);
        return -1;
      }
      tftp_block_size = &block_size;
    } else if (!strcmp(argv[1], "-w")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'-w' option requires an argument (tftp window size)\n");
        return -1;
      }
      errno = 0;
      static uint16_t window_size;
      window_size = strtoll(argv[1], NULL, 10);
      if (errno != 0 || window_size <= 0) {
        fprintf(stderr, "invalid arg for -w: %s\n", argv[1]);
        return -1;
      }
      tftp_window_size = &window_size;
    } else if (!strcmp(argv[1], "-i")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'-i' option requires an argument (micros between packets)\n");
        return -1;
      }
      errno = 0;
      us_between_packets = strtoll(argv[1], NULL, 10);
      if (errno != 0 || us_between_packets <= 0) {
        fprintf(stderr, "invalid arg for -i: %s\n", argv[1]);
        return -1;
      }
      fprintf(stderr, "packet spacing set to %" PRId64 " microseconds\n", us_between_packets);
    } else if (!strcmp(argv[1], "-a")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'-a' option requires a valid ipv6 address\n");
        return -1;
      }

      char* token = strchr(argv[1], '/');
      if (token) {
        allowed_scope_id = atoi(token + 1);
        char temp_ifname[IF_NAMESIZE] = "";
        if (!token[1] || if_indextoname(allowed_scope_id, temp_ifname) == NULL) {
          fprintf(stderr, "%s: invalid interface specified\n", argv[1]);
          return -1;
        }
        argv[1][token - argv[1]] = '\0';
      }

      if (inet_pton(AF_INET6, argv[1], &allowed_addr) != 1) {
        fprintf(stderr, "%s: invalid ipv6 address specified\n", argv[1]);
        return -1;
      }
    } else if (!strcmp(argv[1], "-n")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'-n' option requires a valid nodename\n");
        return -1;
      }
      nodename = argv[1];
    } else if (!strcmp(argv[1], "--netboot")) {
      use_tftp = false;
    } else if (!strcmp(argv[1], "--tftp")) {
      use_tftp = true;
    } else if (!strcmp(argv[1], "--nocolor")) {
      use_color = false;
    } else if (!strcmp(argv[1], "--board_name")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--board_name' option requires a valid board name\n");
        return -1;
      }
      board_name = argv[1];
    } else if (!strcmp(argv[1], "--allow-zedboot-version-mismatch")) {
      allow_zedboot_version_mismatch = true;
    } else if (!strcmp(argv[1], "--no-bind")) {
      no_bind = true;
    } else if (!strcmp(argv[1], "--init-partition-tables")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--init-partition-tables' option requires a valid board name\n");
        return -1;
      }
      init_partition_tables_device_path = argv[1];
    } else if (!strcmp(argv[1], "--wipe-partition-tables")) {
      argc--;
      argv++;
      if (argc <= 1) {
        fprintf(stderr, "'--wipe-partition-tables' option requires a valid board name\n");
        return -1;
      }
      wipe_partition_tables_device_path = argv[1];
    } else if (!strcmp(argv[1], "--reuseport")) {
      reuseport = true;
    } else if (!strcmp(argv[1], "--")) {
      while (argc > 2) {
        argc--;
        argv++;
        size_t len = strlen(argv[1]);
        if (len > (sizeof(cmdline) - 2 - (cmdnext - cmdline))) {
          fprintf(stderr, "[%s] commandline too large\n", appname);
          return -1;
        }
        if (cmdnext != cmdline) {
          *cmdnext++ = ' ';
        }
        memcpy(cmdnext, argv[1], len + 1);
        cmdnext += len;
      }
      break;
    } else {
      usage();
    }
    argc--;
    argv++;
  }
  if (!kernel_fn && !bootloader_image && !num_firmware && !zircona_image && !zirconb_image &&
      !zirconr_image && !vbmetaa_image && !vbmetab_image && !fvm_images[0] && !fxfs_image &&
      !init_partition_tables_device_path && !wipe_partition_tables_device_path) {
    usage();
  }
  if (!nodename) {
    nodename = getenv("ZIRCON_NODENAME");
  }
  if (nodename) {
    fprintf(stderr, "[%s] Will only boot nodename '%s'\n", appname, nodename);
  }

  if (board_name) {
    log("Board name set to [%s]", board_name);
  }

  sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
  if (sock < 0) {
    log("cannot create socket %d", sock);
    return -1;
  }

  if (!IN6_IS_ADDR_UNSPECIFIED(&allowed_addr) || nodename || reuseport) {
    setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &(int){1}, sizeof 1);
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof 1);
  }

  memset(&addr, 0, sizeof(addr));
  addr.sin6_family = AF_INET6;
  if (no_bind) {
    if (IN6_IS_ADDR_UNSPECIFIED(&allowed_addr)) {
      log("need to specify ipv6 address using -a for --no-bind");
      close(sock);
      return -1;
    }
    if (allowed_scope_id == -1) {
      log("need to specify interface number in -a for --no-bind.");
      log("Ex: -a fe80::5054:ff:fe12:3456/4 \nHint: use netls to get the address");
      close(sock);
      return -1;
    }
    memcpy(&addr.sin6_addr, &allowed_addr, sizeof(struct in6_addr));
    addr.sin6_port = htons(NETBOOT_PORT_SERVER);
    addr.sin6_scope_id = allowed_scope_id;
    log("Sending request to %s", sockaddr_str(&addr));
  } else {
    addr.sin6_port = htons(NETBOOT_PORT_ADVERT);
    if (bind(sock, (void*)&addr, sizeof(addr)) < 0) {
      log("cannot bind to %s %d: %s\nthere may be another bootserver running\n",
          sockaddr_str(&addr), errno, strerror(errno));
      close(sock);
      return -1;
    }
    log("listening on %s", sockaddr_str(&addr));
  }

  for (;;) {
    struct sockaddr_in6 ra;
    socklen_t rlen;
    char buf[4096];
    netboot_message_header_t* hdr = (void*)buf;
    uint8_t* payload = (uint8_t*)(hdr + 1);
    rlen = sizeof(ra);

    if (no_bind) {
      // Send request to device to get the advertisement instead of waiting for the
      // broadcasted advertisement.
      hdr->magic = NETBOOT_MAGIC;
      hdr->cmd = NETBOOT_COMMAND_GET_ADVERT;

      ssize_t send_result = sendto(sock, buf, sizeof(netboot_message_header_t), 0,
                                   (struct sockaddr*)&addr, sizeof(addr));
      if (send_result != sizeof(netboot_message_header_t)) {
        if (fail_fast) {
          close(sock);
          return -1;
        }
        sleep(RETRY_DELAY_SEC);
        continue;
      }

      // Ensure that response is received.
      struct pollfd read_fd[1];
      read_fd[0].fd = sock;
      read_fd[0].events = POLLIN;
      int ret = poll(read_fd, 1, 1000);
      if (ret < 0 || !(read_fd[0].revents & POLLIN)) {
        // No response received. Resend request after delay.
        if (fail_fast) {
          close(sock);
          return -1;
        }
        sleep(RETRY_DELAY_SEC);
        continue;
      }
    }

    ssize_t r = recvfrom(sock, buf, sizeof(buf) - 1, 0, (void*)&ra, &rlen);
    if (r < 0) {
      log("socket read error %s", strerror(errno));
      close(sock);
      return -1;
    }
    if ((size_t)r < sizeof(netboot_message_header_t)) {
      continue;
    }
    if (!IN6_IS_ADDR_LINKLOCAL(&ra.sin6_addr)) {
      log("ignoring non-link-local message");
      continue;
    }
    if (!IN6_IS_ADDR_UNSPECIFIED(&allowed_addr) &&
        !IN6_ARE_ADDR_EQUAL(&allowed_addr, &ra.sin6_addr)) {
      log("ignoring message not from allowed address '%s'",
          inet_ntop(AF_INET6, &allowed_addr, tmp, sizeof(tmp)));
      continue;
    }
    if (hdr->magic != NETBOOT_MAGIC)
      continue;
    if (hdr->cmd != NETBOOT_COMMAND_ADVERTISE)
      continue;
    if ((use_tftp && (hdr->arg < NETBOOT_VERSION_1_3)) ||
        (!use_tftp && (hdr->arg < NETBOOT_VERSION_1_1))) {
      log("%sIncompatible version 0x%08X of bootloader "
          "detected from %s, please upgrade your bootloader%s",
          ANSI(RED), hdr->arg, sockaddr_str(&ra), ANSI(RESET));
      if (fail_fast) {
        close(sock);
        return -1;
      }
      continue;
    }

    log("Received request from %s", sockaddr_str(&ra));

    // ensure any payload is null-terminated
    buf[r] = 0;

    char* save = NULL;
    char* adv_nodename = NULL;
    const char* adv_version = "unknown";
    for (char* var = strtok_r((char*)(payload), ";", &save); var;
         var = strtok_r(NULL, ";", &save)) {
      if (!strncmp(var, "nodename=", 9)) {
        adv_nodename = var + 9;
      } else if (!strncmp(var, "version=", 8)) {
        adv_version = var + 8;
      }
    }

    if (nodename) {
      if (adv_nodename == NULL) {
        log("ignoring unknown nodename (expecting %s)", nodename);
      } else if (strcmp(adv_nodename, nodename)) {
        log("ignoring nodename %s (expecting %s)", adv_nodename, nodename);
        continue;
      }
    }

    if (strcmp(NETBOOT_BOOTLOADER_VERSION, adv_version)) {
      if (allow_zedboot_version_mismatch) {
        log("%sWARNING: Bootserver version '%s' != remote Zedboot version '%s'."
            " Paving may fail.%s",
            ANSI(RED), NETBOOT_BOOTLOADER_VERSION, adv_version, ANSI(RESET));
      } else {
        log("%sWARNING: Bootserver version '%s' != remote Zedboot version '%s'."
            " Device will not be serviced. Please upgrade Zedboot.%s",
            ANSI(RED), NETBOOT_BOOTLOADER_VERSION, adv_version, ANSI(RESET));
        if (fail_fast || fail_fast_if_version_mismatch) {
          close(sock);
          return -1;
        }
        continue;
      }
    }

    if (adv_nodename) {
      log("Proceeding with nodename %s", adv_nodename);
    }

    log("Transfer starts");
    status = 0;
    // This needs to be first as it validates that the other images are
    // correct.
    if (status == 0 && board_name) {
      snprintf(board_info_file, sizeof(board_info_file), netboot_board_info_template, tmpdir);
      const char* tmpfile = mktemp(board_info_file);
      status = xfer2(&ra, tmpfile, NETBOOT_BOARD_INFO_FILENAME);
      if (status == 0) {
        status = validate_board_name(board_name, tmpfile);
      }
      unlink(tmpfile);
    }
    if (status == 0 && cmdline[0]) {
      status = xfer(&ra, "(cmdline)", cmdline);
    }
    // Wipe partition tables before writing anything to persistent storage.
    if (status == 0 && wipe_partition_tables_device_path) {
      snprintf(block_device_path, sizeof(block_device_path), block_device_path_template, tmpdir);
      int fd = mkstemp(block_device_path);
      netboot_block_device_t info = {};
      strncpy(info.block_device_path, wipe_partition_tables_device_path,
              sizeof(info.block_device_path) - 1);
      int written = write(fd, &info, sizeof(info));
      status = written == sizeof(info) ? 0 : -1;
      if (status == 0) {
        status = xfer(&ra, block_device_path, NETBOOT_WIPE_PARTITION_TABLES_FILENAME);
      }
      unlink(block_device_path);
      close(fd);
    }
    // Initialize partition tables before writing anything to persistent storage.
    if (status == 0 && init_partition_tables_device_path) {
      snprintf(block_device_path, sizeof(block_device_path), block_device_path_template, tmpdir);
      int fd = mkstemp(block_device_path);
      netboot_block_device_t info = {};
      strncpy(info.block_device_path, init_partition_tables_device_path,
              sizeof(info.block_device_path) - 1);
      int written = write(fd, &info, sizeof(info));
      status = written == sizeof(info) ? 0 : -1;
      if (status == 0) {
        status = xfer(&ra, block_device_path, NETBOOT_INIT_PARTITION_TABLES_FILENAME);
      }
      unlink(block_device_path);
      close(fd);
    }
    for (size_t i = 0; i < num_fvms; i++) {
      if (status == 0 && fvm_images[i]) {
        status = xfer(&ra, fvm_images[i], NETBOOT_FVM_SPARSE_FILENAME);
      }
    }
    if (status == 0 && fxfs_image) {
      status = xfer(&ra, fxfs_image, NETBOOT_FXFS_FILENAME);
    }
    if (status == 0 && bootloader_image) {
      status = xfer(&ra, bootloader_image, NETBOOT_BOOTLOADER_FILENAME);
    }
    for (size_t i = 0; i < num_firmware; i++) {
      if (status == 0) {
        char filename[strlen(NETBOOT_FIRMWARE_FILENAME_PREFIX) + NETBOOT_FIRMWARE_TYPE_MAX_LENGTH];
        int result = snprintf(filename, sizeof(filename), "%s%s", NETBOOT_FIRMWARE_FILENAME_PREFIX,
                              firmware_images[i].type);
        if (result < 0 || (size_t)result >= sizeof(filename)) {
          fprintf(stderr, "error creating firmware filename for type '%s'\n",
                  firmware_images[i].type);
          status = -1;
        } else {
          filename[sizeof(filename) - 1] = '\0';
          status = xfer(&ra, firmware_images[i].image, filename);
        }
      }
    }
    if (status == 0 && zircona_image) {
      status = xfer(&ra, zircona_image, NETBOOT_ZIRCONA_FILENAME);
    }
    if (status == 0 && zirconb_image) {
      status = xfer(&ra, zirconb_image, NETBOOT_ZIRCONB_FILENAME);
    }
    if (status == 0 && zirconr_image) {
      status = xfer(&ra, zirconr_image, NETBOOT_ZIRCONR_FILENAME);
    }
    if (status == 0 && vbmetaa_image) {
      status = xfer(&ra, vbmetaa_image, NETBOOT_VBMETAA_FILENAME);
    }
    if (status == 0 && vbmetab_image) {
      status = xfer(&ra, vbmetab_image, NETBOOT_VBMETAB_FILENAME);
    }
    if (status == 0 && vbmetar_image) {
      status = xfer(&ra, vbmetar_image, NETBOOT_VBMETAR_FILENAME);
    }
    if (status == 0 && authorized_keys) {
      status = xfer(&ra, authorized_keys, NETBOOT_SSHAUTH_FILENAME);
    }
    if (status == 0 && kernel_fn) {
      status = xfer(&ra, kernel_fn, NETBOOT_KERNEL_FILENAME);
    }
    if (status == 0) {
      log("Transfer ends successfully.");
      // Only reboot if we actually paved an image.
      if (kernel_fn || bootloader_image || num_firmware || zircona_image || zirconb_image ||
          zirconr_image || vbmetaa_image || vbmetab_image || fvm_images[0]) {
        if (kernel_fn) {
          send_boot_command(&ra);
        } else {
          send_reboot_command(&ra);
        }
      }
      if (once) {
        close(sock);
        return 0;
      }
    } else if (fail_fast) {
      close(sock);
      return -1;
    } else {
      log("Transfer ends incompletely.");
      log("Wait for %u secs before retrying...\n\n", RETRY_DELAY_SEC);
      sleep(RETRY_DELAY_SEC);
    }
    drain(sock);
  }

  close(sock);
  return 0;
}
