Example #1
0
int system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
{
    int i = 0;

    enum
    {
        EXPECT_NOTHING,
        EXPECT_BROADCAST,
        EXPECT_NETMASK,
        EXPECT_METRIC,
        EXPECT_MTU
    } expect = EXPECT_NOTHING;

    *ifp = parse_opt_new_ifs (argv[0]);

    while (++i < argc)
    {
        switch (expect)
        {
            case EXPECT_BROADCAST:
                parse_opt_set_brdaddr (*ifp, argv[i]);
                break;

            case EXPECT_NETMASK:
                parse_opt_set_netmask (*ifp, argv[i]);
                break;

            case EXPECT_MTU:
                parse_opt_set_mtu (*ifp, argv[i]);
                break;

            case EXPECT_METRIC:
                parse_opt_set_metric (*ifp, argv[i]);
                break;

            case EXPECT_NOTHING:
                break;
        }

        if (expect != EXPECT_NOTHING)
            expect = EXPECT_NOTHING;
        else if (!strcmp (argv[i], "broadcast"))
            expect = EXPECT_BROADCAST;
        else if (!strcmp (argv[i], "netmask"))
            expect = EXPECT_NETMASK;
        else if (!strcmp (argv[i], "metric"))
            expect = EXPECT_METRIC;
        else if (!strcmp (argv[i], "mtu"))
            expect = EXPECT_MTU;
        else
        {
            /* Recognize AF here.  */
            /* Recognize up/down.  */
            /* Also auto-revarp, trailers, -trailers,
               private, -private, arp, -arp, plumb, unplumb.  */
            if (!((*ifp)->valid & IF_VALID_ADDR))
                parse_opt_set_address (*ifp, argv[i]);
            else if (!((*ifp)->valid & IF_VALID_DSTADDR))
                parse_opt_set_dstaddr (*ifp, argv[i]);
        }
    }

    switch (expect)
    {
        case EXPECT_BROADCAST:
            error (0, 0, "option `broadcast' requires an argument");
            break;

        case EXPECT_NETMASK:
            error (0, 0, "option `netmask' requires an argument");
            break;

        case EXPECT_METRIC:
            error (0, 0, "option `metric' requires an argument");
            break;

        case EXPECT_MTU:
            error (0, 0, "option `mtu' requires an argument");
            break;

        case EXPECT_NOTHING:
            break;
    }
    return expect == EXPECT_NOTHING;
}
Example #2
0
int
system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
{
  int i = -1;
  enum
  {
    EXPECT_NOTHING,
    EXPECT_AF,
    EXPECT_NAME,
    EXPECT_BROADCAST,
    EXPECT_NETMASK,
    EXPECT_METRIC,
  } expect = EXPECT_NAME;

  while (++i < argc)
    {
      switch (expect)
	{
	case EXPECT_NAME:
	  *ifp = parse_opt_new_ifs (argv[i]);
	  break;

	case EXPECT_AF:
	  parse_opt_set_af (*ifp, argv[i]);
	  break;

	case EXPECT_BROADCAST:
	  parse_opt_set_brdaddr (*ifp, argv[i]);
	  break;

	case EXPECT_NETMASK:
	  parse_opt_set_netmask (*ifp, argv[i]);
	  break;

	case EXPECT_METRIC:
	  parse_opt_set_metric (*ifp, argv[i]);
	  break;

	case EXPECT_NOTHING:
	  break;
	}

      if (expect != EXPECT_NOTHING)
	expect = EXPECT_NOTHING;
      else if (!strcmp (argv[i], "broadcast"))
	expect = EXPECT_BROADCAST;
      else if (!strcmp (argv[i], "netmask"))
	expect = EXPECT_NETMASK;
      else if (!strcmp (argv[i], "metric"))
	expect = EXPECT_METRIC;
      else
	{
	  /* Recognize up/down.  */
	  /* Also debug, -debug, trailers, -trailers,
	     ipdst.  */
	  if (!(*ifp->valid & IF_VALID_ADDR))
	    {
	      parse_opt_set_address (*ifp, argv[i]);
	      expect = EXPECT_AF;
	    }
	  else if (!(*ifp->valid & IF_VALID_DSTADDR))
	    parse_opt_set_dstaddr (*ifp, argv[i]);
	}
    }

  switch (expect)
    {
    case EXPECT_BROADCAST:
      error (0, 0, "option `broadcast' requires an argument");
      break;

    case EXPECT_NETMASK:
      error (0, 0, "option `netmask' requires an argument");
      break;

    case EXPECT_METRIC:
      error (0, 0, "option `metric' requires an argument");
      break;

    case EXPECT_NAME:
    case EXPECT_AF:
    case EXPECT_NOTHING:
      expect = EXPECT_NOTHING;
      break;
    }
  return expect == EXPECT_NOTHING;
}