get_myaddr.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* get_myaddress.c - get client's IP address via ioctl */
  2. /* Copyright 1989-2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /* @(#)get_myaddress.c 2.1 88/07/29 4.0 RPCSRC */
  5. /*
  6.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  7.  * unrestricted use provided that this legend is included on all tape
  8.  * media and as a part of the software program in whole or part.  Users
  9.  * may copy or modify Sun RPC without charge, but are not authorized
  10.  * to license or distribute it to anyone else except as part of a product or
  11.  * program developed by the user.
  12.  *
  13.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  14.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  16.  *
  17.  * Sun RPC is provided with no support and without any obligation on the
  18.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  19.  * modification or enhancement.
  20.  *
  21.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  22.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  23.  * OR ANY PART THEREOF.
  24.  *
  25.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  26.  * or profits or other special, indirect and consequential damages, even if
  27.  * Sun has been advised of the possibility of such damages.
  28.  *
  29.  * Sun Microsystems, Inc.
  30.  * 2550 Garcia Avenue
  31.  * Mountain View, California  94043
  32.  */
  33. #if !defined(lint) && defined(SCCSIDS)
  34. /* static char sccsid[] = "@(#)get_myaddress.c 1.4 87/08/11 Copyr 1984 Sun Micro"; */
  35. #endif
  36. /*
  37. modification history
  38. --------------------
  39. 01g,18apr00,ham  fixed compilation warnings.  
  40. 01f,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  41. 01e,26may92,rrr  the tree shuffle
  42.   -changed includes to have absolute path from h/
  43. 01d,04oct91,rrr  passed through the ansification filter
  44.   -added include "rpc/xdr.h"
  45.   -changed includes to have absolute path from h/
  46.   -changed copyright notice
  47. 01c,18may91,hjb  included vxWorks.h
  48. 01b,19apr90,hjb  de-linted.
  49. 01a,11jul89,hjb  first VxWorks version for RPC 4.0 upgrade
  50. */
  51. /*
  52.  * get_myaddress.c
  53.  *
  54.  * Get client's IP address via ioctl.  This avoids using the yellowpages.
  55.  * Copyright (C) 1984, Sun Microsystems, Inc.
  56.  */
  57. #include "vxWorks.h"
  58. #include "stdio.h"
  59. #include "ioLib.h"
  60. #include "rpc/rpctypes.h"
  61. #include "rpc/xdr.h"
  62. #include "rpc/pmap_prot.h"
  63. #include "sys/socket.h"
  64. #include "sockLib.h"
  65. #include "net/if.h"
  66. #include "sys/ioctl.h"
  67. #include "netinet/in.h"
  68. #include "taskLib.h"
  69. #ifdef BUFSIZ
  70. #undef BUFSIZ
  71. #endif
  72. #define BUFSIZ 1024
  73. #define SOCKSIZ 40
  74. /*
  75.  * don't use gethostbyname, which would invoke yellow pages
  76.  */
  77. void
  78. get_myaddress(addr)
  79. struct sockaddr_in *addr;
  80. {
  81. int s;
  82. char buf[BUFSIZ], ifreqBuf [SOCKSIZ];
  83. struct ifconf ifc;
  84. struct ifreq * ifr;
  85. int len;
  86. if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  87.     perror("get_myaddress: socket");
  88.     taskSuspend (0);
  89. }
  90. ifc.ifc_len = sizeof (buf);
  91. ifc.ifc_buf = buf;
  92. if (ioctl (s, SIOCGIFCONF, (int)&ifc) < 0) {
  93. perror("get_myaddress: ioctl (get interface configuration)");
  94. taskSuspend (0);
  95. }
  96. ifr = ifc.ifc_req;
  97. for (len = ifc.ifc_len; len; len -= (sizeof(ifr->ifr_name) + 
  98.      ifr->ifr_addr.sa_len))
  99.     {
  100.     bcopy ((caddr_t)ifr, ifreqBuf, (sizeof(ifr->ifr_name) + 
  101.     ifr->ifr_addr.sa_len)); 
  102. if (ioctl(s, SIOCGIFFLAGS, (int)ifreqBuf) < 0) {
  103. perror("get_myaddress: ioctl");
  104. taskSuspend (0);
  105. }
  106. if ((((struct ifreq *)ifreqBuf)->ifr_flags & IFF_UP) &&
  107.     ifr->ifr_addr.sa_family == AF_INET) {
  108. *addr = *((struct sockaddr_in *)&ifr->ifr_addr);
  109. addr->sin_port = htons((u_short) PMAPPORT);
  110. break;
  111. }
  112. ifr = (struct ifreq *)((char *)ifr + (sizeof(ifr->ifr_name) + 
  113.      ifr->ifr_addr.sa_len));
  114.     }
  115. (void) close(s);
  116. }