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

代理服务器

开发平台:

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: sockd.h,v 1.136 1999/12/22 09:29:20 karls Exp $ */
  44. #ifndef _SOCKD_H_
  45. #define _SOCKD_H_
  46. #endif
  47. /* use caching version in server. */
  48. #define gethostbyname(name) cgethostbyname(name)
  49. #define gethostbyaddr(addr, len, type) cgethostbyaddr(addr, len, type)
  50. #ifdef lint
  51. extern const int lintnoloop_sockd_h;
  52. #else
  53. #define lintnoloop_sockd_h 0
  54. #endif
  55. #define INIT(length)
  56. const size_t start = state->start;
  57. const size_t end = start + (length);
  58. errno = 0
  59. #define MEMLEFT() (sizeof(state->mem) - state->reqread)
  60. #define LEFT() ((end) - state->reqread)
  61. /*
  62.  * Returns the number of bytes left to read.
  63.  */
  64. #define READ(s, length) (readn((s), &state->mem[state->reqread], (length)))
  65. /*
  66.  * "s" is the descriptor to read from.
  67.  * "length" is how much to read.
  68.  * Returns the number of bytes read, -1 on error.
  69.  */
  70. #define OBJECTFILL(object) memcpy((object), &state->mem[start], end - start)
  71. /*
  72.  * Fills "object" with data.
  73.  */
  74. #define CHECK(object, nextfunction)
  75. do {
  76. int p;
  77. if (LEFT()) {
  78. SASSERT(LEFT() > 0);
  79. if (LEFT() > MEMLEFT())
  80. SERRX(MEMLEFT());
  81. errno = 0;
  82. if ((p = READ(s, LEFT())) <= 0)
  83. return p;
  84. state->reqread += p;
  85. if (LEFT())
  86. return p;
  87. state->start = end;
  88. OBJECTFILL((object));
  89. state->rcurrent = nextfunction;
  90. if (state->rcurrent != NULL)
  91. return state->rcurrent(s, request, state);
  92. }
  93. } while (lintnoloop_sockd_h)
  94. #define SOCKD_NEWREQUEST 1 /* sending a new request */
  95. #define SOCKD_FREESLOT 2 /* free'd a slot. */
  96. /* a requestchild can currently only handle a maximum of one client. */
  97. #define SOCKD_REQUESTMAX 1
  98. /* IO stuff. */
  99. #define IO_SRCBLOCK -4
  100. #define IO_ERRORUNKNOWN -3
  101. #define IO_TIMEOUT -2
  102. #define IO_ERROR -1
  103. #define IO_CLOSE 0
  104. /* types of children. */
  105. #define CHILD_MOTHER 1
  106. #define CHILD_IO 2
  107. #define CHILD_NEGOTIATE 3
  108. #define CHILD_REQUEST 4
  109. #define FDPASS_MAX 3 /* max number of descriptors we send/receive. */
  110. /*
  111.  * config stuff
  112. */
  113. #define VERDICT_BLOCKs "block"
  114. #define VERDICT_PASSs "pass"
  115. #define LOG_CONNECTs "connect"
  116. #define LOG_DISCONNECTs "disconnect"
  117. #define LOG_DATAs "data"
  118. #define LOG_ERRORs "error"
  119. #define LOG_IOOPERATIONs "iooperation"
  120. #define OPERATION_ACCEPT 1
  121. #define OPERATION_CONNECT (OPERATION_ACCEPT + 1)
  122. #define OPERATION_IO (OPERATION_CONNECT + 1)
  123. #define OPERATION_DISCONNECT (OPERATION_IO + 1)
  124. #define OPERATION_ABORT (OPERATION_DISCONNECT + 1)
  125. #define OPERATION_ERROR (OPERATION_ABORT + 1)
  126. struct log_t {
  127. unsigned connect:1;
  128. unsigned disconnect:1;
  129. unsigned data:1;
  130. unsigned error:1;
  131. unsigned iooperation:1;
  132. unsigned :0;
  133. };
  134. struct timeout_t {
  135. time_t negotiate; /* how long negotiation can last. */
  136. time_t io; /* how long connection lasts without i/o. */
  137. };
  138. struct linkedname_t {
  139. char *name;
  140. struct linkedname_t *next; /* next name in list. */
  141. };
  142. /* linked list over current rules. */
  143. struct rule_t {
  144. struct ruleaddress_t dst; /* dst. */
  145. struct log_t log; /* type of logging to do. */
  146. int number; /* rulenumber, info/debugging only. */
  147. struct ruleaddress_t src; /* src. */
  148. struct serverstate_t state;
  149. struct linkedname_t *user; /* name of users allowed. */
  150. int verdict; /* verdict for this rule. */
  151. #if HAVE_LIBWRAP
  152. char libwrap[LIBWRAPBUF]; /* libwrapline. */
  153. #endif  /* HAVE_LIBWRAP */
  154. struct rule_t *next; /* next rule in list. */
  155. };
  156. struct srchost_t {
  157. unsigned nomismatch:1; /* deny mismatch between claim and fact? */
  158. unsigned nounknown:1; /* deny no fact? */
  159. unsigned :0;
  160. };
  161. struct option_t {
  162. char *configfile; /* name of configfile. */
  163. unsigned daemon:1; /* run as a daemon? */
  164. int debug; /* debug level. */
  165. unsigned keepalive:1; /* set SO_KEEPALIVE? */
  166. unsigned lbuf:1; /* line buffered output? */
  167. int sleep; /* sleep at misc. places. (debugging) */
  168. int serverc; /* number of servers. */
  169. };
  170. struct userid_t {
  171. uid_t privileged;
  172. unsigned privileged_isset:1;
  173. uid_t unprivileged;
  174. unsigned unprivileged_isset:1;
  175. uid_t libwrap;
  176. unsigned libwrap_isset:1;
  177. };
  178. struct configstate_t {
  179. unsigned init:1;
  180. volatile sig_atomic_t addchild; /* okay to do a addchild()? */
  181. uid_t euid; /* original euid. */
  182. pid_t *motherpidv; /* pid of mothers. */
  183. pid_t pid; /* pid of current process. */
  184. int type; /* process type we are. */
  185. };
  186. struct listenaddress_t {
  187. struct sockaddr_in addr; /* bound address. */
  188. int s; /* bound socket. */
  189. #if NEED_ACCEPTLOCK
  190. int lock; /* lock on structure. */
  191. #endif
  192. };
  193. struct statistic_t {
  194. time_t boot; /* time of serverstart. */
  195. size_t accepted; /* connections accepted. */
  196. struct {
  197. size_t sendt; /* clients sent to children. */
  198. size_t received; /* clients received back. */
  199. } negotiate;
  200. struct {
  201. size_t sendt; /* clients sent to children. */
  202. size_t received; /* clients received back. */
  203. } request;
  204. struct {
  205. size_t sendt; /* clients sent to children. */
  206. } io;
  207. };
  208. /* Make sure to keep in sync with clearconfig(). */
  209. struct config_t {
  210. struct listenaddress_t *internalv; /* internal address'. */
  211. int internalc;
  212. struct sockaddr_in *externalv; /* external address'. */
  213. int externalc;
  214. struct rule_t *crule; /* clientrules, list. */
  215. struct rule_t *srule; /* socksrules, list. */
  216. struct route_t *route; /* not in use yet. */
  217. struct compat_t compat; /* compatibility options.  */
  218. struct extension_t extension; /* extensions set. */
  219. struct logtype_t log; /* where to log. */
  220. struct option_t option; /* commandline options. */
  221. int resolveprotocol; /* resolve protocol. */
  222. struct srchost_t srchost; /* relevant to srchost. */
  223. struct statistic_t stat; /* some statistics. */
  224. struct configstate_t state;
  225. struct timeout_t timeout; /* timeout values. */
  226. struct userid_t uid; /* userids. */
  227. int methodv[AUTHMETHOD_MAX];/* methods by priority. */
  228. int methodc; /* methods in list. */
  229. };
  230. struct connectionstate_t {
  231. struct authmethod_t auth;
  232. int command;
  233. struct extension_t extension; /* extensions set. */
  234. int protocol;
  235. struct {
  236. time_t accept; /* time of connection accept. */
  237. time_t negotiate_start; /* time negotiation started. */
  238. } time;
  239. int version;
  240. };
  241. struct sockd_io_direction_t {
  242. int s; /* socket connection. */
  243. struct sockaddr_in laddr; /* local address of s. */
  244. struct sockaddr_in raddr; /* address of remote peer for s. */
  245. struct connectionstate_t state;
  246. size_t sndlowat; /* low-water mark for send. */
  247. /* byte count */
  248. size_t read; /* bytes read. */
  249. size_t written; /* bytes written. */
  250. int flags; /* misc. flags */
  251. };
  252. struct sockd_io_t {
  253. unsigned allocated:1;/* object allocated? */
  254. struct connectionstate_t state;
  255. struct sockd_io_direction_t in; /* client we receive data from. */
  256. struct sockd_io_direction_t out; /* remote peer. */
  257. struct sockd_io_direction_t control; /* control connection to client. */
  258. struct rule_t acceptrule; /* rule matched for accept(). */
  259. struct rule_t rule; /* matched rule for i/o. */
  260. struct sockshost_t src; /* our client. */
  261. struct sockshost_t dst; /* it's desired peer. */
  262. time_t time; /* time of last i/o operation. */
  263. struct sockd_io_t *next; /* for some special cases. */
  264. };
  265. struct negotiate_state_t {
  266. unsigned complete:1; /* completed? */
  267. unsigned char mem[ 1 /* VER */
  268. + 1 /* NMETHODS */
  269. + AUTHMETHOD_MAX /* METHODS */
  270. + sizeof(struct request_t)
  271. ];
  272. int reqread; /* read so far. */
  273. size_t start; /* start of current req */
  274. char emsg[256]; /* errormessage, if any.*/
  275. int (*rcurrent)(int s,
  276.    struct request_t *request,
  277. struct negotiate_state_t *state);
  278. };
  279. struct sockd_negotiate_t {
  280. unsigned allocated:1;
  281. unsigned ignore:1; /* ignore for now? */
  282. struct request_t req;
  283. struct negotiate_state_t negstate;
  284. struct rule_t rule; /* rule matched for accept(). */
  285. int s; /* client connection. */
  286. struct sockshost_t src; /* client address. */
  287. struct sockshost_t dst; /* our address. */
  288. struct connectionstate_t state; /* state of connection. */
  289. };
  290. struct sockd_request_t {
  291. struct sockaddr_in from; /* client's control address. */
  292. struct request_t req; /* request to perform. */
  293. struct rule_t rule; /* rule matched for accept(). */
  294. int s; /* clients control connection. */
  295. struct connectionstate_t state; /* state of connection. */
  296. struct sockaddr_in to; /* address client was accepted on. */
  297. };
  298. struct sockd_mother_t {
  299. int s; /* connection to child for ancillary. */
  300. #if HAVE_SENDMSG_DEADLOCK
  301. int lock; /* lock on request connection. */
  302. #endif /* HAVE_SENDMSG_DEADLOCK */
  303. int ack; /* connection for ack's. */
  304. };
  305. struct sockd_child_t {
  306. int type; /* child type. */
  307. pid_t pid; /* childs pid. */
  308. int freec; /* free slots on last count. */
  309. int s; /* connection to mother for ancillary. */
  310. #if HAVE_SENDMSG_DEADLOCK
  311. int lock; /* lock on request connection. */
  312. #endif /* HAVE_SENDMSG_DEADLOCK */
  313. int ack; /* connection for ack's. */
  314. };
  315. /* functions */
  316. __BEGIN_DECLS
  317. int
  318. sockd_bind __P((int s, const struct sockaddr *addr, size_t retries));
  319. /*
  320.  * Binds the address "addr" to the socket "s".  The bind call will
  321.  * be tried "retries" + 1 times if the error is EADDRINUSE, or until
  322.  * successful, whatever comes first.
  323.  * Returns:
  324.  * On success: 0.
  325.  * On failure: -1
  326.  */
  327. int
  328. socks_permit __P((int client, struct socks_t *dst, int permit));
  329. /*
  330.  * "client" is the connection to the client from which the request in
  331.  * "dst" was made.  "permit" is the result of a rulecheck.
  332.  * The function sends a correct reply to the connection on "client" if
  333.  * "permit" indicates the connection is not to be allowed.
  334.  * Returns:
  335.  * If connection allowed: true.
  336.  * If connection disallowed: false.
  337.  */
  338. int
  339. sockdio __P((struct sockd_io_t *io));
  340. /*
  341.  * Tries to send the io object "io" to a child.
  342.  * If no child is able to accept the io a new one is created and
  343.  * the attempt is retried.
  344.  *
  345.  * Returns
  346.  *    On success: 0
  347.  *    On failure: -1, io was not accepted by any child.
  348.  */
  349. int
  350. pidismother __P((pid_t pid));
  351. /*
  352.  * If "pid" refers to a mother, the number of "pid" in
  353.  * state.motherpidv is returned.  Numbers are counted from 1.
  354.  * IF "pid" is no mother, 0 is returned.
  355.  */
  356. int
  357. childcheck __P((int type));
  358. /*
  359.  * Calculates the number of free slots every child of type "type" has
  360.  * combined.  If "type" is negated, the function instead returns
  361.  * the total number of slots in every child.
  362.  * If childcheck() is successful it also means there is at the minimum
  363.  * one descriptor available.
  364.  * Returns the total number of new objects children can accept.
  365.  */
  366. int
  367. childtype __P((pid_t pid));
  368. /*
  369.  * Returns the type of child the child with pid "pid" is.
  370.  */
  371. const char *
  372. childtype2string __P((int type));
  373. /*
  374.  * returns the string representation of "type".
  375.  */
  376. int
  377. removechild __P((pid_t childpid));
  378. /*
  379.  * Removes the child "child" with pid "childpid" and updates internal lists.
  380.  * Returns:
  381.  * On success: 0
  382.  * On failure: -1 (no current proxychild has pid "childpid".)
  383.  */
  384. struct rule_t *
  385. addclientrule __P((const struct rule_t *rule));
  386. /*
  387.  * Appends a copy of "rule" to our list of client rules.
  388.  * Returns a pointer to the added rule (not "rule").
  389.  */
  390. struct rule_t *
  391. addsocksrule __P((const struct rule_t *rule));
  392. /*
  393.  * Appends a copy of "rule" to our list of socks rules.
  394.  * Returns a pointer to the added rule (not "rule").
  395.  */
  396. struct linkedname_t *
  397. adduser __P((struct linkedname_t **ruleuser, const char *name));
  398. /*
  399.  * Adds a user with the name "name" to the list hanging of "ruleuser".
  400.  * Returns:
  401.  * On success: a pointer ruleuser.
  402.  * On failure: NULL.
  403.  */
  404. void
  405. showrule __P((const struct rule_t *rule));
  406. /*
  407.  * prints the rule "rule".
  408.  */
  409. void
  410. showclient __P((const struct rule_t *rule));
  411. /*
  412.  * prints the clientrule "rule".
  413.  */
  414. void
  415. showconfig __P((const struct config_t *config));
  416. /*
  417.  * prints out config "config".
  418.  */
  419. int
  420. rulespermit __P((int s, struct rule_t *rule,
  421.   struct connectionstate_t *state,
  422.   const struct sockshost_t *src, const struct sockshost_t *dst));
  423. /*
  424.  * Checks whether the rules permit data from "src" to "dst".
  425.  * "s" is the socket the connection is on.  "state" is the current
  426.  * state of the connection and may be updated.
  427.  *
  428.  * Wildcard fields are supported for the following fields;
  429.  * ipv4: INADDR_ANY
  430.  * port: none [enum]
  431.  *
  432.  * "rule" is filled in with the contents of the matching rule.
  433.  * Returns:
  434.  * True if a connection should be allowed.
  435.  * False otherwise.
  436.  */
  437. int
  438. sockd_connect __P((int s, const struct sockshost_t *dst));
  439. /*
  440.  * Tries to connect socket "s" to the host given in "dst".
  441.  * Returns:
  442.  * On success: 0
  443.  * On failure: -1
  444.  */
  445. void
  446. resetconfig __P((void));
  447. /*
  448.  * resets the current config back to default, freeing memory aswell.
  449.  */
  450. void
  451. send_failure __P((int s, const struct response_t *response, int failure));
  452. /*
  453.  * Sends a failure message to the client at "s".  "response" is the packet
  454.  * we send, "failure" is the reason for failure and "auth" is the agreed on
  455.  * authentication.
  456.  */
  457. int
  458. send_response __P((int s, const struct response_t *response));
  459. /*
  460.  * Sends "response" to "s".
  461.  * On success: 0
  462.  * On failure: -1
  463.  */
  464. int
  465. send_req __P((int s, const struct sockd_request_t *req));
  466. /*
  467.  * Sends "req" to "s".
  468.  * Returns:
  469.  * On success: 0
  470.  * On failure: -1
  471.  */
  472. int
  473. send_client __P((int s, int client));
  474. /*
  475.  * Sends the client "client" to "s".
  476.  * Returns:
  477.  * On success: 0
  478.  * On failure: -1
  479.  */
  480. /*
  481.  * Returns a value indicating whether relaying from "src" to "dst" should
  482.  * be permitted.
  483.  */
  484. int
  485. selectmethod __P((const unsigned char *methodv, size_t methodc));
  486. /*
  487.  * Selects the best method based on available methods and given
  488.  * priority.  "methodv" is a list over available methods, methodc
  489.  * in length.
  490.  * The function returns the value of the method that should be selected,
  491.  * AUTMETHOD_NOACCEPT if none is acceptable.
  492.  */
  493. int
  494. method_uname __P((int s, struct request_t *request,
  495. struct negotiate_state_t *state));
  496. /*
  497.  * Enters username/password subnegotiation.  If successful,
  498.  * "uname" is filled in with values read from client, if unsuccessful,
  499.  * the contents of "uname" is indeterminate.  After negotiation has
  500.  * finished and response to client is sent the function returns.
  501.  * Returns:
  502.  * On success: 0 (user/password accepted)
  503.  * On failure: -1  (user/password not accepted, communication failure,
  504.  *   or something else.)
  505.  */
  506. void
  507. iolog __P((struct rule_t *rule, const struct connectionstate_t *state,
  508. int operation,
  509. const struct sockshost_t *src, const struct sockshost_t *dst,
  510. const char *data, size_t count));
  511. /*
  512.  * Called after each each complete io operation
  513.  * (read then write, or read then block).
  514.  * Does misc. logging based on the logoptions set in "log".
  515.  * "rule" is the rule that matched the iooperation, not "const" due to
  516.  * possible libwrap interaction.
  517.  * "state" is the state of the connection.
  518.  * "operation" is the operation that was performed.
  519.  * "src" is where data was read from.
  520.  * "dst" is where data was written to.
  521.  * "data" and "count" are interpreted depending on "operation".
  522.  *
  523.  * If "operation" is
  524.  *    OPERATION_ACCEPT
  525.  * OPERATION_CONNECT
  526.  *    OPERATION_DISCONNECT
  527.  * "data" and "count" is ignored.
  528.  *
  529.  * OPERATION_ABORT
  530.  * OPERATION_ERROR
  531.  * "count" is ignored.
  532.  * If "data" is not NULL, it is a string giving the reason for abort
  533.  * or error.
  534.  * If "data" is NULL, the reason is the errormessage affiliated
  535.  * with the current errno.
  536.  *
  537.  * OPERATION_IO
  538.  * "data" is the data that was read and written.
  539.  * "count" is the number of bytes that was read/written.
  540.  */
  541. int
  542. serverchild __P((int s, const struct sockaddr_in *local,
  543.   const struct sockaddr_in *remote));
  544. /*
  545.  * Forked off by the server after a connection has come in on "s" but
  546.  * before any data has been read.  "local" is the address "remote"
  547.  * connected to.
  548.  * Returns:
  549.  * On success: 0
  550.  * On failure : -1
  551.  */
  552. void
  553. close_iodescriptors __P((const struct sockd_io_t *io));
  554. /*
  555.  * A subset of delete_io().  Will just close all descriptors in
  556.  * "io".
  557.  */
  558. int
  559. sockdnegotiate __P((int s));
  560. /*
  561.  * Sends the connection "s" to a negotiator child.
  562.  * Returns:
  563.  * On success: 0
  564.  * On failure: -1
  565.  */
  566. void
  567. run_io __P((struct sockd_mother_t *mother));
  568. /*
  569.  * Sets a io child running.  "mother" is the childs mother.
  570.  *
  571.  * A child starts running with zero clients and waits
  572.  * indefinitely for mother to send atleast one.
  573.  */
  574. void
  575. run_negotiate __P((struct sockd_mother_t *mother));
  576. /*
  577.  * Sets a negotiator child running.  "mother" is the childs mother.
  578.  * A child starts running with zero clients and waits
  579.  * indefinitely for mother to send atleast one.
  580.  */
  581. void
  582. run_request __P((struct sockd_mother_t *mother));
  583. /*
  584.  * Sets a request child running.  "mother" is the childs mother.
  585.  * "mread" is read connection to mother, "mwrite" is write connection.
  586.  * A child starts running with zero clients and waits
  587.  * indefinitely for mother to send atleast one.
  588.  */
  589. int
  590. send_io __P((int s, const struct sockd_io_t *io));
  591. /*
  592.  * Tries to add send the io "io" to "s".
  593.  * Returns
  594.  *    On success: 0
  595.  *    On failure: -1
  596.  */
  597. int
  598. recv_io __P((int mother, struct sockd_io_t *io));
  599. /*
  600.  * Attempts to read a new io object from "mother".
  601.  * If a io is received it is either copied into "io", or it's copied
  602.  * to a internal list depending on if "io" is NULL or not;  thus mother
  603.  * vs child semantics.  If semantics are those of a child, the request
  604.  * field of "io" is sent to the controlconnection in "io".
  605.  * Returns:
  606.  * On success: 0
  607.  * On failure: -1
  608.  */
  609. int
  610. recv_req __P((int s, struct sockd_request_t *req));
  611. /*
  612.  * Receives a request from "s" and writes it to "req".
  613.  * Returns:
  614.  * On success: 0
  615.  * On failure: -1
  616.  */
  617. int
  618. recv_request __P((int s, struct request_t *request,
  619. struct negotiate_state_t *state));
  620. /*
  621.  * Reads a socks request from the socket "s", which can be set to
  622.  * non-blocking.
  623.  * "request" will be filled in as reading progresses but it should
  624.  * be considered of indeterminate contents untill the whole request
  625.  * has been read.
  626.  * Returns:
  627.  *    On success: > 0
  628.  *    On failure: <= 0.  If errno does not indicate the request should be
  629.  *                       be retried, the connection "s" should be dropped.
  630.  */
  631. int
  632. recv_sockspacket __P((int s, struct request_t *request,
  633.  struct negotiate_state_t *state));
  634. /*
  635.  * When methodnegotiation has finished (if appropriate) this function
  636.  * is called to receive the actual packet.
  637.  * Returns:
  638.  *    On success: > 0
  639.  *    On failure: <= 0.  If errno does not indicate the request should be
  640.  *                       be retried, the connection "s" should be dropped.
  641.  */
  642. struct sockd_child_t *
  643. addchild __P((int type));
  644. /*
  645.  * Adds a new child that can accept objects of type "type" from mother.
  646.  * Returns:
  647.  *    On success: a pointer to the added child.
  648.  *    On failure: NULL.  (resource shortage.)
  649.  */
  650. struct sockd_child_t *
  651. getchild __P((pid_t pid));
  652. /*
  653.  * Attempts to find a child with pid "pid".
  654.  * Returns:
  655.  * On success: a pointer to the found child.
  656.  * On failure: NULL.
  657.  */
  658. void
  659. sigchildbroadcast __P((int sig, int childtype));
  660. /*
  661.  * Sends signal "sig" to all children of type "childtype".
  662.  */
  663. int
  664. fillset __P((fd_set *set));
  665. /*
  666.  * Sets every child's descriptor in "set", aswell as sockets we listen on.
  667.  * Returns the number of the highest descriptor set, or -1 if none was set.
  668.  */
  669. void
  670. clearset __P((int type, const struct sockd_child_t *child, fd_set *set));
  671. /*
  672.  * Clears every descriptor of type "type" in "child" from "set".
  673.  * The values valid for "type" is SOCKD_NEWREQUEST or SOCKD_FREESLOT.
  674.  */
  675. struct sockd_child_t *
  676. getset __P((int type, fd_set *set));
  677. /*
  678.  * If there is a child with a descriptor set in "set", a pointer to
  679.  * the child is returned.  "type" gives the type of descriptor that must
  680.  * be set, either SOCKD_NEWREQUEST or SOCKD_FREESLOT.
  681.  * The children returned are returned in prioritised order.
  682.  * If no child is found, NULL is returned.
  683.  */
  684. struct sockd_child_t *
  685. nextchild __P((int type));
  686. /*
  687.  * Returns:
  688.  * On success: pointer to a child of correct type with atleast one free slot.
  689.  * On failure: NULL.
  690.  */
  691. void
  692. setsockoptions(int s);
  693. /*
  694.  * Sets options _all_ serversockets should have set.
  695.  */
  696. void
  697. sockdexit __P((int sig));
  698. /*
  699.  * Called both by signal and manually.
  700.  * If "sig" is less than 0, assume it's manually and exit with absolute
  701.  * value of "sig".
  702.  * Otherwise report exit due to signal "sig".
  703.  */
  704. struct hostent *
  705. cgethostbyname __P((const char *name));
  706. /*
  707.  * Identical to gethostbyname() but caches info.
  708.  */
  709. struct hostent *
  710. cgethostbyaddr __P((const char *addr, int len, int type));
  711. /*
  712.  * Identical to gethostbyaddr() but caches info.
  713.  */
  714. void
  715. socks_seteuid __P((uid_t *old, uid_t new));
  716. /*
  717.  * Sets euid to "new".  If "old" is not NULL, current euid is saved in it.
  718.  * Exits on failure.
  719.  */
  720. void
  721. socks_reseteuid __P((uid_t current, uid_t new));
  722. /*
  723.  * "Resets" euid back from "current" to "new".
  724.  * If the operation fails, it's flagged as an internal error.
  725.  */
  726. int
  727. passwordcheck __P((const char *name, const char *cleartextpassword));
  728. /*
  729.  * Checks whether "name" is in the passwordfile.
  730.  * If "cleartextpassword" is not NULL, also checks if "name"'s
  731.  * password is "cleartextpassword".
  732.  *
  733.  * Returns:
  734.  * If "name" and "cleartextpassword" is matched: 0
  735.  * If "name" is unknown: 1
  736.  * If "cleartextpassword" does not match: 2
  737.  */
  738. #ifdef DEBUG
  739. void
  740. printfd __P((const struct sockd_io_t *io, const char *prefix));
  741. /*
  742.  * prints the contents of "io".  "prefix" is the string prepended
  743.  * to the printing. (typically "received" or "sent".)
  744.  */
  745. #endif
  746. __END_DECLS