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

代理服务器

开发平台:

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. /* $Id: common.h,v 1.218 1999/12/22 09:29:19 karls Exp $ */
  44. #ifndef _COMMON_H_
  45. #define _COMMON_H_
  46. #endif
  47. /* XXX ifdef, not if, defined on command line */
  48. #ifdef HAVE_CONFIG_H
  49. #include "autoconf.h"
  50. #endif  /* HAVE_CONFIG_H */
  51. #include <sys/types.h>
  52. #include <sys/time.h>
  53. #if HAVE_SYS_FILE_H
  54. #include <sys/file.h>
  55. #endif  /* HAVE_SYS_FILE_H */
  56. #include <sys/resource.h>
  57. #include <sys/ioctl.h>
  58. #include <sys/ipc.h>
  59. #include <sys/sem.h>
  60. /* XXX This is a hack. Avoid transparent sockaddr union used in linux
  61.    to avoid the use of the union in the code. Mainly used in
  62.    interposition.c*/
  63. #ifdef WE_DONT_WANT_NO_SOCKADDR_ARG_UNION
  64. #ifdef __GNUC__
  65. #define __HAD_GNUC __GNUC__
  66. #undef __GNUC__
  67. #endif  /* __GNUC__ */
  68. #endif  /* WE_DONT_WANT_NO_SOCKADDR_ARG_UNION */
  69. #include <sys/socket.h>
  70. #ifdef __HAD_GNUC
  71. #define __GNUC__ __HAD_GNUC
  72. #endif  /* __HAD_GNUC */
  73. #if NEED_SYS_SOCKIO_H
  74. #include <sys/sockio.h>
  75. #endif /* NEED_SYS_SOCKIO_H */
  76. #include <sys/mman.h>
  77. #include <sys/un.h>
  78. #include <sys/stat.h>
  79. #include <sys/uio.h>
  80. #include <sys/wait.h>
  81. #include <netinet/in.h>
  82. #if HAVE_NETINET_IP_H
  83. #include <netinet/ip.h>
  84. #endif  /* HAVE_NETINET_IP_H */
  85. #if HAVE_NETINET_IP_VAR_H
  86. #include <netinet/ip_var.h>
  87. #endif  /* HAVE_NETINET_IP_VAR_H */
  88. #include <arpa/inet.h>
  89. #include <arpa/nameser.h>
  90. #include <assert.h>
  91. #if HAVE_CRYPT_H
  92. #include <crypt.h>
  93. #endif  /* HAVE_CRYPT_H */
  94. #include <ctype.h>
  95. #ifdef SOCKSLIBRARY_DYNAMIC
  96. #include <dlfcn.h>
  97. #endif  /* SOCKSLIBRARY_DYNAMIC */
  98. #include <errno.h>
  99. #include <fcntl.h>
  100. #if HAVE_LIMITS_H
  101. #include <limits.h>
  102. #endif  /* HAVE_LIMITS_H */
  103. #include <netdb.h>
  104. #include <pwd.h>
  105. #include <setjmp.h>
  106. #include <signal.h>
  107. #ifdef STDC_HEADERS
  108. #include <stdarg.h>
  109. #else
  110. #include <varargs.h>
  111. #endif  /* STDC_HEADERS */
  112. #include <stdio.h>
  113. #include <stdlib.h>
  114. #if HAVE_STRINGS_H
  115. #include <strings.h>
  116. #endif  /* HAVE_STRINGS_H */
  117. #if STDC_HEADERS
  118. #include <string.h>
  119. #endif  /* STDC_HEADERS */
  120. #include <syslog.h>
  121. #if HAVE_LIBWRAP && HAVE_TCPD_H
  122. #include <tcpd.h>
  123. #endif  /* HAVE_LIBWRAP && HAVE_TCPD_H */
  124. #include <time.h>
  125. #if HAVE_UNISTD_H
  126. #ifdef HAVE_DEC_PROTO
  127. #undef  _XOPEN_SOURCE_EXTENDED
  128. #endif  /* HAVE_DEC_PROTO */
  129. #include <unistd.h>
  130. #ifdef HAVE_DEC_PROTO
  131. #define _XOPEN_SOURCE_EXTENDED
  132. #endif /* HAVE_DEC_PROTO */
  133. #endif  /* HAVE_UNISTD_H */
  134. #include <resolv.h>
  135. #include "yacconfig.h"
  136. #ifdef lint
  137. extern const int lintnoloop_common_h;
  138. #else
  139. #define lintnoloop_common_h 0
  140. #endif
  141. #include "config.h"
  142. #define SOCKS_TRYHARDER 0 /* XXX BUGS */ /* XXX should be configure option. */
  143. #ifndef RLIMIT_OFILE
  144. #define RLIMIT_OFILE RLIMIT_NOFILE
  145. #endif /* !RLIMIT_OFILE */
  146. #if NEED_GETSOCKOPT_CAST
  147. #define getsockopt(a,b,c,d,e) getsockopt((a),(b),(c),(char *)(d),(e))
  148. #define setsockopt(a,b,c,d,e) setsockopt((a),(b),(c),(char *)(d),(e))
  149. #endif  /* NEED_GETSOCKOPT_CAST */
  150. #if !HAVE_BZERO
  151. #define bzero(b, len) memset(b, 0, len)
  152. #endif  /* !HAVE_BZERO */
  153. #if !HAVE_SIG_ATOMIC_T
  154. typedef int sig_atomic_t;
  155. #endif  /* !HAVE_SIG_ATOMIC_T */
  156. #ifdef DIAGNOSTIC
  157. #undef DIAGNOSTIC
  158. #define DIAGNOSTIC 1
  159. #else
  160. #define DIAGNOSTIC 0
  161. #endif
  162. #ifdef DEBUG
  163. #undef DEBUG
  164. #define DEBUG 1
  165. #else
  166. #define DEBUG 0
  167. #endif
  168. #if DEBUG
  169. #if !DIAGNOSTIC
  170. #undef DIAGNOSTIC
  171. #define DIAGNOSTIC 1
  172. #endif  /* !DIAGNOSTIC */
  173. /*
  174.  * solaris 2.5.1 and it's stream stuff is broken and puts the processes
  175.  * into never-never land forever on half the sendmsg() calls if they
  176.  * involve ancillary data.  (it seems to deadlock the processes.)
  177.  */
  178. #ifndef HAVE_SENDMSG_DEADLOCK
  179. #define HAVE_SENDMSG_DEADLOCK 1
  180. #endif
  181. #ifndef HAVE_ACCEPTLOCK
  182. #define HAVE_ACCEPTLOCK 1
  183. #endif
  184. #endif  /* DEBUG */
  185. /* __P and __BEGIN_DECLS definitions taken from libtool manual */
  186. #undef __BEGIN_DECLS
  187. #undef __END_DECLS
  188. #ifdef __cplusplus
  189. # define __BEGIN_DECLS extern "C" {
  190. # define __END_DECLS }
  191. #else
  192. # define __BEGIN_DECLS /* empty */
  193. # define __END_DECLS /* empty */
  194. #endif
  195. #undef __P
  196. #if defined (__STDC__) || defined (_AIX) 
  197. || (defined (__mips) && defined (_SYSTYPE_SVR4)) 
  198. || defined(WIN32) || defined(__cplusplus)
  199. # define __P(protos) protos
  200. #else
  201. # define __P(protos) ()
  202. #endif
  203. #if SIZEOF_CHAR == 1
  204.  typedef unsigned char ubits_8;
  205.  typedef          char sbits_8;
  206. #else
  207. error "no known 8 bits wide datatype"
  208. #endif
  209. #if SIZEOF_SHORT == 2
  210.  typedef unsigned short ubits_16;
  211.  typedef          short sbits_16;
  212. #else
  213. # if SIZEOF_INT == 2
  214.   typedef unsigned int ubits_16;
  215.   typedef          int sbits_16;
  216. # else
  217. error "no known 16 bits wide datatype"
  218. # endif
  219. #endif
  220. #if SIZEOF_INT == 4
  221.  typedef unsigned int ubits_32;
  222.  typedef          int sbits_32;
  223. #else
  224. # if SIZEOF_SHORT == 4
  225.    typedef unsigned short ubits_32;
  226.    typedef          short sbits_32;
  227. # else
  228. #  if SIZEOF_LONG == 4
  229.     typedef unsigned long ubits_32;
  230.     typedef          long sbits_32;
  231. #  else
  232. error "no known 32 bits wide datatype"
  233. #  endif /* SIZEOF_LONG == 4 */
  234. # endif /* SIZEOF_SHORT == 4 */
  235. #endif /* SIZEOF_INT == 4 */
  236. #ifndef INADDR_NONE
  237. # define INADDR_NONE (ubits_32) 0xffffffff
  238. #endif  /* !INADDR_NONE */
  239. #ifndef MAX
  240. # define MAX(a,b) ((a) > (b) ? (a) : (b))
  241. #endif /* !MAX */
  242. #ifndef MIN
  243. # define MIN(a,b) ((a) < (b) ? (a) : (b))
  244. #endif /* !MIN */
  245. #if NEED_EXIT_FAILURE
  246. /* XXX assumes EXIT_SUCCESS is undefined too */
  247. #define EXIT_SUCCESS 0
  248. #define EXIT_FAILURE 1
  249. #endif /* NEED_EXIT_FAILURE */
  250. #if NEED_SA_RESTART
  251. #define SA_RESTART SV_INTERRUPT
  252. #endif  /* NEED_SA_RESTART */
  253. #if NEED_AF_LOCAL
  254. #define AF_LOCAL AF_UNIX
  255. #endif  /* NEED_AF_LOCAL */
  256. #if HAVE_NOMALLOC_REALLOC
  257. #define realloc(p,s) (((p) == NULL) ? (malloc(s)) : (realloc((p),(s))))
  258. #endif  /* HAVE_NOMALLOC_REALLOC */
  259. #if HAVE_NONULL_FREE
  260. #define free(p) (((p) == NULL) ? ((void)(p)) : (free(p)))
  261. #endif
  262. /* __CONCAT macro from anoncvs */
  263. #ifndef __CONCAT
  264. #if defined(__STDC__) || defined(__cplusplus)
  265. #define __CONCAT(x,y)    x ## y
  266. #else
  267. #define __CONCAT(x,y)    x/**/y
  268. #endif
  269. #endif
  270. #if !HAVE_STRUCT_IPOPTS
  271. #define MAX_IPOPTLEN 40
  272. struct ipoption {
  273. struct in_addr ipopt_dst;
  274. sbits_8 ipopt_list[MAX_IPOPTLEN];
  275. };
  276. #endif  /* !HAVE_STRUCT_IPOPTS */
  277. /* global variables needed by everyone. */
  278. extern struct config_t config;
  279. extern char *__progname;
  280. #if !HAVE_H_ERRNO
  281. extern int h_errno;
  282. #endif  /* !HAVE_H_ERRNO */
  283. /*
  284.  * defines
  285. */
  286. /*
  287.  * redefine system limits to match that of socks protocol.
  288.  * No need for these to be bigger than protocol allows, but they
  289.  * _must_ be atleast as big as protocol allows.
  290.  */
  291. #ifdef MAXHOSTNAMELEN
  292. #undef MAXHOSTNAMELEN
  293. #endif
  294. #define MAXHOSTNAMELEN (255 + 1) /* socks5: 255, +1 for len. */
  295. #ifdef MAXNAMELEN
  296. #undef MAXNAMELEN
  297. #endif
  298. #define MAXNAMELEN (255 + 1) /* socks5: 255, +1 for len. */
  299. #ifdef MAXPWLEN
  300. #undef MAXPWLEN
  301. #endif
  302. #define MAXPWLEN (255 + 1) /* socks5: 255, +1 for len. */
  303. /* "255." "255." "255." "255" "." "65535" + NUL */
  304. #define MAXSOCKADDRSTRING  (4   +   4   + 4   +  3  + 1 +    5   + 1)
  305. /*    "." + "65535" + NUL */
  306. #define MAXSOCKSHOSTSTRING (MAXHOSTNAMELEN + 1  +    5)
  307. #define MAXRULEADDRSTRING  (MAXSOCKSHOSTSTRING * 2)
  308. #ifndef NUL
  309. #define NUL ''
  310. #endif
  311. /*
  312.  * We don't care whether it's called O_NONBLOCK, FNDELAY or whatever.
  313.  * We just want to know whether the flags set give blocking or nonblocking
  314.  * semantics.
  315.  */
  316. #ifndef FNDELAY
  317. #define NONBLOCKING (O_NONBLOCK | O_NDELAY)
  318. #else
  319. #define NONBLOCKING (O_NONBLOCK | FNDELAY | O_NDELAY)
  320. #endif
  321. #define CONFIGTYPE_SERVER 1
  322. #define CONFIGTYPE_CLIENT 2
  323. #define PROTOCOL_TCPs "tcp"
  324. #define PROTOCOL_UDPs "udp"
  325. #define PROTOCOL_UNKNOWNs "unknown"
  326. #define RESOLVEPROTOCOL_UDP 0
  327. #define RESOLVEPROTOCOL_TCP 1
  328. #define RESOLVEPROTOCOL_FAKE 2
  329. #define LOGTYPE_SYSLOG 0x1
  330. #define LOGTYPE_FILE 0x2
  331. #define NOMEM "<memory exhausted>"
  332. /*
  333.  * macros
  334. */
  335. #define close(n) closen(n)
  336. #define PORTISRESERVED(port)
  337. (ntohs((port)) != 0 && ntohs((port)) < IPPORT_RESERVED)
  338. #define ADDRISBOUND(addr) 
  339. ((((struct sockaddr_in *)(&addr))->sin_addr.s_addr != htonl(INADDR_ANY)) 
  340. || (((struct sockaddr_in *)(&addr))->sin_port != htons(0)))
  341. #define ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
  342. #if UCHAR_MAX > 0xff
  343. #define OCTETIFY(a) ((a) = ((a) & 0xff))
  344. #else
  345. #define OCTETIFY(a) ((a) = (a))
  346. #endif
  347. /*
  348.  * Note that it's the argument that will be truncated, not just the
  349.  * returnvalue.
  350.  */
  351. /*
  352.  * macros to manipulate ancillary data depending on if were on sysv or bsd.
  353.  */
  354. /* allocate memory for data.  "size" is the amount of memory to allocate. */
  355. #if HAVE_CMSGHDR
  356. #define CMSG_AALLOC(size) 
  357. union { 
  358. char cmsgmem[sizeof(struct cmsghdr) + (size)]; 
  359. struct cmsghdr align; 
  360. } cmsgmem; 
  361. struct cmsghdr *cmsg = &cmsgmem.align
  362. #else /* !HAVE_CMSGHDR */
  363. #define CMSG_AALLOC(size) 
  364. char cmsgmem[(size)]
  365. #endif /* !HAVE_CMSGHDR */
  366. /*
  367.  * add a object to data.  "object" is the object to add to data at
  368.  * offset "offset".
  369.  */
  370. #if HAVE_CMSGHDR
  371. #define CMSG_ADDOBJECT(object, offset) 
  372. do 
  373. memcpy(CMSG_DATA(cmsg) + (offset), &(object), sizeof(object)); 
  374. while (lintnoloop_common_h)
  375. #else /* !HAVE_CMSGHDR */
  376. #define CMSG_ADDOBJECT(object, offset) 
  377. do 
  378. memcpy(cmsgmem + (offset), &(object), sizeof((object))); 
  379. while (lintnoloop_common_h)
  380. #endif /* !HAVE_CMSGHDR */
  381. /*
  382.  * get a object from data.  "object" is the object to get from data at
  383.  * offset "offset".
  384.  */
  385. #if HAVE_CMSGHDR
  386. #define CMSG_GETOBJECT(object, offset) 
  387. do 
  388. memcpy(&(object), CMSG_DATA(cmsg) + (offset), sizeof((object))); 
  389. while (lintnoloop_common_h)
  390. #else /* !HAVE_CMSGHDR */
  391. #define CMSG_GETOBJECT(object, offset) 
  392. do 
  393. memcpy(&(object), cmsgmem + (offset), sizeof((object))); 
  394. while (lintnoloop_common_h)
  395. #endif /* !HAVE_CMSGHDR */
  396. /* set cmsg for sending */
  397. #if HAVE_CMSGHDR
  398. #define CMSG_SETHDR_SEND(size) 
  399. do { 
  400. cmsg->cmsg_level = SOL_SOCKET; 
  401. cmsg->cmsg_type = SCM_RIGHTS; 
  402. cmsg->cmsg_len = sizeof(struct cmsghdr) + (size); 
  403. msg.msg_control = (caddr_t)cmsg; 
  404. msg.msg_controllen = cmsg->cmsg_len; 
  405. } while (lintnoloop_common_h)
  406. #else /* !HAVE_CMSGHDR */
  407. #define CMSG_SETHDR_SEND(size) 
  408. do { 
  409. msg.msg_accrights = (caddr_t)cmsgmem; 
  410. msg.msg_accrightslen = (size); 
  411. } while (lintnoloop_common_h)
  412. #endif /* !HAVE_CMSGHDR */
  413. /* set cmsg for receiving */
  414. #if HAVE_CMSGHDR
  415. #define CMSG_SETHDR_RECV(size) 
  416. do { 
  417. msg.msg_control = (caddr_t)cmsg; 
  418. msg.msg_controllen = (size); 
  419. } while (lintnoloop_common_h)
  420. #else /* !HAVE_CMSGHDR */
  421. #define CMSG_SETHDR_RECV(size) 
  422. do { 
  423. msg.msg_accrights = (caddr_t)cmsgmem; 
  424. msg.msg_accrightslen = (size); 
  425. } while (lintnoloop_common_h)
  426. #endif /* !HAVE_CMSGHDR */
  427. /* returns length of controldata actually sent. */
  428. #if HAVE_CMSGHDR
  429. #define CMSG_GETLEN(msg) (msg.msg_controllen - sizeof(struct cmsghdr))
  430. #else
  431. #define CMSG_GETLEN(msg) (msg.msg_accrightslen)
  432. #endif
  433. #define INTERNAL_ERROR 
  434. "an internal error was detected at %s:%dnvalue = %ld, version = %s"
  435. #define SASSERT(expression)
  436. do {
  437. if (!(expression))
  438. SERR(expression);
  439. } while (lintnoloop_common_h)
  440. #define SASSERTX(expression)
  441. do {
  442. if (!(expression))
  443. SERRX(expression);
  444. } while (lintnoloop_common_h)
  445. /*
  446.  * wrappers around err()/errx()/warn()/warnx() for more consistent error
  447.  * messages.
  448.  * "failure" is the value that was wrong and which caused the internal error.
  449.  */
  450. #define SERR(failure)
  451. do {
  452. SWARN(failure);
  453. abort();
  454. } while (lintnoloop_common_h)
  455. #define SERRX(failure)
  456. do {
  457. SWARNX(failure);
  458. abort();
  459. } while (lintnoloop_common_h)
  460. #define SWARN(failure)
  461. swarn(INTERNAL_ERROR,
  462. __FILE__, __LINE__, (long int)(failure), rcsid)
  463. #define SWARNX(failure)
  464. swarnx(INTERNAL_ERROR,
  465. __FILE__, __LINE__, (long int)(failure), rcsid)
  466. #define ERR(failure)
  467. do {
  468. warn(INTERNAL_ERROR, __FILE__, __LINE__,
  469. (long int)(failure), rcsid);
  470. abort();
  471. } while (p)
  472. #define ERRX(failure)
  473. do {
  474. warnx(INTERNAL_ERROR, __FILE__, __LINE__, 
  475. (long int)(failure), rcsid);
  476. abort();
  477. } while (lintnoloop_common_h)
  478. #define WARN(failure) 
  479. warn(INTERNAL_ERROR, __FILE__, __LINE__, (long int)(failure), rcsid)
  480. #define WARNX(failure) 
  481. warnx(INTERNAL_ERROR, __FILE__, __LINE__, (long int)(failure), rcsid)
  482. #define ERRORMSG(failure) 
  483. error_msg(LOG_HIGH, INTERNAL_ERROR, __FILE__, __LINE__, (long int)(failure),
  484. rcsid)
  485. /* the size of a udp header "packet" (no padding) */
  486. #define PACKETSIZE_UDP(packet) (
  487. sizeof((packet)->flag) + sizeof((packet)->frag)
  488. + sizeof((packet)->host.atype) + sizeof((packet)->host.port)
  489. + (ADDRESSIZE_V5(packet)))
  490. /*
  491.  * returns the length of the current address field in socks packet "packet".
  492.  * "packet" can be one of pointer to response_t, request_t or udpheader_t.
  493.  */
  494. #define ADDRESSIZE(packet) ( 
  495.   ((packet)->version == SOCKS_V4 ? 
  496.   (ADDRESSIZE_V4(packet)) : (ADDRESSIZE_V5(packet))))
  497. /*
  498.  * version specifics
  499.  */
  500. #define ADDRESSIZE_V5(packet) (
  501.   (packet)->host.atype == SOCKS_ADDR_IPV4 ?
  502.   sizeof((packet)->host.addr.ipv4) :(packet)->host.atype == SOCKS_ADDR_IPV6 ?
  503.   sizeof((packet)->host.addr.ipv6) : (strlen((packet)->host.addr.domain) + 1))
  504. #define ADDRESSIZE_V4(packet) ( 
  505. (packet)->atype == SOCKS_ADDR_IPV4 ? 
  506. sizeof((packet)->addr.ipv4) : (strlen((packet)->addr.host) + 1))
  507. /*
  508.  * This is for Rgethostbyname() support for clients without access to
  509.  * dns.
  510.  * FAKEIP_START is the first address in the range of "fake" ip addresses,
  511.  * FAKEIP_END is the last.
  512.  * There can thus be FAKEIP_END - FAKEIP_START number of fake ip addresses
  513.  * supported per program.
  514.  *
  515.  * INADDR_NONE and INADDR_ANY may not be part of the range.
  516.  */
  517. #define FAKEIP_START 0x00000001
  518. #define FAKEIP_END 0x000000ff
  519. #define SOCKS_V4 4
  520. #define SOCKS_V4REPLY_VERSION 0
  521. #define SOCKS_V5 5
  522. #define MSPROXY_V2 2
  523. /* subnegotiation. */
  524. #define SOCKS_UNAMEVERSION 1
  525. /* authentication METHOD values. */
  526. #define AUTHMETHOD_NONE 0
  527. #define AUTHMETHOD_NONEs "none"
  528. #define AUTHMETHOD_GSSAPI 1
  529. #define AUTHMETHOD_GSSAPIs "gssapi"
  530. #define AUTHMETHOD_UNAME 2
  531. #define AUTHMETHOD_UNAMEs "username"
  532. /* X'03' to X'7F' IANA ASSIGNED */
  533. /* X'80' to X'FE' RESERVED FOR PRIVATE METHODS */
  534. #define AUTHMETHOD_NOACCEPT 255
  535. #define AUTHMETHOD_NOACCEPTs "no acceptable method"
  536. /* not standard methods, must be > 255. */
  537. #define AUTHMETHOD_RFC931 256
  538. #define AUTHMETHOD_RFC931s "rfc931"
  539. #define AUTHMETHOD_MAX (AUTHMETHOD_RFC931 + 1)
  540. /*
  541.  *  Response commands/codes
  542.  */
  543. #define SOCKS_CONNECT 1
  544. #define SOCKS_CONNECTs "connect"
  545. #define SOCKS_BIND 2
  546. #define SOCKS_BINDs "bind"
  547. #define SOCKS_UDPASSOCIATE       3
  548. #define SOCKS_UDPASSOCIATEs "udpassociate"
  549. /* pseudo commands */
  550. #define SOCKS_COMMANDEND 0xff
  551. #define SOCKS_BINDREPLY (SOCKS_COMMANDEND + 1)
  552. #define SOCKS_BINDREPLYs "bindreply"
  553. #define SOCKS_UDPREPLY (SOCKS_BINDREPLY + 1)
  554. #define SOCKS_UDPREPLYs "udpreply"
  555. /* misc stuff */
  556. #define SOCKS_ACCEPT (SOCKS_UDPREPLY + 1)
  557. #define SOCKS_ACCEPTs "accept"
  558. #define SOCKS_DISCONNECT (SOCKS_ACCEPT + 1)
  559. #define SOCKS_DISCONNECTs "disconnect"
  560. /* address types */
  561. #define SOCKS_ADDR_IPV4 0x01
  562. #define SOCKS_ADDR_DOMAIN 0x03
  563. #define SOCKS_ADDR_IPV6       0x04
  564. /* reply field values */
  565. #define SOCKS_SUCCESS 0x00
  566. #define SOCKS_FAILURE 0x01
  567. #define SOCKS_NOTALLOWED 0x02
  568. #define SOCKS_NETUNREACH 0x03
  569. #define SOCKS_HOSTUNREACH 0x04
  570. #define SOCKS_CONNREFUSED 0x05
  571. #define SOCKS_TTLEXPIRED 0x06
  572. #define SOCKS_CMD_UNSUPP 0x07
  573. #define SOCKS_ADDR_UNSUPP 0x08
  574. #define SOCKS_INVALID_ADDRESS 0x09
  575. /* version 4 codes. */
  576. #define SOCKSV4_SUCCESS 90
  577. #define SOCKSV4_FAIL 91
  578. #define SOCKSV4_NO_IDENTD 92
  579. #define SOCKSV4_BAD_ID 93
  580. #define MSPROXY_PINGINTERVAL (6 * 60)
  581. #define MSPROXY_SUCCESS 0
  582. #define MSPROXY_FAILURE 1
  583. #define MSPROXY_NOTALLOWED 2
  584. #define MSPROXY_MINLENGTH 172 /* minimum length of packet. */
  585. #define MSPROXY_VERSION 0x00010200 /* perhaps? */
  586. /* errors */
  587. #define MSPROXY_ADDRINUSE 0x0701
  588. #define MSPROXY_BIND_AUTHFAILED 0x0804 /* auth failed for connect. */
  589. #define MSPROXY_CONNECT_AUTHFAILED 0x081e /* auth failed for bind. */
  590. #define MSPROXY_CONNREFUSED 0x4 /* low 12 bits seem to vary. */
  591. /*
  592.  * Server seems to ignore loworder bits of a 0x47?? command, so take them
  593.  * for our own use.
  594.  */
  595. #define MSPROXY_HELLO 0x0500 /* packet 1 from client. */
  596. #define MSPROXY_HELLO_ACK 0x1000 /* packet 1 from server. */
  597. #define MSPROXY_USERINFO 0x1000 /* packet 2 from client. */
  598. #define MSPROXY_USERINFO_ACK 0x0400 /* packet 2 from server. */
  599. #define MSPROXY_SOMETHING 0x4700 /* packet 3 from client. */
  600. #define MSPROXY_SOMETHING_1_ACK 0x4714 /* packet 3 from server. */
  601. #define MSPROXY_SOMETHING_2 0x4701 /* packet 4 from client. */
  602. #define MSPROXY_SOMETHING_2_ACK 0x4715 /* packet 4 from server, high 8 bits
  603. seem to vary. */
  604. #define MSPROXY_SOMETHING_2_ACK2 0x4716 /* could be this too... dunno. */
  605. #define MSPROXY_RESOLVE 0x070d /* resolve request from client. */
  606. #define MSPROXY_RESOLVE_ACK 0x070f /* resolved info from server. */
  607. #define MSPROXY_BIND 0x0704 /* bind request. */
  608. #define MSPROXY_BIND_ACK 0x0706 /* bind request accepted. */
  609. #define MSPROXY_BIND2 0x0707 /* dunno. */
  610. #define MSPROXY_BIND2_ACK 0x0708 /* dunno. */
  611. #define MSPROXY_BIND2 0x0707 /* dunno. */
  612. #define MSPROXY_BIND2_ACK 0x0708 /* dunno. */
  613. #define MSPROXY_LISTEN 0x0406 /* listen() performed(?) */
  614. #define MSPROXY_BINDINFO 0x0709 /* info about client server accepted*/
  615. #define MSPROXY_BINDINFO_ACK 0x070a /* we got the info(?) */
  616. #define MSPROXY_CONNECT 0x071e /* connect request. */
  617. #define MSPROXY_CONNECT_ACK 0x0703 /* connect request accepted. */
  618. #define MSPROXY_UDPASSOCIATE 0x0705 /* udp associate request. */
  619. #define MSPROXY_UDPASSOCIATE_ACK 0x0706 /* udp associate request accepted. */
  620. #define MSPROXY_CONNECTED 0x042c /* client connected to server? */
  621. #define MSPROXY_SESSIONEND 0x251e /* maybe... */
  622. /* flag _bits_ */
  623. #define SOCKS_INTERFACEREQUEST 0x01
  624. #define SOCKS_USECLIENTPORT 0x04
  625. /* subcommands */
  626. #define SOCKS_INTERFACEDATA 0x01
  627. #define SOCKS_TCP 1
  628. #define SOCKS_UDP 2
  629. #define SOCKS_RECV 0
  630. #define SOCKS_SEND 1
  631. #if 0
  632. /* where is this from? (michaels) */
  633. #if defined(__alpha__)
  634. typedef unsigned int u_int32;
  635. #else
  636. typedef unsigned long u_int32;
  637. #endif
  638. #endif
  639. /* offsets into authentication packet */
  640. #define AUTH_VERSION 0 /* version of method packet. */
  641. /* request */
  642. #define AUTH_NMETHODS 1 /* number of methods to offer. */
  643. #define AUTH_METHODS 2 /* start of methods to offer. */
  644. /* reply */
  645. #define AUTH_VERSION 0 /* offset for version in reply. */
  646. #define AUTH_METHOD 1 /* offset for selected method in reply. */
  647. /* offsets into username/password negotiation packet */
  648. #define UNAME_VERSION 0
  649. #define UNAME_STATUS 1
  650. /* XXX no ivp6 support currently. */
  651. #define SOCKS_IPV6_ALEN 16
  652. #if !defined(SOCKSLIBRARY_DYNAMIC)
  653. #define sys_accept(s, addr, addrlen) accept(s, addr, addrlen)
  654. #define sys_bind(s, name, namelen) bind(s, name, namelen)
  655. #define sys_connect(s, name, namelen) connect(s, name, namelen)
  656. #define sys_bindresvport(sd, sin) bindresvport(sd, sin)
  657. #define sys_gethostbyname(name) gethostbyname(name)
  658. #define sys_gethostbyname2(name, af) gethostbyname2(name, af)
  659. #define sys_getpeername(s, name, namelen) getpeername(s, name, namelen)
  660. #define sys_getsockname(s, name, namelen) getsockname(s, name, namelen)
  661. #define sys_recvfrom(s, buf, len, flags, from, fromlen) 
  662.   recvfrom(s, buf, len, flags, from, fromlen)
  663. #define sys_rresvport(port) rresvport(port)
  664. #define sys_sendto(s, msg, len, flags, to, tolen) 
  665.   sendto(s, msg, len, flags, to, tolen)
  666. #endif
  667. enum operator_t { none = 0, eq, neq, ge, le, gt, lt, range };
  668. struct compat_t {
  669. unsigned reuseaddr:1; /* set SO_REUSEADDR? */
  670. unsigned sameport:1; /* always try to use same port as client? */
  671. unsigned :0;
  672. };
  673. struct logtype_t {
  674. int type; /* type of logging (where to). */
  675. FILE **fpv; /* if logging is to file, this is the open file.*/
  676. int fpc;
  677. int *fplockv; /* locking of logfiles. */
  678. int facility; /* if logging to syslog, this is the facility. */
  679. };
  680. /* extensions supported by us. */
  681. struct extension_t {
  682. unsigned bind:1; /* use bind extension? */
  683. unsigned :0;
  684. };
  685. /* the address part of a socks packet */
  686. union socksaddr_t {
  687. struct in_addr ipv4;
  688. char ipv6[SOCKS_IPV6_ALEN];
  689. char domain[MAXHOSTNAMELEN]; /* _always_ stored as C string. */
  690. };
  691. /* the hostspecific part of misc. things */
  692. struct sockshost_t {
  693. unsigned char atype;
  694. union socksaddr_t addr;
  695. in_port_t port;
  696. };
  697. struct msproxy_request_t {
  698. char username[MAXNAMELEN];
  699. char unknown[MAXNAMELEN];
  700. char executable[MAXNAMELEN];
  701. char clienthost[MAXHOSTNAMELEN];
  702. int32_t clientid; /* 1-4 */
  703. int32_t magic25; /* 5-8 */
  704. int32_t serverid; /* 9-12 */
  705. unsigned char serverack; /* 13: ack of last server packet */
  706. char pad10[3]; /* 14-16 */
  707. unsigned char sequence; /* 17: sequence # of this packet. */
  708. char pad11[7]; /* 18-24 */
  709. char RWSP[4]; /* 25-28: 0x52,0x57,0x53,0x50 */
  710. char pad15[8]; /* 29-36 */
  711. int16_t command; /* 37-38 */
  712. /* packet specifics start at 39. */
  713. union {
  714. struct {
  715. char pad1[18]; /* 39-56 */
  716. int16_t magic3; /* 57-58 */
  717. char           pad3[114]; /* 59-172 */
  718. int16_t magic5; /* 173-174: 0x4b, 0x00 */
  719. char pad5[2]; /* 175-176 */
  720. int16_t magic10; /* 177-178: 0x14, 0x00 */
  721. char pad6[2]; /* 179-180 */
  722. int16_t magic15; /* 181-182: 0x04, 0x00 */
  723. char pad10[6]; /* 183-188 */
  724. int16_t magic20; /* 189-190: 0x57, 0x04 */
  725. int16_t magic25; /* 191-192: 0x00, 0x04 */
  726. int16_t magic30; /* 193-194: 0x01, 0x00 */
  727. char pad20[2]; /* 195-196: 0x4a, 0x02 */
  728. int16_t magic35; /* 197-198: 0x4a, 0x02 */
  729. char pad30[10]; /* 199-208 */
  730. int16_t magic40; /* 209-210: 0x30, 0x00 */
  731. char pad40[2]; /* 211-212 */
  732. int16_t magic45; /* 213-214: 0x44, 0x00 */
  733. char pad45[2]; /* 215-216 */
  734. int16_t magic50; /* 217-218: 0x39, 0x00 */
  735. char pad50[2]; /* 219-220 */
  736. } _1;
  737. struct {
  738. char pad1[18]; /* 39-56 */
  739. int16_t magic3; /* 57-58 */
  740. char           pad3[114]; /* 59-172 */
  741. int16_t magic5; /* 173-174: 0x00, 0x4b */
  742. char pad5[2]; /* 175-176 */
  743. int16_t magic10; /* 177-178: 0x14, 0x00 */
  744. char pad10[2]; /* 179-180 */
  745. int16_t magic15; /* 181-182: 0x04, 0x00 */
  746. char pad15[6]; /* 183-188 */
  747. int16_t magic20; /* 189-190: 0x57, 0x04 */
  748. int16_t magic25; /* 191-192: 0x00, 0x04 */
  749. int16_t magic30; /* 193-194: 0x01, 0x00 */
  750. char pad20[2]; /* 195-196 */
  751. int16_t magic35; /* 197-198: 0x04, 0x00 */
  752. char pad25[10]; /* 199-208 */
  753. int16_t magic50; /* 209-210: 0x30, 0x00 */
  754. char pad50[2]; /* 211-212 */
  755. int16_t magic55; /* 213-214: 0x44, 0x00 */
  756. char pad55[2]; /* 215-216 */
  757. int16_t magic60; /* 217-218: 0x39, 0x00 */
  758. } _2;
  759. struct {
  760. char pad1[4]; /* 39-42 */
  761. int16_t magic2; /* 43-44 */
  762. char pad10[12]; /* 45-56 */
  763. in_addr_t bindaddr; /* 57-60: address to bind. */
  764. in_port_t bindport; /* 61-62: port to bind. */
  765. char           pad15[2]; /* 63-64 */
  766. int16_t magic3; /* 65-66 */
  767. in_port_t boundport; /* 67-68 */
  768. char           pad20[104]; /* 69-172 */
  769. char NTLMSSP[sizeof("NTLMSSP")]; /* 173-180: "NTLMSSP" */
  770. int16_t magic5; /* 181-182: 0x01, 0x00 */
  771. char pad25[2]; /* 183-184 */
  772. int16_t magic10; /* 185-186: 0x96, 0x82 */
  773. int16_t magic15; /* 187-188: 0x08, 0x00 */
  774. int16_t magic20; /* 189-190: 0x28, 0x00 */
  775. char pad30[2]; /* 191-192 */
  776. int16_t magic25; /* 193-194: 0x96, 0x82 */
  777. int16_t magic30; /* 195-196: 0x01, 0x00 */
  778. char pad40[12]; /* 197-208 */
  779. int16_t magic50; /* 209-210: 0x30, 0x00 */
  780. char pad50[6]; /* 211-216 */
  781. int16_t magic55; /* 217-218: 0x30, 0x00 */
  782. char pad55[2]; /* 219-220 */
  783. } _3;
  784. struct {
  785. char pad1[4]; /* 39-42 */
  786. int16_t magic1; /* 43-44 */
  787. int32_t magic2; /* 45-48 */
  788. char pad2[8]; /* 49-56 */
  789. int16_t magic3; /* 57-58 */
  790. char pad3[6]; /* 59-64 */
  791. int16_t magic4; /* 65-66 */
  792. in_port_t boundport; /* 67-68 */
  793. char           pad4[104]; /* 69-172 */
  794. char NTLMSSP[sizeof("NTLMSSP")]; /* 173-180: "NTLMSSP" */
  795. int16_t magic5; /* 181-182: 0x03, 0x00 */
  796. char pad5[2]; /* 183-184 */
  797. int16_t magic10; /* 185-186: 0x18, 0x00 */
  798. int16_t magic15; /* 187-188: 0x18, 0x00 */
  799. int16_t magic20; /* 189-190: 0x49, 0x00 */
  800. char pad10[6]; /* 191-196 */
  801. int16_t magic30; /* 197-198: 0x61, 0x00 */
  802. char pad15[2]; /* 199-200 */
  803. int16_t magic35; /* 201-202: 0x08, 0x00 */
  804. int16_t magic40; /* 203-204: 0x08, 0x00 */
  805. int16_t magic45; /* 205-206: 0x34, 0x00 */
  806. char pad20[2]; /* 207-208 */
  807. int16_t magic50; /* 209-210: 0x07, 0x00 */
  808. int16_t magic55; /* 211-212: 0x07, 0x00 */
  809. int16_t magic60; /* 213-214: 0x3c, 0x00 */
  810. char pad25[2]; /* 215-216 */
  811. int16_t magic65; /* 217-218: 0x06, 0x00 */
  812. int16_t magic70; /* 219-220: 0x06, 0x00 */
  813. int16_t magic75; /* 221-222: 0x43, 0x00 */
  814. } _4;
  815. struct {
  816. unsigned char hostlength; /* length of host, including NUL. */
  817. char pad1[17]; /* 39-56 */
  818. char *host; /* 57-... */
  819. } resolve;
  820. struct {
  821. int16_t magic1; /* 39-40 */
  822. char pad1[4]; /* 41-45 */
  823. int32_t magic3; /* 45-48 */
  824. char pad5[8]; /* 48-56 */
  825. int16_t magic6; /* 57-58: 0x0200 */
  826. in_port_t destport; /* 59-60 */
  827. in_addr_t destaddr; /* 61-64 */
  828. char pad10[4]; /* 65-68 */
  829. int16_t magic10; /* 69-70 */
  830. char pad15[2]; /* 71-72 */
  831. in_port_t srcport; /* 73-74: port client connects from */
  832. char pad20[82]; /* 75-156 */
  833. } _5;
  834. struct {
  835. int16_t magic1; /* 39-40 */
  836. char pad5[2]; /* 41-42 */
  837. int16_t magic5; /* 43-44 */
  838. int32_t magic10; /* 45-48 */
  839. char pad10[2]; /* 49-50 */
  840. int16_t magic15; /* 51-52 */
  841. int32_t magic16; /* 53-56 */
  842. int16_t magic20; /* 57-58 */
  843. in_port_t clientport; /* 59-60: forwarded port. */
  844. in_addr_t clientaddr; /* 61-64: forwarded address. */
  845. int32_t magic30; /* 65-68 */
  846. int32_t magic35; /* 69-72 */
  847. in_port_t serverport; /* 73-74: port server will connect
  848.  *        to us from.
  849. */
  850. in_port_t srcport; /* 75-76: connect request; port used
  851.  *  on client behalf.
  852. */
  853. in_port_t boundport; /* 77-78: bind request; port used
  854.  *  on client behalf.
  855. */
  856. in_addr_t boundaddr; /* 79-82: addr used on client behalf*/
  857. char pad30[90]; /* 83-172 */
  858. } _6;
  859. } packet;
  860. };
  861. struct msproxy_response_t {
  862. int32_t packetid; /* 1-4 */
  863. int32_t magic5; /* 5-8 */
  864. int32_t              serverid; /* 9-12 */
  865. char clientack; /* 13: ack of last client packet. */
  866. char pad5[3]; /* 14-16 */
  867. unsigned char sequence; /* 17: sequence # of this packet. */
  868. char pad10[7]; /* 18-24 */
  869. char RWSP[4]; /* 25-28: 0x52,0x57,0x53,0x50 */
  870. char pad15[8]; /* 29-36 */
  871. int16_t command; /* 37-38 */
  872. union {
  873. struct {
  874. char pad5[18]; /* 39-56 */
  875. int16_t magic20; /* 57-58: 0x02, 0x00 */
  876. char pad10[6]; /* 59-64 */
  877. int16_t magic30; /* 65-66: 0x74, 0x01 */
  878. char pad15[2]; /* 67-68 */
  879. int16_t magic35; /* 69-70: 0x0c, 0x00 */
  880. char pad20[6]; /* 71-76 */
  881. int16_t magic50; /* 77-78: 0x04, 0x00 */
  882. char pad30[6]; /* 79-84 */
  883. int16_t magic60; /* 85-86: 0x65, 0x05 */
  884. char pad35[2]; /* 87-88 */
  885. int16_t magic65; /* 89-90: 0x02, 0x00 */
  886. char pad40[8]; /* 91-98 */
  887. in_port_t udpport; /* 99-100 */
  888. in_addr_t udpaddr; /* 101-104 */
  889. } _1;
  890. struct {
  891. char pad5[18]; /* 39-56 */
  892. int16_t magic5; /* 57-58: 0x01, 0x00 */
  893. } _2;
  894. struct {
  895. char pad1[6]; /* 39-44 */
  896. int32_t magic10; /* 45-48 */
  897. char pad3[10]; /* 49-58 */
  898. in_port_t boundport; /* 59-60: port server bound for us. */
  899. in_addr_t boundaddr; /* 61-64: addr server bound for us. */
  900. char pad10[4]; /* 65-68 */
  901. int16_t magic15; /* 69-70 */
  902. char pad15[102]; /* 70-172 */
  903. char NTLMSSP[sizeof("NTLMSSP")]; /* 173-180: "NTLMSSP" */
  904. int16_t magic50; /* 181-182: 0x02, 0x00 */
  905. char pad50[2]; /* 183-184 */
  906. int16_t magic55; /* 185-186: 0x08, 0x00 */
  907. int16_t magic60; /* 187-188: 0x08, 0x00 */
  908. int16_t magic65; /* 189-190: 0x28, 0x00 */
  909. char pad60[2]; /* 191-192 */
  910. int16_t magic70; /* 193-194: 0x96, 0x82 */
  911. int16_t magic75; /* 195-196: 0x01, 0x00 */
  912. char pad70[16]; /* 197-212 */
  913. char ntdomain[257]; /* 213-EOP */
  914. } _3;
  915. struct {
  916. char pad5[134]; /* 39-172 */
  917. } _4;
  918. struct {
  919. unsigned char addroffset; /* 39: weird, probably wrong. */
  920. char pad5[13]; /* 40-52 */
  921. in_addr_t hostaddr; /* ?-?+4 */
  922. } resolve;
  923. struct {
  924. int16_t magic1; /* 39-40 */
  925. char pad5[18]; /* 41-58 */
  926. in_port_t clientport; /* 59-60: forwarded port. */
  927. in_addr_t clientaddr; /* 61-64: forwarded address. */
  928. int32_t magic10; /* 65-68 */
  929. int32_t magic15; /* 69-72 */
  930. in_port_t serverport; /* 73-74: port server will connect
  931.  *        to us from.
  932. */
  933. in_port_t srcport; /* 75-76: connect request; port used
  934.  *  on client behalf.
  935. */
  936. in_port_t boundport; /* 77-78: bind request; port used
  937.  *  on client behalf.
  938. */
  939. in_addr_t boundaddr; /* 79-82: addr used on client behalf*/
  940. char pad10[90]; /* 83-172 */
  941. } _5;
  942. } packet;
  943. };
  944. struct request_t {
  945. unsigned char version;
  946. unsigned char command;
  947. unsigned char flag;
  948. struct sockshost_t host;
  949. struct authmethod_t *auth; /* pointer to level above. */
  950. };
  951. struct response_t {
  952. unsigned char version;
  953. unsigned char reply;
  954. unsigned char flag;
  955. struct sockshost_t host;
  956. struct authmethod_t *auth; /* pointer to level above. */
  957. };
  958. /* encapsulation for udp packets. */
  959. struct udpheader_t {
  960. unsigned char flag[2];
  961. unsigned char frag;
  962. struct sockshost_t host;
  963. };
  964. /* interface request packet. */
  965. struct interfacerequest_t {
  966. unsigned char rsv;
  967. unsigned char sub;
  968. unsigned char flag;
  969. struct sockshost_t host;
  970. };
  971. /* method username */
  972. struct uname_t {
  973. unsigned char version;
  974. char name[MAXNAMELEN];
  975. char password[MAXPWLEN];
  976. };
  977. /* method rfc931 */
  978. struct rfc931_t {
  979. char name[MAXNAMELEN];
  980. };
  981. /* this must be big enough to hold a complete method request. */
  982. struct authmethod_t {
  983. int matched; /* authentication matched? */
  984. int method; /* method in use. */
  985. union {
  986. struct uname_t uname;
  987. struct rfc931_t rfc931;
  988. } mdata;
  989. };
  990. struct method_t {
  991. unsigned none:1;
  992. unsigned uname:1;
  993. unsigned :0;
  994. };
  995. struct protocol_t {
  996. unsigned tcp:1;
  997. unsigned udp:1;
  998. unsigned :0;
  999. };
  1000. struct command_t {
  1001. unsigned bind:1;
  1002. unsigned connect:1;
  1003. unsigned udpassociate:1;
  1004. /* not real commands as per standard, but they have their use. */
  1005. unsigned bindreply:1; /* reply to bind command. */
  1006. unsigned udpreply:1; /* reply to udp packet. */
  1007. unsigned :0;
  1008. };
  1009. struct proxyprotocol_t {
  1010. unsigned socks_v4:1;
  1011. unsigned socks_v5:1;
  1012. unsigned msproxy_v2:1;
  1013. unsigned :0;
  1014. };
  1015. struct serverstate_t {
  1016. struct command_t command;
  1017. struct extension_t extension;
  1018. struct protocol_t protocol;
  1019. int methodv[AUTHMETHOD_MAX];/* methods to offer. */
  1020. int methodc; /* number of methods set. */
  1021. struct proxyprotocol_t proxyprotocol;
  1022. };
  1023. struct msproxy_state_t {
  1024. struct sockaddr_in controladdr; /* udp address of proxyserver. */
  1025. int32_t magic25;
  1026. int32_t bindid;
  1027. int32_t clientid;
  1028. int32_t serverid;
  1029. unsigned char seq_recv; /* seq number of last packet recv. */
  1030. unsigned char seq_sent; /* seq number of last packet sent. */
  1031. };
  1032. struct gateway_t {
  1033. struct sockshost_t host;
  1034. struct serverstate_t state;
  1035. };
  1036. /* values in parentheses designate "don't care" values. */
  1037. struct socksstate_t {
  1038. int acceptpending; /* a accept pending? (-1) */
  1039. struct authmethod_t auth; /* authentication in use. */
  1040. int command; /* command (-1) */
  1041. int err; /* if request failed, errno. */
  1042. int inprogress; /* operation in progress? (-1) */
  1043. #ifdef SOCKS_TRYHARDER
  1044. int lock; /* some calls require a lock. */
  1045. #endif
  1046. struct msproxy_state_t msproxy; /* if msproxy, msproxy state. */
  1047. struct protocol_t protocol; /* protocol in use. */
  1048. unsigned udpconnect:1; /* connected udp socket? */
  1049. int system; /* don't check, use system call. */
  1050. int version; /* version */
  1051. };
  1052. struct ruleaddress_t {
  1053. char atype;
  1054. union {
  1055. char domain[MAXHOSTNAMELEN];
  1056. struct {
  1057. struct in_addr ip;
  1058. struct in_addr mask;
  1059. } ipv4;
  1060. } addr;
  1061. struct {
  1062. in_port_t tcp; /* tcp portstart or field to operator on. */
  1063. in_port_t udp; /* udp portstart or field to operator on. */
  1064. } port;
  1065. in_port_t portend; /* only used if operator is range. */
  1066. enum operator_t operator; /* operator to compare ports via. */
  1067. };
  1068. struct route_t {
  1069. int number; /* routenumber. */
  1070. struct {
  1071. unsigned bad:1; /* route is bad? */
  1072. unsigned direct:1; /* direct connection, no proxy. */
  1073. unsigned :0;
  1074. } state;
  1075. struct ruleaddress_t src;
  1076. struct ruleaddress_t dst;
  1077. struct gateway_t gw;
  1078. struct route_t *next; /* next route in list. */
  1079. };
  1080. struct socks_t {
  1081. unsigned char version;
  1082. /*
  1083.  * Negotiated version.  Each request and
  1084.  * response will also contain a version number, that
  1085.  * is the version number given for that particular
  1086.  * packet and should be checked to make sure it is
  1087.  *  the same as the negotiated version.
  1088. */
  1089. struct request_t req;
  1090. struct response_t res;
  1091. struct authmethod_t auth;
  1092. struct gateway_t gw;
  1093. struct socksstate_t state;
  1094. };
  1095. enum portcmp { e_lt, e_gt, e_eq, e_neq, e_le, e_ge, e_nil };
  1096. typedef enum portcmp Portcmp;
  1097. /*
  1098.  * for use in generic functions that take either reply or request
  1099.  * packets, include a field indicating what it is.
  1100.  */
  1101. #define SOCKS_REQUEST 0x1
  1102. #define SOCKS_RESPONSE 0x2
  1103. struct socksfd_t {
  1104. unsigned allocated:1;/* allocated? */
  1105. int control; /* control connection to server. */
  1106. struct socksstate_t state; /* state of this connection. */
  1107. unsigned :0;
  1108. struct sockaddr local; /* local address of data connection. */
  1109. unsigned :0;
  1110. struct sockaddr server; /* remote address of data connection. */
  1111. unsigned :0;
  1112. struct sockaddr remote; /* address server is using on our behalf. */
  1113. unsigned :0;
  1114. struct sockaddr reply; /* address to expect reply from. */
  1115. /* XXX union this. */
  1116. unsigned :0;
  1117. struct sockaddr accepted; /* address server accepted for us. */
  1118. unsigned :0;
  1119. struct sockaddr connected; /* address server connected to for us. */
  1120. struct route_t *route;
  1121. };
  1122. __BEGIN_DECLS
  1123. /*
  1124.  * versions of BSD's error functions that log via slog() instead.
  1125.  */
  1126. #ifdef STDC_HEADERS
  1127. void serr(int eval, const char *fmt, ...);
  1128. #else
  1129. void serr();
  1130. #endif  /* STDC_HEADERS */
  1131. #ifdef STDC_HEADERS
  1132. void serrx(int eval, const char *fmt, ...);
  1133. #else
  1134. void serrx();
  1135. #endif  /* STDC_HEADERS */
  1136. #ifdef STDC_HEADERS
  1137. void swarn(const char *fmt, ...);
  1138. #else
  1139. void swarn();
  1140. #endif  /* STDC_HEADERS */
  1141. #ifdef STDC_HEADERS
  1142. void swarnx(const char *fmt, ...);
  1143. #else
  1144. void swarnx();
  1145. #endif  /* STDC_HEADERS */
  1146. void
  1147. genericinit __P((void));
  1148. /*
  1149.  * Generic init, called after clientinit()/serverinit().
  1150.  */
  1151. void
  1152. initlog __P((void));
  1153. /*
  1154.  * (Re)initialize logging.
  1155.  */
  1156. struct udpheader_t *
  1157. sockaddr2udpheader __P((const struct sockaddr *to, struct udpheader_t *header));
  1158. /*
  1159.  * Writes a udpheader representation of "to" to "header".
  1160.  * Returns a pointer to "header".
  1161.  */
  1162. char *
  1163. udpheader_add __P((const struct sockshost_t *host, char *msg, size_t *len,
  1164.  size_t msgsize));
  1165. /*
  1166.  * Prefixes the udpheader_t version of "host" to a copy of "msg",
  1167.  * which is of length "len".
  1168.  * "msgsize" gives the size of the memory pointed to by "msg".
  1169.  * If "msgsize" is large enough the function will prepend the udpheader
  1170.  * to "msg" directly (moving the old contents to the right) rather than
  1171.  * allocating new memory.
  1172.  * Upon return "len" gives the length of the new "msg".
  1173.  *
  1174.  * Returns:
  1175.  * On success: "msg" with the udpheader prepended.
  1176.  * On failure: NULL (out of memory).
  1177.  */
  1178. struct udpheader_t *
  1179. string2udpheader __P((const char *data, size_t len,
  1180.  struct udpheader_t *header));
  1181. /*
  1182.  * Converts "data" to udpheader_t representation.
  1183.  * "len" is length of "data".
  1184.  * "data" is assumed to be in network order.
  1185.  * Returns:
  1186.  * On success: pointer to a udpheader_t in static memory.
  1187.  * On failure: NULL ("data" is not a complete udppacket).
  1188.  */
  1189. const char *
  1190. socks_packet2string __P((const void *packet, int type));
  1191. /*
  1192.  * debug function; dumps socks packet content
  1193.  * "packet" is a socks packet, "type" indicates it's type.
  1194.  * Returns:
  1195.  * On success: 0
  1196.  * On failure: -1
  1197.  */
  1198. int
  1199. socks_socketisbound __P((int s));
  1200. /*
  1201.  * Returns:
  1202.  * If "s" is bound: 1
  1203.  * If "s" is not bound: 0
  1204.  * If "s" is not socket or error occurred determining if bound: -1
  1205.  */
  1206. int
  1207. fdisopen __P((int fd));
  1208. /*
  1209.  * returns 1 if the filedescriptor "fd" currently references a open object.
  1210.  * returns 0 otherwise.
  1211.  */
  1212. void
  1213. closev __P((int *array, int count));
  1214. /*
  1215.  * Goes through "array", which contains "count" elements.
  1216.  * Each element that does not have a negative value is closed.
  1217.  */
  1218. int
  1219. socks_logmatch __P((unsigned int d, const struct logtype_t *log));
  1220. /*
  1221.  * Returns true if "d" is a descriptor matching any descriptor in "log".
  1222.  * Returns false otherwise.
  1223.  */
  1224. char *
  1225. sockaddr2string __P((const struct sockaddr *address, char *string, size_t len));
  1226. /*
  1227.  * Returns the ip address and port in "address" on string form.
  1228.  * "address" is assumed to be on network form and it will be
  1229.  * converted to host form before written to "string".
  1230.  * "len" gives length of the NUL terminated string.
  1231.  * Returns: "string".
  1232.  */
  1233. struct sockaddr *
  1234. sockshost2sockaddr __P((const struct sockshost_t *shost,
  1235. struct sockaddr *addr));
  1236. /*
  1237.  * Converts the sockhost_t "shost" to a sockaddr struct and stores it
  1238.  * in "addr".
  1239.  * Returns: "addr".
  1240.  */
  1241. struct sockaddr *
  1242. fakesockshost2sockaddr __P((const struct sockshost_t *host,
  1243.  struct sockaddr *addr));
  1244. /*
  1245.  * Like sockshost2sockaddr(), but checks whether the address in
  1246.  * "host" is fake when converting.
  1247.  */
  1248. struct sockshost_t *
  1249. sockaddr2sockshost __P((const struct sockaddr *addr, struct sockshost_t *host));
  1250. /*
  1251.  * Converts the sockaddr struct "shost" to a sockshost_t struct and stores it
  1252.  * in "host".
  1253.  * Returns: "host".
  1254.  */
  1255. struct sockshost_t *
  1256. ruleaddress2sockshost __P((const struct ruleaddress_t *address,
  1257. struct sockshost_t *host, int protocol));
  1258. /*
  1259.  * Converts the ruleaddress_t "address" to a sockshost_t struct and stores it
  1260.  * in "host".
  1261.  * Returns: "host".
  1262.  */
  1263. struct ruleaddress_t *
  1264. sockshost2ruleaddress __P((const struct sockshost_t *host,
  1265. struct ruleaddress_t *addr));
  1266. /*
  1267.  * Converts the sockshost_t "host" to a ruleaddress_t struct and stores it
  1268.  * in "addr".
  1269.  * Returns: "addr".
  1270.  */
  1271. struct ruleaddress_t *
  1272. sockaddr2ruleaddress __P((const struct sockaddr *addr,
  1273. struct ruleaddress_t *ruleaddr));
  1274. /*
  1275.  * Converts the struct sockaddr "addr" to a ruleaddress_t struct and stores it
  1276.  * in "ruleaddr".
  1277.  * Returns: "addr".
  1278.  */
  1279. int
  1280. sockatmark __P((int s));
  1281. /*
  1282.  * If "s" is at oob mark, return 1, otherwise 0.
  1283.  * Returns -1 if a error occurred.
  1284.  */
  1285. ssize_t
  1286. recvmsgn __P((int s, struct msghdr *msg, int flags, size_t len));
  1287. /*
  1288.  * Like recvmsg(), but tries to read until "len" has been read.
  1289.  * BUGS:
  1290.  *   Assumes msg->msg_iov[n] are laid out next to each others.
  1291.  */
  1292. ssize_t
  1293. readn __P((int, void *, size_t));
  1294. /*
  1295.  * Like read() but retries.
  1296.  */
  1297. ssize_t
  1298. writen __P((int, const void *, size_t));
  1299. /*
  1300.  * like write() but retries.
  1301.  */
  1302. int
  1303. closen __P((int));
  1304. /*
  1305.  * Wrapper around close().  Retries on EINTR.
  1306.  */
  1307. int
  1308. selectn __P((int, fd_set *, fd_set *, fd_set *, struct timeval *));
  1309. /*
  1310.  * Wrapper around select().  Retries on EINTR.
  1311.  */
  1312. int
  1313. acceptn __P((int, struct sockaddr *, socklen_t *));
  1314. /*
  1315.  * Wrapper around accept().  Retries on EINTR.
  1316.  */
  1317. char *
  1318. sockshost2string __P((const struct sockshost_t *host, char *string,
  1319.  size_t len));
  1320. /*
  1321.  * Writes "host" out as a string.  The string is written to "string",
  1322.  * which is of length "len", including NUL termination.
  1323.  * Returns: "string".
  1324.  */
  1325. const char *
  1326. strcheck __P((const char *string));
  1327. /*
  1328.  * Checks "string".  If it is NULL, returns a string indicating memory
  1329.  * exhausted, if not, returns the same string it was passed.
  1330.  */
  1331. const char *
  1332. command2string __P((int command));
  1333. /*
  1334.  * Returns a printable representation of the socks command "command".
  1335.  * Can't fail.
  1336.  */
  1337. const char *
  1338. protocol2string __P((int protocol));
  1339. /*
  1340.  * Returns a printable representation of "protocol".
  1341.  * Can't fail.
  1342.  */
  1343. const char *
  1344. method2string __P((int method));
  1345. /*
  1346.  * Returns a printable representation of the authmethod "method".
  1347.  * Can't fail.
  1348.  */
  1349. int
  1350. string2method __P((const char *methodname));
  1351. /*
  1352.  * If "methodname" is the name of a supported method, the protocol
  1353.  * value of that method is returned.
  1354.  * Otherwise, -1 is returned.
  1355.  */
  1356. char *
  1357. sockshost2mem __P((const struct sockshost_t *host, char *mem, int version));
  1358. /*
  1359.  * Writes "host" out to "mem".  The caller must make sure "mem"
  1360.  * is big enough to hold the contents of "host".
  1361.  * "version" gives the socks version "host" is to be written out in.
  1362.  * Returns a pointer to one element past the last byte written to "mem".
  1363.  */
  1364. const char *
  1365. mem2sockshost __P((struct sockshost_t *host, const char *mem, size_t len,
  1366.  int version));
  1367. /*
  1368.  * Writes "mem", which is assumed to be a sockshost string
  1369.  * of version "version" in network order, out to "host".
  1370.  * Returns:
  1371.  * On success: pointer to one element past last byte used of mem
  1372.  * and fills in "host" appropriately.
  1373.  * On failure: NULL ("mem" is not a valid sockshost.)
  1374.  */
  1375. #ifdef STDC_HEADERS
  1376. void slog(int priority, const char *message, ...);
  1377. #else
  1378. void slog();
  1379. #endif  /* STDC_HEADERS */
  1380. /*
  1381.  * Logs message "message" at priority "priority" to previously configured
  1382.  * outputdevice.
  1383.  * Checks settings and ignores message if it's of to low a priority.
  1384.  */
  1385. void vslog __P((int priority, const char *message, va_list ap));
  1386. /*
  1387.  * Same as slog() but assumes varargs/stdargs have already processed
  1388.  * the arguments.
  1389.  */
  1390. int
  1391. readconfig __P((const char *filename));
  1392. /*
  1393.  * Parses the config stored in in the filename "filename".
  1394.  * Returns:
  1395.  * On success: 0.
  1396.  * On failure: -1.
  1397.  */
  1398. void
  1399. yyerror __P((const char *s));
  1400. /*
  1401.  * Report a error related to (configfile) parsing and exit.
  1402.  */
  1403. int
  1404. addressmatch __P((const struct ruleaddress_t *rule,
  1405. const struct sockshost_t *address, int protocol,
  1406. int ipalias));
  1407. /*
  1408.  * Tries to match "address" against "rule".  "address" is resolved
  1409.  * if necessary.  "address" supports the wildcard INADDR_ANY and port of 0.
  1410.  * "protocol" is the protocol to compare under.
  1411.  * If "ipalias" is true, the function will try to match any ip alias
  1412.  * "address"'s might have if appropriate, this can be useful to match
  1413.  * multihomed hosts where the client requests e.g a bind connection.
  1414.  * Returns true if "rule" matched "address".
  1415.  */
  1416. struct hostent *
  1417. hostentdup __P((const struct hostent *hostent));
  1418. /*
  1419.  * Duplicates "hostent".
  1420.  * Returns:
  1421.  * On success: a pointer to the duplicated hostent.
  1422.  * On failure: NULL.
  1423.  */
  1424. void
  1425. hostentfree __P((struct hostent *hostent));
  1426. /*
  1427.  * Free's all resourced used by "hostent", including "hostent"
  1428.  * itself.  If "hostent" is NULL, nothing is done.
  1429.  */
  1430. int
  1431. socks_connect __P((int s, const struct sockshost_t *host));
  1432. /*
  1433.  * Tries to connect to "host".  If "host"'s address is not a ip address,
  1434.  * the function also tries to connect to any alias for "host"'s
  1435.  * name.  The connection is done using the open descriptor "s".
  1436.  * Returns:
  1437.  * On success: 0
  1438.  * On failure: -1
  1439.  */
  1440. struct route_t *
  1441. socks_connectroute __P((int s, struct socks_t *packet,
  1442. const struct sockshost_t *src,
  1443. const struct sockshost_t *dst));
  1444. /*
  1445.  * Finds a route from "src" to "dst" and connects to it "s".
  1446.  * If src or dst is NULL, that argument is ignored.
  1447.  *
  1448.  * The route used may take into account the contents of "packet->req",
  1449.  * which is assumed to be the packet that will be sent to a socksserver,
  1450.  * so it is recommended that it's contents be as conservative as possible.
  1451.  *
  1452.  * When it has successfully connected to a gateway it will set
  1453.  * the packet->method members to point to the methods the gateway
  1454.  * should be offered.
  1455.  *
  1456.  * Returns:
  1457.  * On success: the route that was used.
  1458.  * On failure: NULL.  If errno is 0, the reason for failure was
  1459.  * that no route was found.
  1460.  */
  1461. struct request_t *
  1462. socks_requestpolish __P((struct request_t *req, const struct sockshost_t *src,
  1463.    const struct sockshost_t *dst));
  1464. /*
  1465.  * Tries to "polish" the request "req" so that a later socks_getroute()
  1466.  * will succeed.
  1467.  * Returns:
  1468.  * On success: "req".
  1469.  * On failure: NULL.
  1470.  */
  1471. void
  1472. showstate __P((const struct serverstate_t *state));
  1473. /*
  1474.  * Shows "state".
  1475.  */
  1476. struct route_t *
  1477. addroute __P((const struct route_t *route));
  1478. /*
  1479.  * Appends a copy of "route" to our list of routes.
  1480.  * Returns a pointer to the added route.
  1481.  */
  1482. void
  1483. showroute __P((const struct route_t *route));
  1484. /*
  1485.  * prints the route "route".
  1486.  */
  1487. struct route_t *
  1488. socks_getroute __P((const struct request_t *req, const struct sockshost_t *src,
  1489.   const struct sockshost_t *dst));
  1490. /*
  1491.  * Tries to find a  route to be used for a connection going from
  1492.  * "src" to "dst".
  1493.  * If src or dst is NULL, that argument is ignored.
  1494.  *
  1495.  * The route used may take into account the contents of "req", which is
  1496.  * assumed to be the packet that will be sent to a socksserver, so it is
  1497.  * recommended that it's contents be as conservative as possible.
  1498.  *
  1499.  * Returns:
  1500.  * On success: pointer to route that should be used.
  1501.  * On failure: NULL (no socks route found).
  1502.  */
  1503. const char *
  1504. ruleaddress2string __P((const struct ruleaddress_t *rule, char *string,
  1505. size_t len));
  1506. /*
  1507.  * Writes "rule" out as a string.  The string is written to "string",
  1508.  * which is of length "len", including NUL termination.
  1509.  * Returns: "string".
  1510.  */
  1511. int
  1512. sockscode __P((int version, int code));
  1513. /*
  1514.  * Maps the socks replycode "code", which is in non-version specific format,
  1515.  * to the equivalent replycode in version "version".
  1516.  */
  1517. int
  1518. errno2reply __P((int errnum, int version));
  1519. /*
  1520.  * Returns the socks version "version" reply code for a error of type "errno".
  1521.  */
  1522. enum operator_t
  1523. string2operator __P((const char *operator));
  1524. /*
  1525.  * Returns the enum for the string representation of a operator.
  1526.  * Can't fail.
  1527.  */
  1528. const char *
  1529. operator2string __P((enum operator_t operator));
  1530. /*
  1531.  * Returns the string representation of the operator.
  1532.  * Can't fail.
  1533.  */
  1534. char *
  1535. str2vis __P((const char *string, size_t len));
  1536. /*
  1537.  * Visually encodes exactly "len" chars of "string".
  1538.  * Returns:
  1539.  * On success: the visually encoded string, to be free()'ed by caller.
  1540.  * On failure: NULL.  (out of memory).
  1541.  */
  1542. in_addr_t
  1543. socks_addfakeip __P((const char *name));
  1544. /*
  1545.  * Adds "name" to a internal table indexed by (fake)ip addresses.
  1546.  * Returns:
  1547.  * On success: "name"'s index.
  1548.  * On failure: INADDR_NONE
  1549.  */
  1550. const char *
  1551. socks_getfakehost __P((in_addr_t addr));
  1552. /*
  1553.  * If "addr" is a "fake" (non-resolved) addr, it returns the name
  1554.  * corresponding to it.
  1555.  * Else, NULL is returned.
  1556.  */
  1557. int
  1558. socks_getfakeip __P((const char *host, struct in_addr *addr));
  1559. /*
  1560.  * If "host" has a fake address entry, the address is written into
  1561.  * "addr".
  1562.  * Returns:
  1563.  * If a fake address exits: 1
  1564.  * Else: 0
  1565.  */
  1566. struct sockshost_t *
  1567. fakesockaddr2sockshost __P((const struct sockaddr *addr,
  1568.  struct sockshost_t *host));
  1569. /*
  1570.  * Identical to sockaddr2sockshost, but checks whether
  1571.  * the address in "addr" is a "fake" one when converting.
  1572.  */
  1573. int
  1574. sockaddrareeq __P((const struct sockaddr *a, const struct sockaddr *b));
  1575. /*
  1576.  * Compares the address "a" against "b".
  1577.  * Returns:
  1578.  * If "a" and "b" are equal: true
  1579.  * else: false
  1580.  */
  1581. int
  1582. sockshostareeq __P((const struct sockshost_t *a, const struct sockshost_t *b));
  1583. /*
  1584.  * Compares the address "a" against "b".
  1585.  * Returns:
  1586.  * If "a" and "b" are equal: true
  1587.  * else: false
  1588.  */
  1589. int
  1590. fdsetop __P((int nfds, int op, const fd_set *a, const fd_set *b,
  1591.  fd_set *result));
  1592. /*
  1593.  * Performs operation on descriptor sets.
  1594.  * "nfds" is the number of descriptors to perform "op" on in the sets
  1595.  * "a" and "b".
  1596.  * "op" is the operation to be performed on the descriptor sets and
  1597.  * can take on the value of standard C bitwise operators.
  1598.  * The result of the operation is stored in "result".
  1599.  *
  1600.  * Returns the number of the highest descriptor set in "result".
  1601.  * NOTES:
  1602.  * Operators supported is: AND ('&') and XOR ('^')
  1603.  */
  1604. int
  1605. methodisset __P((int method, const int *methodv, size_t methodc));
  1606. /*
  1607.  * Returns true if the method "method" is set in "methodv", false otherwise.
  1608.  * "methodc" is the length of "methodv".
  1609.  */
  1610. int
  1611. socketoptdup __P((int s));
  1612. /*
  1613.  * Duplicates the settings of "s" and returns a new socket with the
  1614.  * same settings.
  1615.  * Returns:
  1616.  * On success: the descriptor for the new socket
  1617.  * On failure: -1
  1618.  */
  1619. int
  1620. socks_mklock __P((const char *template));
  1621. /*
  1622.  * Creates a filedescriptor that can be used with socks_lock() and
  1623.  * socks_unlock().
  1624.  * Returns:
  1625.  * On success: filedescriptor
  1626.  * On failure: -1
  1627.  */
  1628. int
  1629. socks_lock __P((int fd, int type, int timeout));
  1630. /*
  1631.  * Looks the filedescriptor "fd".
  1632.  * "type" is the type of lock; F_RDLCK or F_WRLCK.
  1633.  * "timeout" is how long to wait for lock, supported values:
  1634.  * -1: forever.
  1635.  * 0 : don't wait.
  1636.  * Returns:
  1637.  * On success: 0
  1638.  * On error  : -1
  1639.  */
  1640. void
  1641. socks_unlock __P((int d));
  1642. /*
  1643.  * Unlocks the filedescriptor "d", previously locked by this process.
  1644.  */
  1645. #if defined(DEBUG) || HAVE_SOLARIS_BUGS
  1646. int
  1647. freedescriptors __P((const char *message));
  1648. /*
  1649.  * Returns the number on unallocated descriptors.
  1650.  */
  1651. #endif /* DEBUG) || HAVE_SOLARIS_BUGS */
  1652. #ifdef DEBUG
  1653. int
  1654. fd_isset __P((int fd, fd_set *fdset));
  1655. /* function version of FD_ISSET() */
  1656. #endif /* DEBUG */
  1657. /* replacements */
  1658. #if !HAVE_DAEMON
  1659. int daemon __P((int, int));
  1660. #endif  /* !HAVE_DAEMON */
  1661. #if !HAVE_GETDTABLESIZE
  1662. /* return upper limit on per-process open file descriptors */
  1663. int getdtablesize __P((void));
  1664. #endif  /* !HAVE_GETDTABLESIZE */
  1665. #if !HAVE_SNPRINTF
  1666. # ifdef STDC_HEADERS
  1667. int snprintf __P((char *, size_t, char const *, ...));
  1668. # else
  1669. int snprintf ();
  1670. # endif /* STDC_HEADERS */
  1671. int vsnprintf __P((char *, size_t, const char *, va_list));
  1672. #endif /* !HAVE_SNPRINTF */
  1673. #if !HAVE_SETPROCTITLE
  1674. #ifdef STDC_HEADERS
  1675. void setproctitle __P((const char *fmt, ...));
  1676. int initsetproctitle __P((int, char **, char **));
  1677. #else
  1678. void setproctitle();
  1679. int initsetproctitle __P((int, char **, char **));
  1680. #endif  /* STDC_HEADERS */
  1681. #endif  /* !HAVE_SETPROCTITLE */
  1682. #if !HAVE_SOCKATMARK
  1683. int sockatmark __P((int));
  1684. #endif  /* !HAVE_SOCKATMARK */
  1685. #if !HAVE_INET_ATON
  1686. int inet_aton __P((register const char *cp, struct in_addr *addr));
  1687. #endif  /* ! HAVE_ATON */
  1688. #if !HAVE_GETDTABLESIZE
  1689. int getdtablesize __P((void));
  1690. #endif  /* ! HAVE_GETDTABLESIZE */
  1691. #if !HAVE_STRERROR
  1692. char *__strerror __P((int, char *));
  1693. char *strerror __P((int));
  1694. const char *hstrerror __P((int));
  1695. #endif  /* !HAVE_STRERROR */
  1696. #if !HAVE_MEMMOVE
  1697. void * memmove __P((void *, const void *, register size_t));
  1698. #endif  /* !HAVE_MEMMOVE */
  1699. #if !HAVE_INET_PTON
  1700. int inet_pton __P((int af, const char *src, void *dst));
  1701. #endif
  1702. #if !HAVE_ISSETUGID
  1703. int issetugid __P((void));
  1704. #endif  /* !HAVE_ISSETUGID */
  1705. #if !HAVE_VSYSLOG
  1706. void vsyslog __P((int, const char *, va_list));
  1707. #endif  /* !HAVE_VSYSLOG */
  1708. __END_DECLS
  1709. /* XXX */
  1710. #if defined(SOCKS_CLIENT) || defined(SOCKS_SERVER)
  1711. #if SOCKS_CLIENT
  1712. #include "socks.h"
  1713. #endif
  1714. #if SOCKS_SERVER
  1715. #include "sockd.h"
  1716. #endif  /* SOCKS_CLIENT */
  1717. #endif  /* SOCKS_CLIENT || SOCKS_SERVER */