portconfig.cc 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include "portconfig.h"
  15. #include <asiolink/io_address.h>
  16. using namespace std;
  17. using namespace isc::data;
  18. using namespace asiolink;
  19. namespace isc {
  20. namespace server_common {
  21. namespace portconfig {
  22. AddressList
  23. parseAddresses(isc::data::ConstElementPtr addresses,
  24. const std::string& elemName)
  25. {
  26. AddressList result;
  27. if (addresses) {
  28. if (addresses->getType() == Element::list) {
  29. for (size_t i(0); i < addresses->size(); ++ i) {
  30. ConstElementPtr addrPair(addresses->get(i));
  31. ConstElementPtr addr(addrPair->get("address"));
  32. ConstElementPtr port(addrPair->get("port"));
  33. if (!addr || ! port) {
  34. isc_throw(BadValue, "Address must contain both the IP"
  35. "address and port");
  36. }
  37. try {
  38. IOAddress(addr->stringValue());
  39. if (port->intValue() < 0 ||
  40. port->intValue() > 0xffff) {
  41. isc_throw(BadValue, "Bad port value (" <<
  42. port->intValue() << ")");
  43. }
  44. result.push_back(AddressPair(addr->stringValue(),
  45. port->intValue()));
  46. }
  47. catch (const TypeError &e) { // Better error message
  48. isc_throw(TypeError,
  49. "Address must be a string and port an integer");
  50. }
  51. }
  52. } else if (addresses->getType() != Element::null) {
  53. isc_throw(TypeError, elemName + " config element must be a list");
  54. }
  55. }
  56. return (result);
  57. }
  58. }
  59. }
  60. }