method_uname.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: method_uname.c,v 1.26 1999/05/25 17:22:32 michaels Exp $";
  46. int
  47. clientmethod_uname(s, host, version)
  48. int s;
  49. const struct sockshost_t *host;
  50. int version;
  51. {
  52. const char *function = "clientmethod_uname()";
  53. static struct uname_t uname; /* cached userinfo. */
  54. static struct sockshost_t unamehost; /* host cache was gotten for. */
  55. static int unameisok; /* cached data is ok? */
  56. char *offset, *name, *password;
  57. char request[ 1 /* version. */
  58. + 1 /* username length. */
  59. + MAXNAMELEN /* username. */
  60. + 1 /* password length. */
  61. + MAXPWLEN /* password. */
  62. ];
  63. char response[ 1 /* version. */
  64. + 1 /* status. */
  65. ];
  66. if (memcmp(&unamehost, host, sizeof(unamehost)) != 0)
  67. unameisok = 0; /* not same host as cache was gotten for. */
  68. switch (version) {
  69. case SOCKS_V5:
  70. break;
  71. default:
  72. SERRX(version);
  73. }
  74. /* fill in request. */
  75. offset = request;
  76. *offset++ = (char)SOCKS_UNAMEVERSION;
  77. if (!unameisok) {
  78. if ((name = socks_getusername(host, offset + 1, MAXNAMELEN)) == NULL) {
  79. swarnx("%s: could not determine username of client", function);
  80. return -1;
  81. }
  82. SASSERTX(strlen(name) < sizeof(uname.name));
  83. strcpy(uname.name, name);
  84. }
  85. else {
  86. name = uname.name;
  87. strcpy(offset + 1, name);
  88. }
  89. /* first byte gives length. */
  90. *offset = (char)strlen(name);
  91. OCTETIFY(*offset);
  92. offset += *offset + 1;
  93. if (!unameisok) {
  94. if ((password = socks_getpassword(host, name, offset + 1, MAXPWLEN))
  95. == NULL) {
  96. swarnx("%s: could not determine password of client", function);
  97. return -1;
  98. }
  99. SASSERTX(strlen(password) < sizeof(uname.password));
  100. strcpy(uname.password, password);
  101. }
  102. else {
  103. password = uname.password;
  104. strcpy(offset + 1, password);
  105. }
  106. /* first byte gives length. */
  107. *offset = (char)strlen(password);
  108. OCTETIFY(*offset);
  109. offset += *offset + 1;
  110. if (writen(s, request, (size_t)(offset - request)) != offset - request) {
  111. swarn("%s: writen()", function);
  112. return -1;
  113. }
  114. if (readn(s, response, sizeof(response)) != sizeof(response)) {
  115. swarn("%s: readn()", function);
  116. return -1;
  117. }
  118. if (request[UNAME_VERSION] != response[UNAME_VERSION]) {
  119. swarnx("%s: sent v%d, got v%d",
  120. function, request[UNAME_VERSION], response[UNAME_VERSION]);
  121. return -1;
  122. }
  123. if (response[UNAME_STATUS] == 0) { /* server accepted. */
  124. unamehost = *host;
  125. unameisok = 1;
  126. }
  127. return response[UNAME_STATUS];
  128. }