/*
 * Copyright 2015 Google Inc.
 * All rights reserved.
 * diagutil -- Linux-based Hardware Diagnostic Utilities
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DIAGS_VERSION "1.0.2"

/* External Functions */
int i2cprobe(int argc, char **argv);
int i2cread(int argc, char **argv);
int i2cwrite(int argc, char **argv);
int ioread(int argc, char **argv);
int iowrite(int argc, char **argv);
int gpioout(int argc, char *argv[]);
int gpiodisableout(int argc, char *argv[]);
int gpiooutstat(int argc, char *argv[]);
int board_info(int argc, char *argv[]);
int send_ip(int argc, char *argv[]);
int send_eth(int argc, char *argv[]);
int send_if_to_mac(int argc, char *argv[]);
int geloopback(int argc, char *argv[]);
int lan_lpbk(int argc, char *argv[]);
int set_lan_snake(int argc, char *argv[]);
int ge_traffic(int argc, char *argv[]);
int start_server(int argc, char *argv[]);
int sendcmd(int argc, char *argv[]);
int switchreset(int argc, char *argv[]);
int atheros_init(int argc, char *argv[]);
int phy_init(int argc, char *argv[]);
int satacfgdump(int argc, char *argv[]);
int satabench(int argc, char *argv[]);
int sata_link_reset(int argc, char *argv[]);
int mem_test(int argc, char *argv[]);
int fan_mon(int argc, char *argv[]);
int temperature(int argc, char *argv[]);
int fan_speed(int argc, char *argv[]);
int fan_rpm(int argc, char *argv[]);
int flash_test(int argc, char *argv[]);
int tpm_startup(int argc, char *argv[]);
int phy_read(int argc, char *argv[]);
int phy_write(int argc, char *argv[]);

/* Define the command structure */
typedef struct {
  const char *name;
  int (*funcp)(int, char **);
} tCOMMAND;

void printVersion() { printf("%s\n", DIAGS_VERSION); }

int version(int argc, char *argv[]) {
  // This is to avoid unused params warning
  if ((argc != 1) || (argv[0] == NULL)) {
    printf("Invalid command parameter\n");
  }
  printVersion();
  return 0;
}

/* Table of supported commands */
tCOMMAND command_list[] = {
    {"i2cread", i2cread},
    {"i2cwrite", i2cwrite},
    {"i2cprobe", i2cprobe},
    {"", NULL},
    {"ioread", ioread},
    {"iowrite", iowrite},
    {"", NULL},
    {"satacfgdump", satacfgdump},
    {"satabench", satabench},
    {"sata_link_reset", sata_link_reset},
    {"", NULL},
    {"gpioout", gpioout},
    {"gpiooutstat", gpiooutstat},
    {"gpiodisableout", gpiodisableout},
    {"board_info", board_info},
    {"", NULL},
    {"phy_read", phy_read},
    {"phy_write", phy_write},
    {"send_ip", send_ip},
    {"send_eth", send_eth},
    {"send_if_to_mac", send_if_to_mac},
    {"loopback", geloopback},
    {"switchreset", switchreset},
    {"atheros_init", atheros_init},
    {"phy_init", phy_init},
    {"lan_lpbk", lan_lpbk},
    {"set_lan_snake", set_lan_snake},
    {"ge_traffic", ge_traffic},
    {"", NULL},
    {"mem_test", mem_test},
    {"", NULL},
    {"fan_mon", fan_mon},
    {"temperature", temperature},
    {"fan_speed", fan_speed},
    {"fan_rpm", fan_rpm},
    {"", NULL},
    {"flash_test", flash_test},
    {"", NULL},
    {"tpm_startup", tpm_startup},
    {"", NULL},
    {"version", version},
    {"", NULL},
    {NULL, NULL},
};

static void usage(void) {
  int i;

  printf("Supported commands:\n");

  for (i = 0; command_list[i].name != NULL; ++i) {
    printf("\t%s\n", command_list[i].name);
  }

  return;
}

int main(int argc, char *argv[]) {
  int i, rc;

  if (argc > 1) {
    /* Search the command list for a match */
    for (i = 0; command_list[i].name != NULL; ++i) {
      if (strcmp(argv[1], command_list[i].name) == 0) {
        rc = command_list[i].funcp(argc - 1, &argv[1]);
        printf("%s is complete\n", argv[1]);
        return rc;
      }
    }
  }

  /* no command or bad command */
  usage();

  return 0;
}
