00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "ip-address.h"
00031
00032 static class IPAddressClass : public TclClass {
00033 public:
00034 IPAddressClass() : TclClass("Address/IP") {}
00035 TclObject* create(int argc, const char *const *argv)
00036 {
00037 int i=0;
00038 while((strcmp(argv[i],"Address/IP"))&&(i<argc))
00039 {
00040 i++;
00041 }
00042 if(argc - i - 1 == 2)
00043 {
00044 return (new IPAddress(argv[i+2]));
00045 }
00046
00047
00048 else
00049 return (new IPAddress());
00050 }
00051 } class_ip_address;
00052
00053 IPAddress::IPAddress() : ipAddr_(0)
00054 {
00055 }
00056
00057 IPAddress::IPAddress(const char *ip)
00058 {
00059 setAddress(ip);
00060 printf("IPAddress(%s)\n", ip);
00061
00062
00063 }
00064
00065 IPAddress::~IPAddress()
00066 {
00067 }
00068
00069 int IPAddress::toString(char *str, int strlen)
00070 {
00071 char addr[20];
00072 int ip;
00073 getAddr(&ip, sizeof(int));
00074 sprintf(addr,"%d.%d.%d.%d", (ip & 0xff000000)>>24,(ip & 0x00ff0000)>>16, (ip & 0x0000ff00)>>8, (ip & 0x000000ff));
00075 strncpy(str, addr, strlen);
00076 if(::strlen(addr)>= strlen)
00077 return 1;
00078 return 0;
00079 }
00080
00081 int IPAddress::strlen()
00082 {
00083 char addr[20];
00084 int ip;
00085 getAddr(&ip, sizeof(int));
00086 sprintf(addr,"%d.%d.%d.%d", (ip & 0xff000000)>>24,(ip & 0x00ff0000)>>16, (ip & 0x0000ff00)>>8, (ip & 0x000000ff));
00087 return ::strlen(addr);
00088 }
00089
00090 void IPAddress::setAddress(const char *addr)
00091 {
00092 int level[4] = {0,0,0,0};
00093 char tmp[20];
00094 strncpy(tmp,addr,19);
00095 tmp[19] = '\0';
00096 char *p = strtok(tmp, ".");
00097 for(int i = 0; p && i < 4; p = strtok(NULL, "."), i++)
00098 {
00099 level[i] = atoi(p);
00100 if(level[i] > 255)
00101 level[i] = 255;
00102 else if(level[i] < 0)
00103 level[i] = 0;
00104 }
00105 int ip = 0;
00106 for(int i = 0; i < 4; i++)
00107 {
00108 ip += (level[i] << 8 * (3 - i));
00109 }
00110 setAddr(&ip, sizeof(int));
00111 ipAddr_ = ip;
00112 printf("ipAddr_ %d\n", ipAddr_);
00113 }
00114
00115
00116 int IPAddress::command(int argc, const char * const *argv)
00117 {
00118
00119 return MrclAddress::command(argc, argv);
00120 }
00121
00122
00123 int IPAddress::INT(char* str)
00124 {
00125 if (str==0)
00126 return (ipAddr_);
00127 else
00128 {
00129 int addr;
00130 memcpy(&addr, str + sizeof(int), sizeof(int));
00131 return (addr);
00132 }
00133 }
00134
00135 int IPAddress::AND(char* str1, char *str2)
00136 {
00137 int addr1;
00138 int addr2;
00139 int ret;
00140 memcpy(&addr1, str1 + sizeof(int), sizeof(int));
00141
00142
00143
00144
00145 if (str2==0)
00146 return(ipAddr_ & addr1);
00147 else
00148 {
00149 memcpy(&addr2, str2 + sizeof(int), sizeof(int));
00150 return(addr1 & addr2);
00151 }
00152 }
00153
00154 int IPAddress::OR(char* str1, char *str2)
00155 {
00156 int addr1;
00157 int addr2;
00158 int ret;
00159 memcpy(&addr1, str1 + sizeof(int), sizeof(int));
00160
00161
00162
00163
00164 if (str2==0)
00165 return(ipAddr_ | addr1);
00166 else
00167 {
00168 memcpy(&addr2, str2 + sizeof(int), sizeof(int));
00169 return(addr1 | addr2);
00170 }
00171 }
00172