📄 common.h
字号:
*/ in_port_t srcport; /* 75-76: connect request; port used * on client behalf. */ in_port_t boundport; /* 77-78: bind request; port used * on client behalf. */ in_addr_t boundaddr; /* 79-82: addr used on client behalf*/ char pad30[90]; /* 83-172 */ } _6; } packet;};struct msproxy_response_t { int32_t packetid; /* 1-4 */ int32_t magic5; /* 5-8 */ int32_t serverid; /* 9-12 */ char clientack; /* 13: ack of last client packet. */ char pad5[3]; /* 14-16 */ unsigned char sequence; /* 17: sequence # of this packet. */ char pad10[7]; /* 18-24 */ char RWSP[4]; /* 25-28: 0x52,0x57,0x53,0x50 */ char pad15[8]; /* 29-36 */ int16_t command; /* 37-38 */ union { struct { char pad5[18]; /* 39-56 */ int16_t magic20; /* 57-58: 0x02, 0x00 */ char pad10[6]; /* 59-64 */ int16_t magic30; /* 65-66: 0x74, 0x01 */ char pad15[2]; /* 67-68 */ int16_t magic35; /* 69-70: 0x0c, 0x00 */ char pad20[6]; /* 71-76 */ int16_t magic50; /* 77-78: 0x04, 0x00 */ char pad30[6]; /* 79-84 */ int16_t magic60; /* 85-86: 0x65, 0x05 */ char pad35[2]; /* 87-88 */ int16_t magic65; /* 89-90: 0x02, 0x00 */ char pad40[8]; /* 91-98 */ in_port_t udpport; /* 99-100 */ in_addr_t udpaddr; /* 101-104 */ } _1; struct { char pad5[18]; /* 39-56 */ int16_t magic5; /* 57-58: 0x01, 0x00 */ } _2; struct { char pad1[6]; /* 39-44 */ int32_t magic10; /* 45-48 */ char pad3[10]; /* 49-58 */ in_port_t boundport; /* 59-60: port server bound for us. */ in_addr_t boundaddr; /* 61-64: addr server bound for us. */ char pad10[4]; /* 65-68 */ int16_t magic15; /* 69-70 */ char pad15[102]; /* 70-172 */ char NTLMSSP[sizeof("NTLMSSP")]; /* 173-180: "NTLMSSP" */ int16_t magic50; /* 181-182: 0x02, 0x00 */ char pad50[2]; /* 183-184 */ int16_t magic55; /* 185-186: 0x08, 0x00 */ int16_t magic60; /* 187-188: 0x08, 0x00 */ int16_t magic65; /* 189-190: 0x28, 0x00 */ char pad60[2]; /* 191-192 */ int16_t magic70; /* 193-194: 0x96, 0x82 */ int16_t magic75; /* 195-196: 0x01, 0x00 */ char pad70[16]; /* 197-212 */ char ntdomain[257]; /* 213-EOP */ } _3; struct { char pad5[134]; /* 39-172 */ } _4; struct { unsigned char addroffset; /* 39: weird, probably wrong. */ char pad5[13]; /* 40-52 */ in_addr_t hostaddr; /* ?-?+4 */ } resolve; struct { int16_t magic1; /* 39-40 */ char pad5[18]; /* 41-58 */ in_port_t clientport; /* 59-60: forwarded port. */ in_addr_t clientaddr; /* 61-64: forwarded address. */ int32_t magic10; /* 65-68 */ int32_t magic15; /* 69-72 */ in_port_t serverport; /* 73-74: port server will connect * to us from. */ in_port_t srcport; /* 75-76: connect request; port used * on client behalf. */ in_port_t boundport; /* 77-78: bind request; port used * on client behalf. */ in_addr_t boundaddr; /* 79-82: addr used on client behalf*/ char pad10[90]; /* 83-172 */ } _5; } packet;};struct request_t { unsigned char version; unsigned char command; unsigned char flag; struct sockshost_t host; struct authmethod_t *auth; /* pointer to level above. */};struct response_t { unsigned char version; unsigned char reply; unsigned char flag; struct sockshost_t host; struct authmethod_t *auth; /* pointer to level above. */};/* encapsulation for udp packets. */struct udpheader_t { unsigned char flag[2]; unsigned char frag; struct sockshost_t host;};/* interface request packet. */struct interfacerequest_t { unsigned char rsv; unsigned char sub; unsigned char flag; struct sockshost_t host;};/* method username */struct uname_t { unsigned char version; char name[MAXNAMELEN]; char password[MAXPWLEN];};/* method rfc931 */struct rfc931_t { char name[MAXNAMELEN];};/* this must be big enough to hold a complete method request. */struct authmethod_t { int matched; /* authentication matched? */ int method; /* method in use. */ union { struct uname_t uname; struct rfc931_t rfc931; } mdata;};struct method_t { unsigned none:1; unsigned uname:1; unsigned :0;};struct protocol_t { unsigned tcp:1; unsigned udp:1; unsigned :0;};struct command_t { unsigned bind:1; unsigned connect:1; unsigned udpassociate:1; /* not real commands as per standard, but they have their use. */ unsigned bindreply:1; /* reply to bind command. */ unsigned udpreply:1; /* reply to udp packet. */ unsigned :0;};struct proxyprotocol_t { unsigned socks_v4:1; unsigned socks_v5:1; unsigned msproxy_v2:1; unsigned :0;};struct serverstate_t { struct command_t command; struct extension_t extension; struct protocol_t protocol; int methodv[AUTHMETHOD_MAX];/* methods to offer. */ int methodc; /* number of methods set. */ struct proxyprotocol_t proxyprotocol;};struct msproxy_state_t { struct sockaddr_in controladdr; /* udp address of proxyserver. */ int32_t magic25; int32_t bindid; int32_t clientid; int32_t serverid; unsigned char seq_recv; /* seq number of last packet recv. */ unsigned char seq_sent; /* seq number of last packet sent. */};struct gateway_t { struct sockshost_t host; struct serverstate_t state;};/* values in parentheses designate "don't care" values. */struct socksstate_t { int acceptpending; /* a accept pending? (-1) */ struct authmethod_t auth; /* authentication in use. */ int command; /* command (-1) */ int err; /* if request failed, errno. */ int inprogress; /* operation in progress? (-1) */#ifdef SOCKS_TRYHARDER int lock; /* some calls require a lock. */#endif struct msproxy_state_t msproxy; /* if msproxy, msproxy state. */ struct protocol_t protocol; /* protocol in use. */ unsigned udpconnect:1; /* connected udp socket? */ int system; /* don't check, use system call. */ int version; /* version */};struct ruleaddress_t { char atype; union { char domain[MAXHOSTNAMELEN]; struct { struct in_addr ip; struct in_addr mask; } ipv4; } addr; struct { in_port_t tcp; /* tcp portstart or field to operator on. */ in_port_t udp; /* udp portstart or field to operator on. */ } port; in_port_t portend; /* only used if operator is range. */ enum operator_t operator; /* operator to compare ports via. */};struct route_t { int number; /* routenumber. */ struct { unsigned bad:1; /* route is bad? */ unsigned direct:1; /* direct connection, no proxy. */ unsigned :0; } state; struct ruleaddress_t src; struct ruleaddress_t dst; struct gateway_t gw; struct route_t *next; /* next route in list. */};struct socks_t { unsigned char version; /* * Negotiated version. Each request and * response will also contain a version number, that * is the version number given for that particular * packet and should be checked to make sure it is * the same as the negotiated version. */ struct request_t req; struct response_t res; struct authmethod_t auth; struct gateway_t gw; struct socksstate_t state;};enum portcmp { e_lt, e_gt, e_eq, e_neq, e_le, e_ge, e_nil };typedef enum portcmp Portcmp;/* * for use in generic functions that take either reply or request * packets, include a field indicating what it is. */#define SOCKS_REQUEST 0x1#define SOCKS_RESPONSE 0x2struct socksfd_t { unsigned allocated:1;/* allocated? */ int control; /* control connection to server. */ struct socksstate_t state; /* state of this connection. */ unsigned :0; struct sockaddr local; /* local address of data connection. */ unsigned :0; struct sockaddr server; /* remote address of data connection. */ unsigned :0; struct sockaddr remote; /* address server is using on our behalf. */ unsigned :0; struct sockaddr reply; /* address to expect reply from. */ /* XXX union this. */ unsigned :0; struct sockaddr accepted; /* address server accepted for us. */ unsigned :0; struct sockaddr connected; /* address server connected to for us. */ struct route_t *route;};__BEGIN_DECLS/* * versions of BSD's error functions that log via slog() instead. */#ifdef STDC_HEADERSvoid serr(int eval, const char *fmt, ...);#elsevoid serr();#endif /* STDC_HEADERS */#ifdef STDC_HEADERSvoid serrx(int eval, const char *fmt, ...);#elsevoid serrx();#endif /* STDC_HEADERS */#ifdef STDC_HEADERSvoid swarn(const char *fmt, ...);#elsevoid swarn();#endif /* STDC_HEADERS */#ifdef STDC_HEADERSvoid swarnx(const char *fmt, ...);#elsevoid swarnx();#endif /* STDC_HEADERS */voidgenericinit __P((void));/* * Generic init, called after clientinit()/serverinit(). */voidinitlog __P((void));/* * (Re)initialize logging. */struct udpheader_t *sockaddr2udpheader __P((const struct sockaddr *to, struct udpheader_t *header));/* * Writes a udpheader representation of "to" to "header". * Returns a pointer to "header". */char *udpheader_add __P((const struct sockshost_t *host, char *msg, size_t *len, size_t msgsize));/* * Prefixes the udpheader_t version of "host" to a copy of "msg", * which is of length "len". * "msgsize" gives the size of the memory pointed to by "msg". * If "msgsize" is large enough the function will prepend the udpheader * to "msg" directly (moving the old contents to the right) rather than * allocating new memory. * Upon return "len" gives the length of the new "msg". * * Returns: * On success: "msg" with the udpheader prepended. * On failure: NULL (out of memory). */struct udpheader_t *string2udpheader __P((const char *data, size_t len, struct udpheader_t *header));/* * Converts "data" to udpheader_t representation. * "len" is length of "data". * "data" is assumed to be in network order. * Returns: * On success: pointer to a udpheader_t in static memory. * On failure: NULL ("data" is not a complete udppacket). */const char *socks_packet2string __P((const void *packet, int type));/* * debug function; dumps socks packet content * "packet" is a socks packet, "type" indicates it's type. * Returns: * On success: 0 * On failure: -1 */intsocks_socketisbound __P((int s));/* * Returns: * If "s" is bound: 1 * If "s" is not bound: 0 * If "s" is not socket or error occurred determining if bound: -1 */intfdisopen __P((int fd));/* * returns 1 if the filedescriptor "fd" currently references a open object. * returns 0 otherwise. */voidclosev __P((int *array, int count));/* * Goes through "array", which contains "count" elements. * Each element that does not have a negative value is closed. */intsocks_logmatch __P((unsigned int d, const struct logtype_t *log));/* * Returns true if "d" is a descriptor matching any descriptor in "log". * Returns false otherwise. */char *sockaddr2string __P((const struct sockaddr *address, char *string, size_t len));/* * Returns the ip address and port in "address" on string form. * "address" is assumed to be on network form and it will be * converted to host form before written to "string". * "len" gives length of the NUL terminated string. * Returns: "string". */struct sockaddr *sockshost2sockaddr __P((const struct sockshost_t *shost, struct sockaddr *addr));/* * Converts the sockhost_t "shost" to a sockaddr struct and stores it * in "addr". * Returns: "addr". */struct sockaddr *fakesockshost2sockaddr __P((const struct sockshost_t *host, struct sockaddr *addr));/* * Like sockshost2sockaddr(), but checks whether the address in * "host" is fake when converting. */struct sockshost_t *sockaddr2sockshost __P((const struct sockaddr *addr, struct sockshost_t *host));/* * Converts the sockaddr struct "shost" to a sockshost_t struct and stores it * in "host". * Returns: "host". */struct sockshost_t *ruleaddress2sockshost __P((const struct ruleaddress_t *address, struct sockshost_t *host, int protocol));/* * Converts the ruleaddress_t "address" to a sockshost_t struct and stores it * in "host". * Returns: "host". */struct ruleaddress_t *sockshost2ruleaddress __P((const struct sockshost_t *host, struct ruleaddress_t *addr));/* * Converts the sockshost_t "host" to a ruleaddress_t struct and stores it * in "addr". * Returns: "addr". */struct ruleaddress_t *sockaddr2ruleaddress __P((const struct sockaddr *addr, struct ruleaddress_t *ruleaddr));/* * Converts the struct sockaddr "addr" to a ruleaddress_t struct and stores it * in "ruleaddr". * Returns: "addr". */intsockatmark __P((int s));/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -