Rgetsockname.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0349 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. #include "common.h"
  44. static const char rcsid[] =
  45. "$Id: Rgetsockname.c,v 1.31 1999/09/02 10:41:20 michaels Exp $";
  46. int
  47. Rgetsockname(s, name, namelen)
  48. int s;
  49. struct sockaddr *name;
  50. socklen_t *namelen;
  51. {
  52. const char *function = "Rgetsockname()";
  53. struct socksfd_t *socksfd;
  54. struct sockaddr *addr;
  55. if (!socks_addrisok((unsigned int)s)) {
  56. socks_rmaddr((unsigned int)s);
  57. return getsockname(s, name, namelen);
  58. }
  59. socksfd = socks_getaddr((unsigned int)s);
  60. SASSERTX(socksfd != NULL);
  61. switch (socksfd->state.command) {
  62. case SOCKS_CONNECT:
  63. if (socksfd->state.inprogress) {
  64. if (socksfd->state.err != 0) /* connect failed. */
  65. errno = socksfd->state.err;
  66. else
  67. errno = EINPROGRESS;
  68. return -1;
  69. }
  70. addr = &socksfd->remote;
  71. /* LINTED pointer casts may be troublesome */
  72. if (!ADDRISBOUND(addr)) {
  73. SWARNX(0);
  74. errno = EADDRNOTAVAIL;
  75. return -1;
  76. }
  77. break;
  78. case SOCKS_BIND:
  79. addr = &socksfd->remote;
  80. break;
  81. case SOCKS_UDPASSOCIATE:
  82. swarnx("%s: getsockname() on udp sockets is not supported,n"
  83.  "contact Inferno Nettverk A/S for more information", function);
  84. /*
  85.  * some clients might call this for no good reason, try to
  86.  * help them by returning a invalid address; if they are
  87.  * going to use it for anything, they will fail later though.
  88.  */
  89. addr = &socksfd->remote;
  90. /* LINTED pointer casts may be troublesome */
  91. ((struct sockaddr_in *)addr)->sin_family = AF_INET;
  92. /* LINTED pointer casts may be troublesome */
  93. ((struct sockaddr_in *)addr)->sin_addr.s_addr = htonl(INADDR_ANY);
  94. /* LINTED pointer casts may be troublesome */
  95. ((struct sockaddr_in *)addr)->sin_port = htons(0);
  96. break;
  97. default:
  98. SERRX(socksfd->state.command);
  99. }
  100. *namelen = MIN(*namelen, sizeof(*addr));
  101. memcpy(name, addr, (size_t)*namelen);
  102. return 0;
  103. }