netbyte.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:14k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: netbyte.cpp,v 1.6.28.3 2004/07/09 01:48:16 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxcom.h"
  50. #include "hlxclib/ctype.h"
  51. #include "safestring.h"
  52. #include "netbyte.h"
  53. #include "hxtypes.h"
  54. #include "ihxpckts.h"
  55. #include "hxbuffer.h"
  56. #ifdef _MACINTOSH
  57. #include "hxstrutl.h" // for isascii definition
  58. #endif
  59. #include "hxheap.h"
  60. #ifdef _DEBUG
  61. #undef HX_THIS_FILE
  62. static const char HX_THIS_FILE[] = __FILE__;
  63. #endif
  64. #ifndef INADDR_NONE
  65. #define INADDR_NONE -1
  66. #endif
  67. #if defined(HELIX_CONFIG_NOSTATICS)
  68. # include "globals/hxglobals.h"
  69. #endif
  70. #if defined(HELIX_CONFIG_NOSTATICS)
  71. # define STATIC_CHAR_ARRAY(name, length) 
  72.     static const char _##name = ''; 
  73.     char*& str = (char*&)HXGlobalCharArray::Get(&_##name, length, "" );
  74. #else    
  75. # define STATIC_CHAR_ARRAY(name, length) static char name[length];
  76. #endif /* HELIX_CONFIG_NOSTATICS */
  77. #ifndef NET_ENDIAN
  78. NetWord WToNet(HostWord wHost) {
  79. /* Hopefully, a portable implementation
  80. ** (although it's unnecessary labor on a
  81. ** non-swapped machine) 
  82. */
  83. NetWord wNet;
  84. unsigned char *uc = (unsigned char *)&wNet;
  85. *uc++ = (unsigned char) ((wHost & 0xFF00) >> 8);
  86. *uc++ = (unsigned char) (wHost & 0x00FF);
  87. return wNet;
  88. HostWord WToHost(NetWord wNet) {
  89. HostWord wHost;
  90. unsigned char *uc = (unsigned char *)&wNet;
  91. wHost = (*uc++) << 8;
  92. wHost += (*uc++);
  93. return wHost;
  94. }
  95. NetDWord DwToNet(HostDWord dwHost) {
  96. NetDWord dwNet;
  97. unsigned char *uc = (unsigned char *)&dwNet;
  98. *uc++ = (unsigned char) ((dwHost & 0xFF000000L) >> 24);
  99. *uc++ = (unsigned char) ((dwHost & 0x00FF0000L) >> 16);
  100. *uc++ = (unsigned char) ((dwHost & 0x0000FF00L) >> 8);
  101. *uc++ = (unsigned char) (dwHost & 0x000000FFL);
  102. return dwNet;
  103. HostDWord DwToHost(NetDWord dwNet) {
  104. HostDWord dwHost;
  105. unsigned char *uc = (unsigned char *)&dwNet;
  106. dwHost = ((unsigned long)(*uc++)) << 24;
  107. dwHost += ((unsigned long)(*uc++)) << 16;
  108. dwHost += ((unsigned long)(*uc++)) << 8;
  109. dwHost += (unsigned long)(*uc++);
  110. return dwHost;
  111. }
  112. #endif
  113. int 
  114. TestBigEndian(void)
  115. {
  116.     unsigned long test = 0x000000FF;
  117.     char *temp = (char *)&test;
  118.     /* on big endian machines, the first byte should be 0x00, on little endian 0xFF.*/
  119.     return (temp[0] == 0);
  120. }
  121. /*  Converts 2 byte ints from big endian to little endian or vice versa */
  122. void 
  123. SwapWordBytes(HostWord *data, int numInts)
  124. {
  125.     INT32     i;
  126.     INT16  temp;
  127.     char    *temp1, *temp2;
  128.     /* temp2 points to our temporary int that will hold the swapped bytes */
  129.     temp2 = (char *) &temp;
  130.     for(i = 0; i < numInts; i++)
  131.     {
  132. temp1 = (char *) &data[i];
  133.         temp2[0] = temp1[1];
  134. temp2[1] = temp1[0];
  135. data[i] = temp;
  136.     }
  137. }
  138. /*  Converts 4 byte ints from big endian to little endian or vice versa */
  139. void 
  140. SwapDWordBytes(HostDWord *data, int numInts)
  141. {
  142.     INT32     i,temp;
  143.     char    *temp1, *temp2;
  144.     /* temp2 points to our temporary int that will hold the swapped bytes */
  145.     temp2 = (char *) &temp;
  146.     for(i = 0; i < numInts; i++)
  147.     {
  148. temp1 = (char *) &data[i];
  149.         temp2[0] = temp1[3];
  150.         temp2[1] = temp1[2];
  151.         temp2[2] = temp1[1];
  152. temp2[3] = temp1[0];
  153. data[i] = temp;
  154.     }
  155. }
  156. /*
  157.  * IP domain addresses will NOT be recignized as valid addresses
  158.  * even if they are specified as "99.99.234" or "99.234"
  159.  */
  160. int
  161. IsNumericAddr(const char* addrStr, UINT32 size)
  162. {
  163.     // check the params
  164.     if (NULL == addrStr || 0 == size)
  165.     {
  166. return 0;
  167.     }
  168.     
  169.     const char* ptr = (addrStr && size) ? addrStr+size-1 : 0;
  170.     int len = (int)size;
  171.     int numericAddr = 0;
  172.     int dotCount = 0;
  173.     if (isdigit(*ptr))
  174.         numericAddr = 1;
  175.     while (--len)
  176.     {
  177.         if (*ptr == '.')
  178.             dotCount++;
  179.         else if (isalpha(*ptr))
  180.             numericAddr = 0;
  181.         --ptr;
  182.     }
  183.     return (dotCount == 3) ? numericAddr : 0;
  184. }
  185. void
  186. NetLongToAscii(UINT32 addr, IHXBuffer* pAddrBuf)
  187. {
  188.     char str[16]; /* Flawfinder: ignore */  // max addr string length + NULL -- "255.255.255.255"
  189.     char* ptr = (char *)str;
  190.     char* prevStrEnd = 0;
  191.     SafeSprintf(ptr, sizeof(str), "%lu", ((addr&0xff000000) >> 24));
  192.     ptr = (char *)memchr(str, 0, 16);
  193.     prevStrEnd = ptr;
  194.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", ((addr&0x00ff0000) >> 16));
  195.     ptr = (char *)memchr(prevStrEnd, 0, 16);
  196.     prevStrEnd = ptr;
  197.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", ((addr&0x0000ff00) >> 8));
  198.     ptr = (char *)memchr(prevStrEnd, 0, 16);
  199.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", (addr&0x000000ff));
  200.     pAddrBuf->Set((BYTE *)str, strlen(str)+1);
  201. }
  202. // takes the addr in HOST-byte order!!!
  203. // its too late in the cycle to make this fundamental a change
  204. // so we r keeping it the same
  205. char*
  206. HXInetNtoa(UINT32 addr)
  207. {
  208.     STATIC_CHAR_ARRAY(str, 16); /* Flawfinder: ignore */ // max addr string length + NULL -- "255.255.255.255"
  209.     char* ptr = (char *)str;
  210.     char* prevStrEnd = 0;
  211.     SafeSprintf(ptr, sizeof(str), "%lu", ((addr&0xff000000) >> 24));
  212.     ptr = (char *)memchr(str, 0, 16);
  213.     prevStrEnd = ptr;
  214.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", ((addr&0x00ff0000) >> 16));
  215.     ptr = (char *)memchr(prevStrEnd, 0, 16);
  216.     prevStrEnd = ptr;
  217.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", ((addr&0x0000ff00) >> 8));
  218.     ptr = (char *)memchr(prevStrEnd, 0, 16);
  219.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%lu", (addr&0x000000ff));
  220.     return str;
  221. }
  222. /*
  223. * ++Copyright++ 1983, 1990, 1993
  224. * -
  225. * Copyright (c) 1983, 1990, 1993
  226. *    The Regents of the University of California.  All rights reserved.
  227. * Redistribution and use in source and binary forms, with or without
  228. * modification, are permitted provided that the following conditions
  229. * are met:
  230. * 1. Redistributions of source code must retain the above copyright
  231. *    notice, this list of conditions and the following disclaimer.
  232. * 2. Redistributions in binary form must reproduce the above copyright
  233. *    notice, this list of conditions and the following disclaimer in the
  234. *    documentation and/or other materials provided with the distribution.
  235. * 3. All advertising materials mentioning features or use of this software
  236. *    must display the following acknowledgement:
  237. * This product includes software developed by the University of
  238. * California, Berkeley and its contributors.
  239. * 4. Neither the name of the University nor the names of its contributors
  240. *    may be used to endorse or promote products derived from this software
  241. *    without specific prior written permission.
  242. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  243. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  244. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  245. * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  246. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  247. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  248. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  249. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  250. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  251. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  252. * SUCH DAMAGE.
  253. * -
  254. * Portions Copyright (c) 1993 by Digital Equipment Corporation.
  255. * Permission to use, copy, modify, and distribute this software for any
  256. * purpose with or without fee is hereby granted, provided that the above
  257. * copyright notice and this permission notice appear in all copies, and that
  258. * the name of Digital Equipment Corporation not be used in advertising or
  259. * publicity pertaining to distribution of the document or software without
  260. * specific, written prior permission.
  261. * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  262. * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
  263. * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
  264. * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  265. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  266. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  267. * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  268. * SOFTWARE.
  269. * -
  270. * --Copyright--
  271. */
  272. /*
  273. * Ascii internet address interpretation routine.
  274. * The value returned is in network order.
  275. * Check whether "cp" is a valid ascii representation
  276. * of an Internet address and convert to a binary address.
  277. * Returns 1 if the address is valid, 0 if not.
  278. * This replaces inet_addr, the return value from which
  279. * cannot distinguish between failure and a local broadcast address.
  280. */
  281. UINT32
  282. HXinet_addr(const char* cp)
  283. {
  284.     UINT32 val = 0;
  285.     int base = 0, n = 0;
  286.     char c;
  287.     UINT parts[4];
  288.     UINT *pp = parts;
  289.     c = *cp;
  290.     for (;;) 
  291.     {
  292. /*
  293. * Collect number up to ``.''.
  294. * Values are specified as for C:
  295. * 0x=hex, 0=octal, isdigit=decimal.
  296. */
  297. if (!isdigit(c))
  298.     return (INADDR_NONE);
  299. val = 0; base = 10;
  300. if (c == '0') 
  301. {
  302.     c = *++cp;
  303.     if (c == 'x' || c == 'X')
  304.     {
  305. base = 16, c = *++cp;
  306.     }
  307.     else
  308.     {
  309. base = 8;
  310.     }
  311. }
  312. for (;;) 
  313. {
  314.     if (isascii(c) && isdigit(c)) 
  315.     {
  316. val = (val * base) + (c - '0');
  317. c = *++cp;
  318.     } 
  319.     else if (base == 16 && isascii(c) && isxdigit(c)) 
  320.     {
  321. val = (val << 4) | (c + 10 - (islower(c) ? 'a' : 'A'));
  322. c = *++cp;
  323.     } 
  324.     else
  325.     {
  326. break;
  327.     }
  328. }
  329. if (c == '.') 
  330. {
  331.     /*
  332.     * Internet format:
  333.     * a.b.c.d
  334.     * a.b.c (with c treated as 16 bits)
  335.     * a.b (with b treated as 24 bits)
  336.     */
  337.     if (pp >= parts + 3)
  338.     {
  339. return (INADDR_NONE);
  340.     }
  341.     *pp++ = val;
  342.     c = *++cp;
  343. else
  344. {
  345.     break;
  346. }
  347.     }
  348.     /*
  349.     * Check for trailing characters.
  350.     */
  351.     if (c != '' && (!isascii(c) || !isspace(c)))
  352.     {
  353. return (INADDR_NONE);
  354.     }
  355.     /*
  356.     * Concoct the address according to
  357.     * the number of parts specified.
  358.     */
  359.     n = pp - parts + 1;
  360.     switch (n) 
  361.     {
  362. case 0:
  363.     return (INADDR_NONE); /* initial nondigit */
  364. case 1: /* a -- 32 bits */
  365.     break;
  366. case 2: /* a.b -- 8.24 bits */
  367.     if (val > 0xffffff)
  368. return (INADDR_NONE);
  369.     val |= parts[0] << 24;
  370.     break;
  371. case 3: /* a.b.c -- 8.8.16 bits */
  372.     if (val > 0xffff)
  373. return (INADDR_NONE);
  374.     val |= (parts[0] << 24) | (parts[1] << 16);
  375.     break;
  376. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  377.     if (val > 0xff)
  378. return (INADDR_NONE);
  379.     val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  380.     break;
  381.     }
  382.     return DwToNet(val);
  383. }
  384. // to store actual netbyte order of bytes in a string
  385. // on a little endian machine basically swap the bytes
  386. char*
  387. NetLongAddrToDecimalStr(ULONG32 ulAddr)
  388. {
  389.     STATIC_CHAR_ARRAY(str, 11);/* Flawfinder: ignore */ // max decimal digits (4 Gig) for a 4-byte number
  390.     unsigned long test = 0x000000FF;
  391.     char *temp = (char *)&test;
  392.     if (temp[0] != 0x0) // big-endian
  393.     {
  394. ULONG32 addr = 0;
  395. char* temp1 = (char *)&addr;
  396. temp = (char *)&ulAddr;
  397. temp1[0] = temp[3];
  398. temp1[1] = temp[2];
  399. temp1[2] = temp[1];
  400. temp1[3] = temp[0];
  401. SafeSprintf(str, sizeof(str), "%lu", (unsigned long)addr);
  402.     }
  403.     else
  404.     {
  405. SafeSprintf(str, sizeof(str), "%lu", (unsigned long)ulAddr);
  406.     }
  407.     return str;
  408. }
  409. char*
  410. NetLongToAsciiStr(UINT32 addr)
  411. {
  412.     STATIC_CHAR_ARRAY(str, 16);/* Flawfinder: ignore */ // max addr string length + NULL -- "255.255.255.255"
  413.     UCHAR* tmp = (UCHAR *)&addr;
  414.     char* ptr = (char *)str;
  415.     char* prevStrEnd = 0;
  416.     SafeSprintf(ptr, sizeof(str), "%u", tmp[0]);
  417.     ptr = (char *)memchr(str, 0, 16);
  418.     prevStrEnd = ptr;
  419.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%u", tmp[1]);
  420.     ptr = (char *)memchr(str, 0, 16);
  421.     prevStrEnd = ptr;
  422.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%u", tmp[2]);
  423.     ptr = (char *)memchr(str, 0, 16);
  424.     prevStrEnd = ptr;
  425.     SafeSprintf(ptr, sizeof(str)-(ptr-str), ".%u", tmp[3]);
  426.     return str;
  427. }