// 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

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <libgen.h>
#include <netinet/in.h>
#include <poll.h>
#include <sched.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
#include <zircon/boot/netboot.h>

#include <tftp/tftp.h>

#include "netprotocol.h"

#define TFTP_BUF_SZ 2048

typedef struct {
  int fd;
  size_t size;
} file_info_t;

typedef struct {
  int socket;
  bool connected;
  uint32_t previous_timeout_ms;
  struct sockaddr_in6 target_addr;
} transport_info_t;

static const char* appname;

static ssize_t file_open_read(const char* filename, void* file_cookie) {
  int fd = open(filename, O_RDONLY);
  if (fd < 0) {
    return TFTP_ERR_IO;
  }
  file_info_t* file_info = file_cookie;
  file_info->fd = fd;
  struct stat st;
  if (fstat(file_info->fd, &st) < 0) {
    close(fd);
    return TFTP_ERR_IO;
  }
  file_info->size = st.st_size;
  return st.st_size;
}

static tftp_status file_open_write(const char* filename, size_t size, void* file_cookie) {
  int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
  if (fd < 0) {
    return TFTP_ERR_IO;
  }
  file_info_t* file_info = file_cookie;
  file_info->fd = fd;
  file_info->size = size;
  return TFTP_NO_ERROR;
}

static tftp_status file_read(void* data, size_t* length, off_t offset, void* file_cookie) {
  int fd = ((file_info_t*)file_cookie)->fd;
  ssize_t n = pread(fd, data, *length, offset);
  if (n < 0) {
    return TFTP_ERR_IO;
  }
  *length = n;
  return TFTP_NO_ERROR;
}

static tftp_status file_write(const void* data, size_t* length, off_t offset, void* file_cookie) {
  int fd = ((file_info_t*)file_cookie)->fd;
  ssize_t n = pwrite(fd, data, *length, offset);
  if (n < 0) {
    return TFTP_ERR_IO;
  }
  *length = n;
  return TFTP_NO_ERROR;
}

static void file_close(void* file_cookie) { close(((file_info_t*)file_cookie)->fd); }

// Longest time we will wait for a send operation to succeed
#define MAX_SEND_TIME_MS 1000

static tftp_status transport_send(void* data, size_t len, void* transport_cookie) {
  transport_info_t* transport_info = transport_cookie;
  ssize_t send_result;
  struct pollfd poll_fds = {.fd = transport_info->socket, .events = POLLOUT};
  do {
    int poll_result = poll(&poll_fds, 1, MAX_SEND_TIME_MS);
    if (poll_result <= 0) {
      // We'll treat a timeout as an IO error and not a TFTP_ERR_TIMED_OUT,
      // since the latter is a timeout waiting for a response from the server.
      return TFTP_ERR_IO;
    }
    if (!transport_info->connected) {
      transport_info->target_addr.sin6_port = htons(NB_TFTP_INCOMING_PORT);
      send_result = sendto(transport_info->socket, data, len, 0,
                           (struct sockaddr*)&transport_info->target_addr,
                           sizeof(transport_info->target_addr));
    } else {
      send_result = send(transport_info->socket, data, len, 0);
    }
  } while ((send_result < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK) ||
                                 (errno == ENOBUFS && sched_yield() == 0)));

  if (send_result < 0) {
    return TFTP_ERR_IO;
  }
  return TFTP_NO_ERROR;
}

static int transport_recv(void* data, size_t len, bool block, void* transport_cookie) {
  transport_info_t* transport_info = transport_cookie;
  int flags = fcntl(transport_info->socket, F_GETFL, 0);
  if (flags < 0) {
    return TFTP_ERR_IO;
  }
  if (block) {
    flags &= ~O_NONBLOCK;
  } else {
    flags |= O_NONBLOCK;
  }
  if (fcntl(transport_info->socket, F_SETFL, flags)) {
    return TFTP_ERR_IO;
  }
  ssize_t recv_result;
  struct sockaddr_in6 connection_addr;
  socklen_t addr_len = sizeof(connection_addr);
  if (!transport_info->connected) {
    recv_result = recvfrom(transport_info->socket, data, len, 0, (struct sockaddr*)&connection_addr,
                           &addr_len);
  } else {
    recv_result = recv(transport_info->socket, data, len, 0);
  }
  if (recv_result < 0) {
    if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
      return TFTP_ERR_TIMED_OUT;
    }
    return TFTP_ERR_INTERNAL;
  }
  if (!transport_info->connected) {
    if (connect(transport_info->socket, (struct sockaddr*)&connection_addr,
                sizeof(connection_addr)) < 0) {
      return TFTP_ERR_IO;
    }
    memcpy(&transport_info->target_addr, &connection_addr, sizeof(transport_info->target_addr));
    transport_info->connected = true;
  }
  return recv_result;
}

static int transport_timeout_set(uint32_t timeout_ms, void* transport_cookie) {
  transport_info_t* transport_info = transport_cookie;
  if (transport_info->previous_timeout_ms != timeout_ms && timeout_ms > 0) {
    transport_info->previous_timeout_ms = timeout_ms;
    struct timeval tv;
    tv.tv_sec = timeout_ms / 1000;
    tv.tv_usec = 1000 * (timeout_ms - 1000 * tv.tv_sec);
    return setsockopt(transport_info->socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
  }
  return 0;
}

static int transfer_file(bool push, int s, struct sockaddr_in6* addr, const char* dst,
                         const char* src) {
  // Initialize session
  tftp_session* session = NULL;
  size_t session_data_sz = tftp_sizeof_session();
  void* session_data = calloc(session_data_sz, 1);
  if (session_data == NULL) {
    fprintf(stderr, "%s: unable to allocate tftp session memory\n", appname);
    return 1;
  }
  if (tftp_init(&session, session_data, session_data_sz) != TFTP_NO_ERROR) {
    fprintf(stderr, "%s: unable to initiate tftp session\n", appname);
    free(session_data);
    return 1;
  }

  // Initialize file interface
  file_info_t file_info;
  tftp_file_interface file_ifc = {file_open_read, file_open_write, file_read, file_write,
                                  file_close};
  tftp_session_set_file_interface(session, &file_ifc);

  // Initialize transport interface
  transport_info_t transport_info;
  transport_info.previous_timeout_ms = 0;
  transport_info.socket = s;
  transport_info.connected = false;
  memcpy(&transport_info.target_addr, addr, sizeof(transport_info.target_addr));
  tftp_transport_interface transport_ifc = {transport_send, transport_recv, transport_timeout_set};
  tftp_session_set_transport_interface(session, &transport_ifc);

  // Set our preferred transport options
  tftp_set_options(session, &tftp_block_size, NULL, &tftp_window_size);

  // Prepare buffers
  char err_msg[128];
  tftp_request_opts opts = {0};
  opts.inbuf = malloc(TFTP_BUF_SZ);
  opts.inbuf_sz = TFTP_BUF_SZ;
  opts.outbuf = malloc(TFTP_BUF_SZ);
  opts.outbuf_sz = TFTP_BUF_SZ;
  opts.err_msg = err_msg;
  opts.err_msg_sz = sizeof(err_msg);

  tftp_status status;
  if (push) {
    status = tftp_push_file(session, &transport_info, &file_info, src, dst, &opts);
  } else {
    status = tftp_pull_file(session, &transport_info, &file_info, dst, src, &opts);
  }

  free(session_data);
  free(opts.inbuf);
  free(opts.outbuf);

  if (status < 0) {
    fprintf(stderr, "%s: %s (status = %d)\n", appname, opts.err_msg, (int)status);
    return 1;
  }

  fprintf(stderr, "wrote %zu bytes\n", file_info.size);

  return 0;
}

static void usage(void) {
  fprintf(stderr, "usage: %s [options] [hostname:]src [hostname:]dst\n", appname);
  netboot_usage(true);
}

int main(int argc, char** argv) {
  appname = argv[0];

  int index = netboot_handle_getopt(argc, argv);
  if (index < 0) {
    usage();
    return -1;
  }
  argv += index;
  argc -= index;

  if (argc != 2) {
    usage();
    return -1;
  }

  const char* src = argv[0];
  const char* dst = argv[1];

  int push = -1;
  char* pos;
  const char* hostname;
  if ((pos = strpbrk(src, ":")) != 0) {
    push = 0;
    hostname = src;
    pos[0] = 0;
    src = pos + 1;
  }
  if ((pos = strpbrk(dst, ":")) != 0) {
    if (push == 0) {
      fprintf(stderr, "%s: only one of src or dst can have a hostname\n", appname);
      return -1;
    }
    push = 1;
    hostname = dst;
    pos[0] = 0;
    dst = pos + 1;
  }
  if (push == -1) {
    fprintf(stderr, "%s: either src or dst needs a hostname\n", appname);
    return -1;
  }

  int s;
  struct sockaddr_in6 server_addr;
  if ((s = netboot_open(hostname, NULL, &server_addr, false)) < 0) {
    if (errno == ETIMEDOUT) {
      fprintf(stderr, "%s: lookup of %s timed out\n", appname, hostname);
    } else {
      fprintf(stderr, "%s: failed to connect to %s: %d\n", appname, hostname, errno);
    }
    return -1;
  }

  int ret = transfer_file(push, s, &server_addr, dst, src);
  close(s);
  return ret;
}
