// Copyright 2019 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.

#include "args.h"

#include <stdlib.h>

#include <cstring>

int parse_common_args(int argc, char** argv, const char** error, const char** interface) {
  while (argc > 1) {
    if (!strncmp(argv[1], "--interface", 11)) {
      if (argc < 3) {
        *error = "netsvc: missing argument to --interface";
        return -1;
      }
      *interface = argv[2];
      argv++;
      argc--;
    }
    argv++;
    argc--;
  }
  return 0;
}

int parse_netsvc_args(int argc, char** argv, const char** error, bool* netboot, bool* nodename,
                      bool* advertise, bool* all_features, const char** interface) {
  int err = parse_common_args(argc, argv, error, interface);
  if (err) {
    return err;
  }
  while (argc > 1) {
    if (!strncmp(argv[1], "--netboot", 9)) {
      *netboot = true;
    } else if (!strncmp(argv[1], "--nodename", 10)) {
      *nodename = true;
    } else if (!strncmp(argv[1], "--advertise", 11)) {
      *advertise = true;
    } else if (!strncmp(argv[1], "--all-features", 14)) {
      *all_features = true;
    }
    argv++;
    argc--;
  }
  return 0;
}

int parse_device_name_provider_args(int argc, char** argv, const char** error,
                                    const char** interface, const char** nodename,
                                    const char** ethdir) {
  int err = parse_common_args(argc, argv, error, interface);
  if (err) {
    return err;
  }

  while (argc > 1) {
    if (!strncmp(argv[1], "--nodename", 10)) {
      if (argc < 3) {
        *error = "netsvc: missing argument to --nodename";
        return -1;
      }
      *nodename = argv[2];
      argv++;
      argc--;
    }
    if (!strncmp(argv[1], "--ethdir", 12)) {
      if (argc < 3) {
        *error = "netsvc: missing argument to --ethdir";
        return -1;
      }
      *ethdir = argv[2];
      argv++;
      argc--;
    }
    argv++;
    argc--;
  }
  return 0;
}
