2
* Copyright (c) 1997, 1998, 1999, 2000, 2001
3
* Inferno Nettverk A/S, Norway. All rights reserved.
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
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.
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.
30
* Inferno Nettverk A/S requests users of this software to return to
32
* Software Distribution Coordinator or sdc@inet.no
33
* Inferno Nettverk A/S
39
* any improvements or extensions that they make and grant Inferno Nettverk A/S
40
* the rights to redistribute these changes.
45
* This code is terrible so hopefully it will match the protocol.
50
static const char rcsid[] =
51
"$Id: msproxy_clientprotocol.c,v 1.29 2001/12/12 14:42:12 karls Exp $";
53
static char executable[] = "TELNET.EXE";
54
static struct sigaction oldsigio;
59
msproxy_connect __P((int s, int control, struct socks_t *packet));
62
msproxy_bind __P((int s, int control, struct socks_t *packet));
65
mem2response __P((struct msproxy_response_t *res, char *mem, size_t len));
68
request2mem __P((const struct msproxy_request_t *req, char *mem));
71
msproxy_sessionsend __P((void));
73
* Terminates all msproxy sessions.
77
msproxy_sessionend __P((int s, struct msproxy_state_t *msproxy));
79
* ends the session negotiated with "s" and having state "msproxy".
83
msproxy_keepalive __P((int signal));
85
* Sends a keepalive packet on behalf of all established sessions.
96
const char *function = "msproxy_init()";
97
struct itimerval timerval;
98
struct sigaction sigact, oldsigact;
100
if (atexit(msproxy_sessionsend) != 0) {
101
swarn("%s: atexit()", function);
105
if (sigaction(SIGALRM, NULL, &oldsigact) != 0) {
106
swarn("%s: sigaction(SIGALRM)", function);
111
if (oldsigact.sa_handler != SIG_DFL
112
&& oldsigact.sa_handler != SIG_IGN) {
113
swarnx("%s: could not install signalhandler for SIGALRM, already set",
115
return 0; /* will probably timeout, don't consider it fatal for now. */
118
sigemptyset(&sigact.sa_mask);
119
sigact.sa_flags = SA_RESTART;
120
sigact.sa_handler = msproxy_keepalive;
121
if (sigaction(SIGALRM, &sigact, NULL) != 0) {
122
swarn("%s: sigaction(SIGALRM)", function);
126
timerval.it_value.tv_sec = MSPROXY_PINGINTERVAL;
127
timerval.it_value.tv_usec = 0;
128
timerval.it_interval = timerval.it_value;
130
if (setitimer(ITIMER_REAL, &timerval, NULL) != 0) {
131
swarn("%s: setitimer()", function);
135
srand((unsigned int)time(NULL) * getpid());
141
msproxy_negotiate(s, control, packet)
144
struct socks_t *packet;
146
const char *function = "msproxy_negotiate()";
147
char string[MAXSOCKADDRSTRING];
148
struct msproxy_request_t req;
149
struct msproxy_response_t res;
152
slog(LOG_DEBUG, "%s: packet #1", function);
154
bzero(&req, sizeof(req));
155
req.clientid = htonl(0x0a000000);
156
req.command = htons(MSPROXY_HELLO);
158
/* in case we don't get something more sensible. */
159
packet->res.version = packet->req.version;
160
packet->res.reply = MSPROXY_FAILURE;
162
switch (packet->req.command) {
165
req.packet._1.magic5 = htons(0x4800);
166
req.packet._1.magic10 = htons(0x1400);
167
req.packet._1.magic15 = htons(0x0400);
168
req.packet._1.magic20 = htons(0x5704);
169
req.packet._1.magic25 = htons(0x0004);
170
req.packet._1.magic30 = htons(0x0100);
171
req.packet._1.magic35 = htons(0x4a02);
172
req.packet._1.magic40 = htons(0x3000);
173
req.packet._1.magic45 = htons(0x4100);
174
req.packet._1.magic50 = htons(0x3900);
180
req.packet._1.magic5 = htons(0x4b00);
181
req.packet._1.magic10 = htons(0x1400);
182
req.packet._1.magic15 = htons(0x0400);
183
req.packet._1.magic20 = htons(0x5704);
184
req.packet._1.magic25 = htons(0x0004);
185
req.packet._1.magic30 = htons(0x0100);
186
req.packet._1.magic35 = htons(0x4a02);
187
req.packet._1.magic40 = htons(0x3000);
188
req.packet._1.magic45 = htons(0x4400);
189
req.packet._1.magic50 = htons(0x3900);
193
case SOCKS_UDPASSOCIATE:
194
SERRX(packet->req.command);
198
SERRX(packet->req.command);
201
if (socks_getusername(&packet->gw.host, req.username, sizeof(req.username))
207
strncpy(req.executable, executable, sizeof(req.executable) - 1);
208
req.executable[sizeof(req.executable) - 1] = NUL;
210
*req.clienthost = NUL;
213
strncpy(req.clienthost, "foo", sizeof(req.clienthost) - 1);
214
req.clienthost[sizeof(req.clienthost) - 1] = NUL;
217
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
220
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
223
if (strcmp(res.RWSP, "RWSP") != 0)
224
serrx(EXIT_FAILURE, "expected \"RWSP\", got \"%s\"",
225
str2vis(res.RWSP, sizeof(res.RWSP)));
227
if (ntohs(res.command) >> 8 != 0x10)
228
serrx(EXIT_FAILURE, "expected res.command = 10??, is %x",
231
packet->state.msproxy.controladdr.sin_family = AF_INET;
232
packet->state.msproxy.controladdr.sin_port = res.packet._1.udpport;
233
packet->state.msproxy.controladdr.sin_addr.s_addr = res.packet._1.udpaddr;
235
packet->state.msproxy.clientid = htonl(rand());
236
packet->state.msproxy.serverid = res.serverid;
238
slog(LOG_DEBUG, "%s: clientid: 0x%x, serverid: 0x%0x",
239
function, packet->state.msproxy.clientid, packet->state.msproxy.serverid);
241
/* LINTED pointer casts may be troublesome */
242
slog(LOG_DEBUG, "%s: msproxy controladdress: %s",
244
sockaddr2string((struct sockaddr *)&packet->state.msproxy.controladdr,
245
string, sizeof(string)));
248
slog(LOG_DEBUG, "%s: packet #2", function);
250
/* almost identical. */
251
req.clientid = packet->state.msproxy.clientid;
252
req.serverid = packet->state.msproxy.serverid;
254
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
257
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
260
if (res.serverid != packet->state.msproxy.serverid)
261
serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
262
packet->state.msproxy.serverid, res.serverid);
264
if (res.sequence != 0x01)
265
serrx(EXIT_FAILURE, "expected res.sequence = 0x%x, is 0x%x",
268
if (ntohs(res.command) != MSPROXY_USERINFO_ACK)
269
serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
270
MSPROXY_USERINFO_ACK, ntohs(res.command));
272
switch (packet->req.command) {
274
p = msproxy_bind(s, control, packet);
278
p = msproxy_connect(s, control, packet);
281
case SOCKS_UDPASSOCIATE:
283
SERRX(packet->req.command);
290
msproxy_connect(s, control, packet)
293
struct socks_t *packet;
295
const char *function = "msproxy_connect()";
296
char string[MAXSOCKSHOSTSTRING];
297
struct msproxy_request_t req;
298
struct msproxy_response_t res;
299
struct sockaddr_in addr;
302
slog(LOG_DEBUG, function);
306
bzero(&req, sizeof(req));
307
req.clientid = packet->state.msproxy.clientid;
308
req.serverid = packet->state.msproxy.serverid;
309
req.command = htons(MSPROXY_SOMETHING);
310
memcpy(req.packet._3.NTLMSSP, "NTLMSSP", sizeof("NTLMSSP"));
311
req.packet._3.bindaddr = htonl(0x02000000);
312
req.packet._3.magic5 = htons(0x0100);
313
req.packet._3.magic10 = htons(0x9682);
315
req.packet._3.magic50 = htons(0x3000);
316
req.packet._3.magic55 = htons(0x3000);
319
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
322
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
325
if (res.serverid != packet->state.msproxy.serverid)
326
serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
327
packet->state.msproxy.serverid, res.serverid);
329
if (ntohs(res.command) != MSPROXY_SOMETHING_1_ACK)
330
serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
331
MSPROXY_SOMETHING_1_ACK, ntohs(res.command));
333
slog(LOG_DEBUG, "%s: ntdomain: \"%s\"", function, res.packet._3.ntdomain);
336
slog(LOG_DEBUG, "%s: packet #4", function);
338
bzero(&req, sizeof(req));
339
req.clientid = packet->state.msproxy.clientid;
340
req.serverid = packet->state.msproxy.serverid;
341
req.command = htons(MSPROXY_SOMETHING_2);
343
memcpy(req.packet._4.NTLMSSP, "NTLMSSP", sizeof("NTLMSSP"));
344
req.packet._4.magic3 = htons(0x0200);
345
req.packet._4.magic5 = htons(0x0300);
346
req.packet._4.magic10 = htons(0x1800);
347
req.packet._4.magic15 = htons(0x1800);
348
req.packet._4.magic20 = htons(0x4900);
349
req.packet._4.magic30 = htons(0x6100);
350
req.packet._4.magic35 = htons(0x0800);
351
req.packet._4.magic40 = htons(0x0800);
352
req.packet._4.magic45 = htons(0x3400);
353
req.packet._4.magic50 = htons(0x0700);
354
req.packet._4.magic55 = htons(0x0700);
355
req.packet._4.magic60 = htons(0x3c00);
356
req.packet._4.magic65 = htons(0x0600);
357
req.packet._4.magic70 = htons(0x0600);
358
req.packet._4.magic75 = htons(0x4300);
361
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
364
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
367
if (res.serverid != packet->state.msproxy.serverid)
368
serrx(EXIT_FAILURE, "expected res.serverid = 0x%x, is 0x%x",
369
packet->state.msproxy.serverid, res.serverid);
371
if (res.clientack != 0x01)
372
serrx(EXIT_FAILURE, "expected res.clientack = 0x%x, is 0x%x",
373
0x01, res.clientack);
375
if (ntohs(res.command) >> 8 != 0x47)
376
serrx(EXIT_FAILURE, "expected res.command = 47??, is 0x%x",
380
switch (packet->req.host.atype) {
381
case SOCKS_ADDR_IPV4:
382
/* LINTED pointer casts may be troublesome */
383
sockshost2sockaddr(&packet->req.host, (struct sockaddr *)&addr);
386
case SOCKS_ADDR_DOMAIN:
387
slog(LOG_DEBUG, "%s: resolve packet", function);
389
bzero(&req, sizeof(req));
390
req.clientid = packet->state.msproxy.clientid;
391
req.serverid = packet->state.msproxy.serverid;
393
req.command = htons(MSPROXY_RESOLVE);
394
req.packet.resolve.hostlength
395
= (unsigned char)(strlen(packet->req.host.addr.domain) + 1);
396
memcpy(&req.packet.resolve.host, packet->req.host.addr.domain,
397
(size_t)req.packet.resolve.hostlength);
399
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
402
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
405
if (ntohs(res.command) != MSPROXY_RESOLVE_ACK)
406
serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
407
MSPROXY_RESOLVE_ACK, ntohs(res.command));
409
addr.sin_addr.s_addr = res.packet.resolve.hostaddr;
410
slog(LOG_DEBUG, "%s: IP address of %s: %s",
411
function, packet->req.host.addr.domain, inet_ntoa(addr.sin_addr));
416
SERRX(packet->req.host.atype);
420
slog(LOG_DEBUG, "%s: packet #5", function);
422
bzero(&req, sizeof(req));
423
req.clientid = packet->state.msproxy.clientid;
424
req.serverid = packet->state.msproxy.serverid;
425
req.command = htons(MSPROXY_CONNECT);
426
req.packet._5.magic6 = htons(0x0200);
427
req.packet._5.destport = packet->req.host.port;
428
req.packet._5.destaddr = addr.sin_addr.s_addr;
431
* need to tell server what port we will connect from, so if socket
432
* is not bound, bind it.
436
/* LINTED pointer casts may be troublesome */
437
if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
440
if (!ADDRISBOUND(addr)) {
442
* Don't have any specific preference for what address to bind and
443
* proxyserver only expects to be told port.
446
addr.sin_addr.s_addr = htonl(INADDR_ANY);
447
/* LINTED pointer casts may be troublesome */
448
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) != 0)
452
/* LINTED pointer casts may be troublesome */
453
if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
456
req.packet._5.srcport = addr.sin_port;
458
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
461
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
464
if (ntohs(res.command) != MSPROXY_CONNECT_ACK) {
465
swarnx("expected res.command = 0x%x, is 0x%x",
466
MSPROXY_CONNECT_ACK, ntohs(res.command));
467
packet->res.reply = MSPROXY_NOTALLOWED;
471
packet->res.host.atype = SOCKS_ADDR_IPV4;
472
packet->res.host.port = res.packet._5.clientport;
473
packet->res.host.addr.ipv4.s_addr = res.packet._5.clientaddr;
475
if (socks_connect(s, &packet->res.host) != 0) {
476
swarn("%s: failed to connect to %s",
477
function, sockshost2string(&packet->res.host, string, sizeof(string)));
481
slog(LOG_DEBUG, "%s: connected to %s",
482
function, sockshost2string(&packet->res.host, string, sizeof(string)));
484
packet->res.host.atype = SOCKS_ADDR_IPV4;
485
packet->res.host.port = res.packet._5.clientport;
486
packet->res.host.addr.ipv4.s_addr = res.packet._5.clientaddr;
488
/* LINTED pointer casts may be troublesome */
489
slog(LOG_DEBUG, "%s: server will use as source address: %s",
490
function, sockshost2string(&packet->res.host, string, sizeof(string)));
493
slog(LOG_DEBUG, "%s: packet #6", function);
495
bzero(&req, sizeof(req));
496
req.clientid = packet->state.msproxy.clientid;
497
req.serverid = packet->state.msproxy.serverid;
498
req.command = htons(MSPROXY_CONNECTED);
500
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
504
/* make response look sensible. */
505
packet->res.version = packet->req.version;
506
packet->res.reply = MSPROXY_SUCCESS;
507
packet->res.flag = 0;
508
packet->res.auth = NULL;
514
msproxy_bind(s, control, packet)
517
struct socks_t *packet;
519
const char *function = "msproxy_bind()";
520
char string[MAXSOCKSHOSTSTRING];
521
struct msproxy_request_t req;
522
struct msproxy_response_t res;
523
struct sockaddr_in addr;
526
slog(LOG_DEBUG, function);
528
bzero(&req, sizeof(req));
529
req.clientid = packet->state.msproxy.clientid;
530
req.serverid = packet->state.msproxy.serverid;
531
req.command = htons(MSPROXY_BIND);
532
req.packet._3.magic2 = htons(0x0100);
533
req.packet._3.bindaddr = packet->req.host.addr.ipv4.s_addr;
534
req.packet._3.bindport = packet->req.host.port;
535
req.packet._3.magic3 = htons(0x0200);
537
/* LINTED pointer casts may be troublesome */
538
if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
540
req.packet._3.boundport = addr.sin_port;
542
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
545
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
548
if (res.serverid != packet->state.msproxy.serverid)
549
serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
550
packet->state.msproxy.serverid, res.serverid);
552
if (ntohs(res.command) != MSPROXY_BIND_ACK) {
553
swarnx("expected res.command = 0x%x, is 0x%x",
554
MSPROXY_BIND_ACK, ntohs(res.command));
555
packet->res.reply = MSPROXY_NOTALLOWED;
559
packet->state.msproxy.bindid = res.packet._3.magic10;
560
packet->res.host.atype = SOCKS_ADDR_IPV4;
561
packet->res.host.port = res.packet._3.boundport;
562
packet->res.host.addr.ipv4.s_addr = res.packet._3.boundaddr;
564
slog(LOG_DEBUG, "%s: server bound for us: %s",
565
function, sockshost2string(&packet->res.host, string, sizeof(string)));
567
slog(LOG_DEBUG, "%s: packet #4", function);
569
bzero(&req, sizeof(req));
570
req.clientid = packet->state.msproxy.clientid;
571
req.serverid = packet->state.msproxy.serverid;
572
req.command = htons(MSPROXY_BIND2);
573
req.packet._4.magic1 = htons(0x0100);
574
req.packet._4.magic2 = packet->state.msproxy.bindid;
575
req.packet._4.magic3 = htons(0x0500);
576
memcpy(req.packet._4.pad3 + 2, &addr.sin_port, sizeof(addr.sin_port));
577
req.packet._4.magic4 = htons(0x0200);
578
req.packet._4.boundport = addr.sin_port;
580
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
583
if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
586
if (res.serverid != packet->state.msproxy.serverid)
587
serrx(EXIT_FAILURE, "expected res.serverid = 0x%x, is 0x%x",
588
packet->state.msproxy.serverid, res.serverid);
590
if (res.clientack != 0x01)
591
serrx(EXIT_FAILURE, "expected res.clientack = 0x%x, is 0x%x",
592
0x01, res.clientack);
594
if (ntohs(res.command) != MSPROXY_BIND2_ACK) {
595
swarnx("expected res.command = %x, is 0x%x",
596
MSPROXY_BIND2_ACK, ntohs(res.command));
601
slog(LOG_DEBUG, "%s: packet #5", function);
603
bzero(&req, sizeof(req));
604
req.clientid = packet->state.msproxy.clientid;
605
req.serverid = packet->state.msproxy.serverid;
606
req.command = htons(MSPROXY_LISTEN);
607
req.packet._5.magic6 = htons(0x0200);
608
req.packet._5.destport = packet->res.host.port;
609
req.packet._5.destaddr = packet->res.host.addr.ipv4.s_addr;
611
if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
615
* When the server accepts the client, it will send us a new
616
* controlpacket. That will be caught in sigio().
619
slog(LOG_DEBUG, "%s: waiting for forwarded connection...", function);
621
/* make response look sensible. */
622
packet->res.version = packet->req.version;
623
packet->res.reply = MSPROXY_SUCCESS;
624
packet->res.flag = 0;
625
packet->res.auth = NULL;
634
const char *function = "msproxy_sigio()";
636
const int errno_s = errno;
637
struct socksfd_t *socksfd;
641
* The msproxy protocol sends a udp packet which we must ack
642
* before it will connect to us. We set up the controlsocket
643
* for signaldriven i/o so we can ack it asynchronously.
647
SASSERTX(socks_addrisok((unsigned int)s));
648
socksfd = socks_getaddr((unsigned int)s);
649
SASSERTX(socksfd->state.version == MSPROXY_V2);
651
if (!init) { /* could be smarter about this... */
652
struct sigaction sigact;
654
sigemptyset(&sigact.sa_mask);
655
sigact.sa_flags = SA_RESTART;
656
sigact.sa_handler = sigio;
657
if (sigaction(SIGIO, &sigact, &oldsigio) != 0)
663
if (fcntl(socksfd->control, F_SETOWN, getpid()) == -1)
667
if (ioctl(socksfd->control, FIOASYNC, &p) == -1)
670
slog(LOG_DEBUG, "%s: set up sigio for %d", function, socksfd->control);
681
const char *function = "sigio()";
682
const int errno_s = errno;
683
char string[MAXSOCKSHOSTSTRING];
685
struct socksfd_t *socksfd;
687
struct timeval timeout;
690
slog(LOG_DEBUG, function);
693
* Find the socket we were signalled for.
699
for (i = 0, max = getdtablesize(); i < max; ++i) {
700
if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
703
if (socksfd->state.command != SOCKS_BIND
704
|| socksfd->state.version != MSPROXY_V2
705
|| !socksfd->state.inprogress)
708
if (!socks_addrisok((unsigned int)i))
711
SASSERTX(fdisopen(socksfd->control));
713
FD_SET(socksfd->control, &rset);
714
dbits = MAX(dbits, socksfd->control);
718
if (oldsigio.sa_handler != NULL)
719
oldsigio.sa_handler(sig);
720
return; /* old signal handler. */
730
switch (selectn(dbits + 1, &newrset, NULL, NULL, &timeout)) {
737
slog(LOG_DEBUG, "%s: no descriptors readable", function);
738
if (oldsigio.sa_handler != NULL)
739
oldsigio.sa_handler(sig);
744
for (i = 0, max = getdtablesize(); i < max; ++i) {
745
if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
748
if (FD_ISSET(socksfd->control, &newrset)) {
749
struct sockshost_t host;
750
struct msproxy_request_t req;
751
struct msproxy_response_t res;
754
SASSERTX(socksfd->state.command == SOCKS_BIND
755
&& socksfd->state.version == MSPROXY_V2
756
&& socksfd->state.inprogress);
758
slog(LOG_DEBUG, "%s: attempting to receive bind info...",
761
FD_CLR(socksfd->control, &newrset);
763
if (recv_mspresponse(socksfd->control,
764
&socksfd->state.msproxy, &res) == -1)
767
if (ntohs(res.command) != MSPROXY_BINDINFO) {
768
swarnx("%s: expected res.command = %x, is 0x%x",
769
function, MSPROXY_BINDINFO, ntohs(res.command));
773
/* no need for more signals on this socket. */
775
if (ioctl(socksfd->control, FIOASYNC, &p) == -1) {
776
swarn("%s: ioctl(socksfd->control)", function);
780
slog(LOG_DEBUG, "%s: turned off sigio for %d",
781
function, socksfd->control);
784
* if we asked server to bind INADDR_ANY, we don't know
785
* what address it bound until now.
787
host.atype = SOCKS_ADDR_IPV4;
788
host.port = res.packet._5.boundport;
789
host.addr.ipv4.s_addr = res.packet._5.boundaddr;
790
sockshost2sockaddr(&host, &socksfd->remote);
792
slog(LOG_DEBUG, "%s: server bound address %s",
793
function, sockshost2string(&host, string, sizeof(string)));
795
host.atype = SOCKS_ADDR_IPV4;
796
host.port = res.packet._5.clientport;
797
host.addr.ipv4.s_addr = res.packet._5.clientaddr;
798
sockshost2sockaddr(&host, &socksfd->forus.accepted);
800
slog(LOG_DEBUG, "%s: server accepted: %s",
801
function, sockshost2string(&host, string, sizeof(string)));
803
slog(LOG_DEBUG, "%s: server will connect to us from port %d",
804
function, ntohs(res.packet._5.serverport));
806
/* LINTED pointer casts may be troublesome */
807
TOIN(&socksfd->reply)->sin_port = res.packet._5.serverport;
809
slog(LOG_DEBUG, "%s: packet #6", function);
811
bzero(&req, sizeof(req));
812
req.clientid = socksfd->state.msproxy.clientid;
813
req.serverid = socksfd->state.msproxy.serverid;
814
req.command = htons(MSPROXY_BINDINFO_ACK);
815
req.packet._6.magic1 = res.packet._5.magic1;
816
req.packet._6.magic5 = htons(0x0100);
817
req.packet._6.magic10 = socksfd->state.msproxy.bindid;
818
req.packet._6.magic15 = htons(0x0100);
819
req.packet._6.magic16 = socksfd->state.msproxy.bindid;
820
req.packet._6.magic20 = htons(0x0200);
821
req.packet._6.clientport = res.packet._5.clientport;
822
req.packet._6.clientaddr = res.packet._5.clientaddr;
823
req.packet._6.magic30 = res.packet._5.magic10;
824
req.packet._6.magic35 = res.packet._5.magic15;
825
req.packet._6.serverport = res.packet._5.serverport;
826
req.packet._6.srcport = res.packet._5.srcport;
827
req.packet._6.boundport = res.packet._5.boundport;
828
req.packet._6.boundaddr = res.packet._5.boundaddr;
830
if (send_msprequest(socksfd->control, &socksfd->state.msproxy,
834
if (recv_mspresponse(socksfd->control,
835
&socksfd->state.msproxy, &res) == -1)
838
/* all done. Can accept(). */
839
socksfd->state.inprogress = 0;
851
recv_mspresponse(s, state, response)
853
struct msproxy_state_t *state;
854
struct msproxy_response_t *response;
856
const char *function = "recv_mspresponse()";
858
char responsemem[MAX(sizeof(*response), 1024)];
863
if ((r = read(s, responsemem, sizeof(responsemem))) < MSPROXY_MINLENGTH) {
864
swarn("%s: expected to read atleast %d, read %d",
865
function, MSPROXY_MINLENGTH, r);
869
if (mem2response(response, responsemem, (size_t)r) == NULL) {
870
swarnx("%s: bad response from server", function);
874
if (state->seq_recv > 0) {
875
if (response->sequence == state->seq_recv + 1)
877
else if (response->sequence < state->seq_recv) {
879
* sequence number less that last, sometimes this happens too,
882
slog(LOG_DEBUG, "%s: sequence (%d) < seq_recv (%d)",
883
function, response->sequence, state->seq_recv);
886
else if (response->sequence == state->seq_recv) {
887
slog(LOG_DEBUG, "%s: seq_recv: %d, dup response, seqnumber: 0x%x",
888
function, state->seq_recv, response->sequence);
890
if (response->clientack == state->seq_sent) {
892
"%s: ack matches last sent though, hoping it's a new one...",
897
else if (response->sequence > state->seq_recv) {
898
slog(LOG_DEBUG, "%s: sequence (%d) > seq_recv (%d)",
899
function, response->sequence, state->seq_recv);
904
break; /* not started incrementing yet. */
907
state->seq_recv = response->sequence;
914
send_msprequest(s, state, request)
916
struct msproxy_state_t *state;
917
struct msproxy_request_t *request;
919
const char *function = "send_msprequest()";
921
char requestmem[sizeof(struct msproxy_request_t)], *p;
923
request->magic25 = htonl(MSPROXY_VERSION);
924
request->serverack = state->seq_recv;
925
/* don't start incrementing sequence until we are acking packet #2. */
927
= (unsigned char)(request->serverack >= 2 ? state->seq_sent + 1 : 0);
929
memcpy(request->RWSP, "RWSP", sizeof(request->RWSP));
931
p = request2mem(request, requestmem);
933
/* all requests must be atleast MSPROXY_MINLENGTH it seems. */
934
if (p - requestmem < MSPROXY_MINLENGTH) {
935
bzero(p, (size_t)(MSPROXY_MINLENGTH - (p - requestmem)));
936
p = requestmem + MSPROXY_MINLENGTH;
939
if ((w = write(s, requestmem, (size_t)(p - requestmem)))
940
!= (ssize_t)(p - requestmem)) {
941
swarn("%s: write()", function);
944
state->seq_sent = request->sequence;
950
mem2response(res, mem, len)
951
struct msproxy_response_t *res;
955
const char *function = "mem2response()";
957
if (len < sizeof(res->packetid))
959
memcpy(&res->packetid, mem, sizeof(res->packetid));
960
mem += sizeof(res->packetid);
961
len -= sizeof(res->packetid);
963
if (len < sizeof(res->magic5))
965
memcpy(&res->magic5, mem, sizeof(res->magic5));
966
mem += sizeof(res->magic5);
967
len -= sizeof(res->magic5);
969
if (len < sizeof(res->serverid))
971
memcpy(&res->serverid, mem, sizeof(res->serverid));
972
mem += sizeof(res->serverid);
973
len -= sizeof(res->serverid);
975
if (len < sizeof(res->clientack))
977
memcpy(&res->clientack, mem, sizeof(res->clientack));
978
mem += sizeof(res->clientack);
979
len -= sizeof(res->clientack);
981
if (len < sizeof(res->pad5))
983
memcpy(res->pad5, mem, sizeof(res->pad5));
984
mem += sizeof(res->pad5);
985
len -= sizeof(res->pad5);
987
if (len < sizeof(res->sequence))
989
memcpy(&res->sequence, mem, sizeof(res->sequence));
990
mem += sizeof(res->sequence);
991
len -= sizeof(res->sequence);
993
if (len < sizeof(res->pad10))
995
memcpy(res->pad10, mem, sizeof(res->pad10));
996
mem += sizeof(res->pad10);
997
len -= sizeof(res->pad10);
999
if (len < sizeof(res->RWSP))
1001
memcpy(res->RWSP, mem, sizeof(res->RWSP));
1002
mem += sizeof(res->RWSP);
1003
len -= sizeof(res->RWSP);
1005
if (len < sizeof(res->pad15))
1007
memcpy(res->pad15, mem, sizeof(res->pad15));
1008
mem += sizeof(res->pad15);
1009
len -= sizeof(res->pad15);
1011
if (len < sizeof(res->command))
1013
memcpy(&res->command, mem, sizeof(res->command));
1014
mem += sizeof(res->command);
1015
len -= sizeof(res->command);
1017
switch (ntohs(res->command)) {
1018
case MSPROXY_HELLO_ACK:
1019
if (len < sizeof(res->packet._1.pad5))
1021
memcpy(res->packet._1.pad5, mem, sizeof(res->packet._1.pad5));
1022
mem += sizeof(res->packet._1.pad5);
1023
len -= sizeof(res->packet._1.pad5);
1025
if (len < sizeof(res->packet._1.magic20))
1027
memcpy(&res->packet._1.magic20, mem, sizeof(res->packet._1.magic20));
1028
mem += sizeof(res->packet._1.magic20);
1029
len -= sizeof(res->packet._1.magic20);
1031
if (len < sizeof(res->packet._1.pad10))
1033
memcpy(&res->packet._1.pad10, mem, sizeof(res->packet._1.pad10));
1034
mem += sizeof(res->packet._1.pad10);
1035
len -= sizeof(res->packet._1.pad10);
1037
if (len < sizeof(res->packet._1.magic30))
1039
memcpy(&res->packet._1.magic30, mem, sizeof(res->packet._1.magic30));
1040
mem += sizeof(res->packet._1.magic30);
1041
len -= sizeof(res->packet._1.magic30);
1043
if (len < sizeof(res->packet._1.pad15))
1045
memcpy(res->packet._1.pad15, mem, sizeof(res->packet._1.pad15));
1046
mem += sizeof(res->packet._1.pad15);
1047
len -= sizeof(res->packet._1.pad15);
1049
if (len < sizeof(res->packet._1.magic35))
1051
memcpy(&res->packet._1.magic35, mem, sizeof(res->packet._1.magic35));
1052
mem += sizeof(res->packet._1.magic35);
1053
len -= sizeof(res->packet._1.magic35);
1055
if (len < sizeof(res->packet._1.pad20))
1057
memcpy(res->packet._1.pad20, mem, sizeof(res->packet._1.pad20));
1058
mem += sizeof(res->packet._1.pad20);
1059
len -= sizeof(res->packet._1.pad20);
1061
if (len < sizeof(res->packet._1.magic50))
1063
memcpy(&res->packet._1.magic50, mem, sizeof(res->packet._1.magic50));
1064
mem += sizeof(res->packet._1.magic50);
1065
len -= sizeof(res->packet._1.magic50);
1067
if (len < sizeof(res->packet._1.pad30))
1069
memcpy(res->packet._1.pad30, mem, sizeof(res->packet._1.pad30));
1070
mem += sizeof(res->packet._1.pad30);
1071
len -= sizeof(res->packet._1.pad30);
1073
if (len < sizeof(res->packet._1.magic60))
1075
memcpy(&res->packet._1.magic60, mem, sizeof(res->packet._1.magic60));
1076
mem += sizeof(res->packet._1.magic60);
1077
len -= sizeof(res->packet._1.magic60);
1079
if (len < sizeof(res->packet._1.pad35))
1081
memcpy(res->packet._1.pad35, mem, sizeof(res->packet._1.pad35));
1082
mem += sizeof(res->packet._1.pad35);
1083
len -= sizeof(res->packet._1.pad35);
1085
if (len < sizeof(res->packet._1.magic65))
1087
memcpy(&res->packet._1.magic65, mem, sizeof(res->packet._1.magic65));
1088
mem += sizeof(res->packet._1.magic65);
1089
len -= sizeof(res->packet._1.magic65);
1091
if (len < sizeof(res->packet._1.pad40))
1093
memcpy(res->packet._1.pad40, mem, sizeof(res->packet._1.pad40));
1094
mem += sizeof(res->packet._1.pad40);
1095
len -= sizeof(res->packet._1.pad40);
1097
if (len < sizeof(res->packet._1.udpport))
1099
memcpy(&res->packet._1.udpport, mem, sizeof(res->packet._1.udpport));
1100
mem += sizeof(res->packet._1.udpport);
1101
len -= sizeof(res->packet._1.udpport);
1103
if (len < sizeof(res->packet._1.udpaddr))
1105
memcpy(&res->packet._1.udpaddr, mem, sizeof(res->packet._1.udpaddr));
1106
mem += sizeof(res->packet._1.udpaddr);
1107
len -= sizeof(res->packet._1.udpaddr);
1111
case MSPROXY_USERINFO_ACK:
1112
if (len < sizeof(res->packet._2.pad5))
1114
memcpy(res->packet._2.pad5, mem, sizeof(res->packet._2.pad5));
1115
mem += sizeof(res->packet._2.pad5);
1116
len -= sizeof(res->packet._2.pad5);
1118
if (len < sizeof(res->packet._2.magic5))
1120
memcpy(&res->packet._2.magic5, mem, sizeof(res->packet._2.magic5));
1121
mem += sizeof(res->packet._2.magic5);
1122
len -= sizeof(res->packet._2.magic5);
1126
case MSPROXY_BIND_ACK:
1127
case MSPROXY_SOMETHING_1_ACK:
1128
if (len < sizeof(res->packet._3.pad1))
1130
memcpy(res->packet._3.pad1, mem, sizeof(res->packet._3.pad1));
1131
mem += sizeof(res->packet._3.pad1);
1132
len -= sizeof(res->packet._3.pad1);
1134
if (len < sizeof(res->packet._3.magic10))
1136
memcpy(&res->packet._3.magic10, mem, sizeof(res->packet._3.magic10));
1137
mem += sizeof(res->packet._3.magic10);
1138
len -= sizeof(res->packet._3.magic10);
1140
if (len < sizeof(res->packet._3.pad3))
1142
memcpy(res->packet._3.pad3, mem, sizeof(res->packet._3.pad3));
1143
mem += sizeof(res->packet._3.pad3);
1144
len -= sizeof(res->packet._3.pad3);
1146
if (len < sizeof(res->packet._3.boundport))
1148
memcpy(&res->packet._3.boundport, mem,
1149
sizeof(res->packet._3.boundport));
1150
mem += sizeof(res->packet._3.boundport);
1151
len -= sizeof(res->packet._3.boundport);
1153
if (len < sizeof(res->packet._3.boundaddr))
1155
memcpy(&res->packet._3.boundaddr, mem,
1156
sizeof(res->packet._3.boundaddr));
1157
mem += sizeof(res->packet._3.boundaddr);
1158
len -= sizeof(res->packet._3.boundaddr);
1160
if (len < sizeof(res->packet._3.pad10))
1162
memcpy(res->packet._3.pad10, mem, sizeof(res->packet._3.pad10));
1163
mem += sizeof(res->packet._3.pad10);
1164
len -= sizeof(res->packet._3.pad10);
1166
if (len < sizeof(res->packet._3.magic15))
1168
memcpy(&res->packet._3.magic15, mem, sizeof(res->packet._3.magic15));
1169
mem += sizeof(res->packet._3.magic15);
1170
len -= sizeof(res->packet._3.magic15);
1172
if (len < sizeof(res->packet._3.pad15))
1174
memcpy(res->packet._3.pad15, mem, sizeof(res->packet._3.pad15));
1175
mem += sizeof(res->packet._3.pad15);
1176
len -= sizeof(res->packet._3.pad15);
1178
if (len < sizeof(res->packet._3.NTLMSSP))
1180
memcpy(res->packet._3.NTLMSSP, mem, sizeof(res->packet._3.NTLMSSP));
1181
mem += sizeof(res->packet._3.NTLMSSP);
1182
len -= sizeof(res->packet._3.NTLMSSP);
1184
if (len < sizeof(res->packet._3.magic50))
1186
memcpy(&res->packet._3.magic50, mem, sizeof(res->packet._3.magic50));
1187
mem += sizeof(res->packet._3.magic50);
1188
len -= sizeof(res->packet._3.magic50);
1190
if (len < sizeof(res->packet._3.pad50))
1192
memcpy(res->packet._3.pad50, mem, sizeof(res->packet._3.pad50));
1193
mem += sizeof(res->packet._3.pad50);
1194
len -= sizeof(res->packet._3.pad50);
1196
if (len < sizeof(res->packet._3.magic55))
1198
memcpy(&res->packet._3.magic55, mem, sizeof(res->packet._3.magic55));
1199
mem += sizeof(res->packet._3.magic55);
1200
len -= sizeof(res->packet._3.magic55);
1202
if (len < sizeof(res->packet._3.magic60))
1204
memcpy(&res->packet._3.magic60, mem, sizeof(res->packet._3.magic60));
1205
mem += sizeof(res->packet._3.magic60);
1206
len -= sizeof(res->packet._3.magic60);
1208
if (len < sizeof(res->packet._3.magic65))
1210
memcpy(&res->packet._3.magic65, mem, sizeof(res->packet._3.magic65));
1211
mem += sizeof(res->packet._3.magic65);
1212
len -= sizeof(res->packet._3.magic65);
1214
if (len < sizeof(res->packet._3.pad60))
1216
memcpy(res->packet._3.pad60, mem, sizeof(res->packet._3.pad60));
1217
mem += sizeof(res->packet._3.pad60);
1218
len -= sizeof(res->packet._3.pad60);
1220
if (len < sizeof(res->packet._3.magic70))
1222
memcpy(&res->packet._3.magic70, mem, sizeof(res->packet._3.magic70));
1223
mem += sizeof(res->packet._3.magic70);
1224
len -= sizeof(res->packet._3.magic70);
1226
if (len < sizeof(res->packet._3.magic75))
1228
memcpy(&res->packet._3.magic75, mem, sizeof(res->packet._3.magic75));
1229
mem += sizeof(res->packet._3.magic75);
1230
len -= sizeof(res->packet._3.magic75);
1232
if (len < sizeof(res->packet._3.pad70))
1234
memcpy(res->packet._3.pad70, mem, sizeof(res->packet._3.pad70));
1235
mem += sizeof(res->packet._3.pad70);
1236
len -= sizeof(res->packet._3.pad70);
1238
if (len > sizeof(res->packet._3.ntdomain))
1239
swarnx("hmm, ntdomain length is %d, our max is %d?",
1240
len, sizeof(res->packet._3.ntdomain) - 1);
1241
memcpy(res->packet._3.ntdomain, mem,
1242
MIN(len, sizeof(res->packet._3.ntdomain) - 1));
1243
res->packet._3.ntdomain[len] = NUL;
1249
case MSPROXY_SOMETHING_2_ACK:
1250
case MSPROXY_SOMETHING_2_ACK2:
1251
case MSPROXY_BIND2_ACK:
1252
if (len < sizeof(res->packet._4.pad5))
1254
memcpy(res->packet._4.pad5, mem, sizeof(res->packet._4.pad5));
1255
mem += sizeof(res->packet._4.pad5);
1256
len -= sizeof(res->packet._4.pad5);
1259
case MSPROXY_RESOLVE_ACK: {
1260
if (len < sizeof(res->packet.resolve.addroffset))
1262
memcpy(&res->packet.resolve.addroffset, mem,
1263
sizeof(res->packet.resolve.addroffset));
1264
mem += sizeof(res->packet.resolve.addroffset);
1265
len -= sizeof(res->packet.resolve.addroffset);
1267
if (len < sizeof(res->packet.resolve.pad5))
1269
memcpy(res->packet.resolve.pad5, mem,
1270
sizeof(res->packet.resolve.pad5));
1271
mem += sizeof(res->packet.resolve.pad5);
1272
len -= sizeof(res->packet.resolve.pad5);
1274
mem += res->packet.resolve.addroffset;
1276
if (len < sizeof(res->packet.resolve.hostaddr))
1278
memcpy(&res->packet.resolve.hostaddr, mem,
1279
sizeof(res->packet.resolve.hostaddr));
1280
mem += sizeof(res->packet.resolve.hostaddr);
1281
len -= sizeof(res->packet.resolve.hostaddr);
1286
case MSPROXY_CONNECT_ACK:
1287
case MSPROXY_BINDINFO:
1288
if (len < sizeof(res->packet._5.magic1))
1290
memcpy(&res->packet._5.magic1, mem, sizeof(res->packet._5.magic1));
1291
mem += sizeof(res->packet._5.magic1);
1292
len -= sizeof(res->packet._5.magic1);
1294
if (len < sizeof(res->packet._5.pad5))
1296
memcpy(res->packet._5.pad5, mem, sizeof(res->packet._5.pad5));
1297
mem += sizeof(res->packet._5.pad5);
1298
len -= sizeof(res->packet._5.pad5);
1300
if (len < sizeof(res->packet._5.clientport))
1302
memcpy(&res->packet._5.clientport, mem,
1303
sizeof(res->packet._5.clientport));
1304
mem += sizeof(res->packet._5.clientport);
1305
len -= sizeof(res->packet._5.clientport);
1307
if (len < sizeof(res->packet._5.clientaddr))
1309
memcpy(&res->packet._5.clientaddr, mem,
1310
sizeof(res->packet._5.clientaddr));
1311
mem += sizeof(res->packet._5.clientaddr);
1312
len -= sizeof(res->packet._5.clientaddr);
1314
if (len < sizeof(res->packet._5.magic10))
1316
memcpy(&res->packet._5.magic10, mem, sizeof(res->packet._5.magic10));
1317
mem += sizeof(res->packet._5.magic10);
1318
len -= sizeof(res->packet._5.magic10);
1320
if (len < sizeof(res->packet._5.magic15))
1322
memcpy(&res->packet._5.magic15, mem, sizeof(res->packet._5.magic15));
1323
mem += sizeof(res->packet._5.magic15);
1324
len -= sizeof(res->packet._5.magic15);
1326
if (len < sizeof(res->packet._5.serverport))
1328
memcpy(&res->packet._5.serverport, mem,
1329
sizeof(res->packet._5.serverport));
1330
mem += sizeof(res->packet._5.serverport);
1331
len -= sizeof(res->packet._5.serverport);
1333
if (len < sizeof(res->packet._5.srcport))
1335
memcpy(&res->packet._5.srcport, mem, sizeof(res->packet._5.srcport));
1336
mem += sizeof(res->packet._5.srcport);
1337
len -= sizeof(res->packet._5.srcport);
1339
if (len < sizeof(res->packet._5.boundport))
1341
memcpy(&res->packet._5.boundport, mem,
1342
sizeof(res->packet._5.boundport));
1343
mem += sizeof(res->packet._5.boundport);
1344
len -= sizeof(res->packet._5.boundport);
1346
if (len < sizeof(res->packet._5.boundaddr))
1348
memcpy(&res->packet._5.boundaddr, mem,
1349
sizeof(res->packet._5.boundaddr));
1350
mem += sizeof(res->packet._5.boundaddr);
1351
len -= sizeof(res->packet._5.boundaddr);
1353
if (len < sizeof(res->packet._5.pad10))
1355
memcpy(res->packet._5.pad10, mem, sizeof(res->packet._5.pad10));
1356
mem += sizeof(res->packet._5.pad10);
1357
len -= sizeof(res->packet._5.pad10);
1361
case MSPROXY_CONNECT_AUTHFAILED:
1362
case MSPROXY_BIND_AUTHFAILED:
1366
if (ntohs(res->command) >> 8 == MSPROXY_CONNREFUSED
1367
|| ntohs(res->command) >> 12 == MSPROXY_CONNREFUSED)
1370
slog(LOG_DEBUG, "%s: unknown command in msproxy reply: 0x%x",
1371
function, ntohs(res->command));
1378
request2mem(req, mem)
1379
const struct msproxy_request_t *req;
1383
memcpy(mem, &req->clientid, sizeof(req->clientid));
1384
mem += sizeof(req->clientid);
1386
memcpy(mem, &req->magic25, sizeof(req->magic25));
1387
mem += sizeof(req->magic25);
1389
memcpy(mem, &req->serverid, sizeof(req->serverid));
1390
mem += sizeof(req->serverid);
1392
memcpy(mem, &req->serverack, sizeof(req->serverack));
1393
mem += sizeof(req->serverack);
1395
memcpy(mem, &req->pad10, sizeof(req->pad10));
1396
mem += sizeof(req->pad10);
1398
memcpy(mem, &req->sequence, sizeof(req->sequence));
1399
mem += sizeof(req->sequence);
1401
memcpy(mem, &req->pad11, sizeof(req->pad11));
1402
mem += sizeof(req->pad11);
1404
memcpy(mem, &req->RWSP, sizeof(req->RWSP));
1405
mem += sizeof(req->RWSP);
1407
memcpy(mem, &req->pad15, sizeof(req->pad15));
1408
mem += sizeof(req->pad15);
1410
memcpy(mem, &req->command, sizeof(req->command));
1411
mem += sizeof(req->command);
1413
switch (ntohs(req->command)) {
1415
memcpy(mem, &req->packet._1.pad1, sizeof(req->packet._1.pad1));
1416
mem += sizeof(req->packet._1.pad1);
1418
memcpy(mem, &req->packet._1.magic3, sizeof(req->packet._1.magic3));
1419
mem += sizeof(req->packet._1.magic3);
1421
memcpy(mem, &req->packet._1.pad3, sizeof(req->packet._1.pad3));
1422
mem += sizeof(req->packet._1.pad3);
1424
memcpy(mem, &req->packet._1.magic5, sizeof(req->packet._1.magic5));
1425
mem += sizeof(req->packet._1.magic5);
1427
memcpy(mem, &req->packet._1.pad5, sizeof(req->packet._1.pad5));
1428
mem += sizeof(req->packet._1.pad5);
1430
memcpy(mem, &req->packet._1.magic10, sizeof(req->packet._1.magic10));
1431
mem += sizeof(req->packet._1.magic10);
1433
memcpy(mem, &req->packet._1.pad6, sizeof(req->packet._1.pad6));
1434
mem += sizeof(req->packet._1.pad6);
1436
memcpy(mem, &req->packet._1.magic15, sizeof(req->packet._1.magic15));
1437
mem += sizeof(req->packet._1.magic15);
1439
memcpy(mem, &req->packet._1.pad10, sizeof(req->packet._1.pad10));
1440
mem += sizeof(req->packet._1.pad10);
1442
memcpy(mem, &req->packet._1.magic20, sizeof(req->packet._1.magic20));
1443
mem += sizeof(req->packet._1.magic20);
1445
memcpy(mem, &req->packet._1.magic25, sizeof(req->packet._1.magic25));
1446
mem += sizeof(req->packet._1.magic25);
1448
memcpy(mem, &req->packet._1.magic30, sizeof(req->packet._1.magic30));
1449
mem += sizeof(req->packet._1.magic30);
1451
memcpy(mem, &req->packet._1.pad20, sizeof(req->packet._1.pad20));
1452
mem += sizeof(req->packet._1.pad20);
1454
memcpy(mem, &req->packet._1.magic35, sizeof(req->packet._1.magic35));
1455
mem += sizeof(req->packet._1.magic35);
1457
memcpy(mem, &req->packet._1.pad30, sizeof(req->packet._1.pad30));
1458
mem += sizeof(req->packet._1.pad30);
1460
memcpy(mem, &req->packet._1.magic40, sizeof(req->packet._1.magic40));
1461
mem += sizeof(req->packet._1.magic40);
1463
memcpy(mem, &req->packet._1.pad40, sizeof(req->packet._1.pad40));
1464
mem += sizeof(req->packet._1.pad40);
1466
memcpy(mem, &req->packet._1.magic45, sizeof(req->packet._1.magic45));
1467
mem += sizeof(req->packet._1.magic45);
1469
memcpy(mem, &req->packet._1.pad45, sizeof(req->packet._1.pad45));
1470
mem += sizeof(req->packet._1.pad45);
1472
memcpy(mem, &req->packet._1.magic50, sizeof(req->packet._1.magic50));
1473
mem += sizeof(req->packet._1.magic50);
1475
memcpy(mem, &req->packet._1.pad50, sizeof(req->packet._1.pad50));
1476
mem += sizeof(req->packet._1.pad50);
1478
strcpy(mem, req->username);
1479
mem += strlen(req->username) + 1;
1481
strcpy(mem, req->unknown);
1482
mem += strlen(req->unknown) + 1;
1484
strcpy(mem, req->executable);
1485
mem += strlen(req->executable) + 1;
1487
strcpy(mem, req->clienthost);
1488
mem += strlen(req->clienthost) + 1;
1492
case MSPROXY_USERINFO:
1493
memcpy(mem, &req->packet._2.pad1, sizeof(req->packet._2.pad1));
1494
mem += sizeof(req->packet._2.pad1);
1496
memcpy(mem, &req->packet._2.magic3, sizeof(req->packet._2.magic3));
1497
mem += sizeof(req->packet._2.magic3);
1499
memcpy(mem, &req->packet._2.pad3, sizeof(req->packet._2.pad3));
1500
mem += sizeof(req->packet._2.pad3);
1502
memcpy(mem, &req->packet._2.magic5, sizeof(req->packet._2.magic5));
1503
mem += sizeof(req->packet._2.magic5);
1505
memcpy(mem, &req->packet._2.pad5, sizeof(req->packet._2.pad5));
1506
mem += sizeof(req->packet._2.pad5);
1508
memcpy(mem, &req->packet._2.magic10, sizeof(req->packet._2.magic10));
1509
mem += sizeof(req->packet._2.magic10);
1511
memcpy(mem, &req->packet._2.pad10, sizeof(req->packet._2.pad10));
1512
mem += sizeof(req->packet._2.pad10);
1514
memcpy(mem, &req->packet._2.magic15, sizeof(req->packet._2.magic15));
1515
mem += sizeof(req->packet._2.magic15);
1517
memcpy(mem, &req->packet._2.pad15, sizeof(req->packet._2.pad15));
1518
mem += sizeof(req->packet._2.pad15);
1520
memcpy(mem, &req->packet._2.magic20, sizeof(req->packet._2.magic20));
1521
mem += sizeof(req->packet._2.magic20);
1523
memcpy(mem, &req->packet._2.magic25, sizeof(req->packet._2.magic25));
1524
mem += sizeof(req->packet._2.magic25);
1526
memcpy(mem, &req->packet._2.magic30, sizeof(req->packet._2.magic30));
1527
mem += sizeof(req->packet._2.magic30);
1529
memcpy(mem, &req->packet._2.pad20, sizeof(req->packet._2.pad20));
1530
mem += sizeof(req->packet._2.pad20);
1532
memcpy(mem, &req->packet._2.magic35, sizeof(req->packet._2.magic35));
1533
mem += sizeof(req->packet._2.magic35);
1535
memcpy(mem, &req->packet._2.pad25, sizeof(req->packet._2.pad25));
1536
mem += sizeof(req->packet._2.pad25);
1538
memcpy(mem, &req->packet._2.magic35, sizeof(req->packet._2.magic35));
1539
mem += sizeof(req->packet._2.magic35);
1541
memcpy(mem, &req->packet._2.pad25, sizeof(req->packet._2.pad25));
1542
mem += sizeof(req->packet._2.pad25);
1544
memcpy(mem, &req->packet._2.magic50, sizeof(req->packet._2.magic50));
1545
mem += sizeof(req->packet._2.magic50);
1547
memcpy(mem, &req->packet._2.pad50, sizeof(req->packet._2.pad50));
1548
mem += sizeof(req->packet._2.pad50);
1550
memcpy(mem, &req->packet._2.magic55, sizeof(req->packet._2.magic55));
1551
mem += sizeof(req->packet._2.magic55);
1553
memcpy(mem, &req->packet._2.pad55, sizeof(req->packet._2.pad55));
1554
mem += sizeof(req->packet._2.pad55);
1556
memcpy(mem, &req->packet._2.magic60, sizeof(req->packet._2.magic60));
1557
mem += sizeof(req->packet._2.magic60);
1559
strcpy(mem, req->username);
1560
mem += strlen(req->username) + 1;
1562
strcpy(mem, req->unknown);
1563
mem += strlen(req->unknown) + 1;
1565
strcpy(mem, req->executable);
1566
mem += strlen(req->executable) + 1;
1568
strcpy(mem, req->clienthost);
1569
mem += strlen(req->clienthost) + 1;
1574
case MSPROXY_SOMETHING:
1575
memcpy(mem, &req->packet._3.pad1, sizeof(req->packet._3.pad1));
1576
mem += sizeof(req->packet._3.pad1);
1578
memcpy(mem, &req->packet._3.magic2, sizeof(req->packet._3.magic2));
1579
mem += sizeof(req->packet._3.magic2);
1581
memcpy(mem, &req->packet._3.pad10, sizeof(req->packet._3.pad10));
1582
mem += sizeof(req->packet._3.pad10);
1584
memcpy(mem, &req->packet._3.bindaddr, sizeof(req->packet._3.bindaddr));
1585
mem += sizeof(req->packet._3.bindaddr);
1587
memcpy(mem, &req->packet._3.bindport, sizeof(req->packet._3.bindport));
1588
mem += sizeof(req->packet._3.bindport);
1590
memcpy(mem, &req->packet._3.pad15, sizeof(req->packet._3.pad15));
1591
mem += sizeof(req->packet._3.pad15);
1593
memcpy(mem, &req->packet._3.magic3, sizeof(req->packet._3.magic3));
1594
mem += sizeof(req->packet._3.magic3);
1596
memcpy(mem, &req->packet._3.boundport,
1597
sizeof(req->packet._3.boundport));
1598
mem += sizeof(req->packet._3.boundport);
1600
memcpy(mem, &req->packet._3.pad20, sizeof(req->packet._3.pad20));
1601
mem += sizeof(req->packet._3.pad20);
1603
memcpy(mem, &req->packet._3.NTLMSSP, sizeof(req->packet._3.NTLMSSP));
1604
mem += sizeof(req->packet._3.NTLMSSP);
1606
memcpy(mem, &req->packet._3.magic5, sizeof(req->packet._3.magic5));
1607
mem += sizeof(req->packet._3.magic5);
1609
memcpy(mem, &req->packet._3.pad25, sizeof(req->packet._3.pad25));
1610
mem += sizeof(req->packet._3.pad25);
1612
memcpy(mem, &req->packet._3.magic10, sizeof(req->packet._3.magic10));
1613
mem += sizeof(req->packet._3.magic10);
1615
memcpy(mem, &req->packet._3.magic15, sizeof(req->packet._3.magic15));
1616
mem += sizeof(req->packet._3.magic15);
1618
memcpy(mem, &req->packet._3.magic20, sizeof(req->packet._3.magic20));
1619
mem += sizeof(req->packet._3.magic20);
1621
memcpy(mem, &req->packet._3.pad30, sizeof(req->packet._3.pad30));
1622
mem += sizeof(req->packet._3.pad30);
1624
memcpy(mem, &req->packet._3.magic25, sizeof(req->packet._3.magic25));
1625
mem += sizeof(req->packet._3.magic25);
1627
memcpy(mem, &req->packet._3.magic30, sizeof(req->packet._3.magic30));
1628
mem += sizeof(req->packet._3.magic30);
1630
memcpy(mem, &req->packet._3.pad40, sizeof(req->packet._3.pad40));
1631
mem += sizeof(req->packet._3.pad40);
1633
memcpy(mem, &req->packet._3.magic50, sizeof(req->packet._3.magic50));
1634
mem += sizeof(req->packet._3.magic50);
1636
memcpy(mem, &req->packet._3.pad50, sizeof(req->packet._3.pad50));
1637
mem += sizeof(req->packet._3.pad50);
1639
memcpy(mem, &req->packet._3.magic55, sizeof(req->packet._3.magic55));
1640
mem += sizeof(req->packet._3.magic55);
1642
memcpy(mem, &req->packet._3.pad55, sizeof(req->packet._3.pad55));
1643
mem += sizeof(req->packet._3.pad55);
1648
case MSPROXY_SOMETHING_2:
1649
memcpy(mem, &req->packet._4.pad1, sizeof(req->packet._4.pad1));
1650
mem += sizeof(req->packet._4.pad1);
1652
memcpy(mem, &req->packet._4.magic1, sizeof(req->packet._4.magic1));
1653
mem += sizeof(req->packet._4.magic1);
1655
memcpy(mem, &req->packet._4.magic2, sizeof(req->packet._4.magic2));
1656
mem += sizeof(req->packet._4.magic2);
1658
memcpy(mem, &req->packet._4.pad2, sizeof(req->packet._4.pad2));
1659
mem += sizeof(req->packet._4.pad2);
1661
memcpy(mem, &req->packet._4.magic3, sizeof(req->packet._4.magic3));
1662
mem += sizeof(req->packet._4.magic3);
1664
memcpy(mem, &req->packet._4.pad3, sizeof(req->packet._4.pad3));
1665
mem += sizeof(req->packet._4.pad3);
1667
memcpy(mem, &req->packet._4.magic4, sizeof(req->packet._4.magic4));
1668
mem += sizeof(req->packet._4.magic4);
1670
memcpy(mem, &req->packet._4.boundport,
1671
sizeof(req->packet._4.boundport));
1672
mem += sizeof(req->packet._4.boundport);
1674
memcpy(mem, &req->packet._4.pad4, sizeof(req->packet._4.pad4));
1675
mem += sizeof(req->packet._4.pad4);
1677
memcpy(mem, &req->packet._4.NTLMSSP, sizeof(req->packet._4.NTLMSSP));
1678
mem += sizeof(req->packet._4.NTLMSSP);
1680
memcpy(mem, &req->packet._4.magic5, sizeof(req->packet._4.magic5));
1681
mem += sizeof(req->packet._4.magic5);
1683
memcpy(mem, &req->packet._4.pad5, sizeof(req->packet._4.pad5));
1684
mem += sizeof(req->packet._4.pad5);
1686
memcpy(mem, &req->packet._4.magic10, sizeof(req->packet._4.magic10));
1687
mem += sizeof(req->packet._4.magic10);
1689
memcpy(mem, &req->packet._4.magic10, sizeof(req->packet._4.magic10));
1690
mem += sizeof(req->packet._4.magic10);
1692
memcpy(mem, &req->packet._4.magic20, sizeof(req->packet._4.magic20));
1693
mem += sizeof(req->packet._4.magic20);
1695
memcpy(mem, &req->packet._4.pad10, sizeof(req->packet._4.pad10));
1696
mem += sizeof(req->packet._4.pad10);
1698
memcpy(mem, &req->packet._4.magic30, sizeof(req->packet._4.magic30));
1699
mem += sizeof(req->packet._4.magic30);
1701
memcpy(mem, &req->packet._4.pad15, sizeof(req->packet._4.pad15));
1702
mem += sizeof(req->packet._4.pad15);
1704
memcpy(mem, &req->packet._4.magic35, sizeof(req->packet._4.magic35));
1705
mem += sizeof(req->packet._4.magic35);
1707
memcpy(mem, &req->packet._4.magic40, sizeof(req->packet._4.magic40));
1708
mem += sizeof(req->packet._4.magic40);
1710
memcpy(mem, &req->packet._4.magic45, sizeof(req->packet._4.magic45));
1711
mem += sizeof(req->packet._4.magic45);
1713
memcpy(mem, &req->packet._4.pad20, sizeof(req->packet._4.pad20));
1714
mem += sizeof(req->packet._4.pad20);
1716
memcpy(mem, &req->packet._4.magic50, sizeof(req->packet._4.magic50));
1717
mem += sizeof(req->packet._4.magic50);
1719
memcpy(mem, &req->packet._4.magic55, sizeof(req->packet._4.magic55));
1720
mem += sizeof(req->packet._4.magic55);
1722
memcpy(mem, &req->packet._4.magic60, sizeof(req->packet._4.magic60));
1723
mem += sizeof(req->packet._4.magic60);
1725
memcpy(mem, &req->packet._4.pad25, sizeof(req->packet._4.pad25));
1726
mem += sizeof(req->packet._4.pad25);
1728
memcpy(mem, &req->packet._4.magic65, sizeof(req->packet._4.magic65));
1729
mem += sizeof(req->packet._4.magic65);
1731
memcpy(mem, &req->packet._4.magic70, sizeof(req->packet._4.magic70));
1732
mem += sizeof(req->packet._4.magic70);
1734
memcpy(mem, &req->packet._4.magic75, sizeof(req->packet._4.magic75));
1735
mem += sizeof(req->packet._4.magic75);
1739
case MSPROXY_RESOLVE:
1740
memcpy(mem, &req->packet.resolve.hostlength,
1741
sizeof(req->packet.resolve.hostlength));
1742
mem += sizeof(req->packet.resolve.hostlength);
1744
memcpy(mem, &req->packet.resolve.pad1,
1745
sizeof(req->packet.resolve.pad1));
1746
mem += sizeof(req->packet.resolve.pad1);
1748
memcpy(mem, &req->packet.resolve.host,
1749
(size_t)req->packet.resolve.hostlength);
1750
mem += req->packet.resolve.hostlength;
1754
case MSPROXY_LISTEN:
1755
case MSPROXY_CONNECT:
1756
memcpy(mem, &req->packet._5.magic1, sizeof(req->packet._5.magic1));
1757
mem += sizeof(req->packet._5.magic1);
1759
memcpy(mem, &req->packet._5.pad1, sizeof(req->packet._5.pad1));
1760
mem += sizeof(req->packet._5.pad1);
1762
memcpy(mem, &req->packet._5.magic3, sizeof(req->packet._5.magic3));
1763
mem += sizeof(req->packet._5.magic3);
1765
memcpy(mem, &req->packet._5.pad5, sizeof(req->packet._5.pad5));
1766
mem += sizeof(req->packet._5.pad5);
1768
memcpy(mem, &req->packet._5.magic6, sizeof(req->packet._5.magic6));
1769
mem += sizeof(req->packet._5.magic6);
1771
memcpy(mem, &req->packet._5.destport, sizeof(req->packet._5.destport));
1772
mem += sizeof(req->packet._5.destport);
1774
memcpy(mem, &req->packet._5.destaddr, sizeof(req->packet._5.destaddr));
1775
mem += sizeof(req->packet._5.destaddr);
1777
memcpy(mem, &req->packet._5.pad10, sizeof(req->packet._5.pad10));
1778
mem += sizeof(req->packet._5.pad10);
1780
memcpy(mem, &req->packet._5.magic10, sizeof(req->packet._5.magic10));
1781
mem += sizeof(req->packet._5.magic10);
1783
memcpy(mem, &req->packet._5.pad15, sizeof(req->packet._5.pad15));
1784
mem += sizeof(req->packet._5.pad15);
1786
memcpy(mem, &req->packet._5.srcport, sizeof(req->packet._5.srcport));
1787
mem += sizeof(req->packet._5.srcport);
1789
memcpy(mem, &req->packet._5.pad20, sizeof(req->packet._5.pad20));
1790
mem += sizeof(req->packet._5.pad20);
1791
strcpy(mem, req->executable);
1795
case MSPROXY_BINDINFO_ACK:
1796
case MSPROXY_CONNECTED:
1797
memcpy(mem, &req->packet._6.magic1, sizeof(req->packet._6.magic1));
1798
mem += sizeof(req->packet._6.magic1);
1800
memcpy(mem, req->packet._6.pad5, sizeof(req->packet._6.pad5));
1801
mem += sizeof(req->packet._6.pad5);
1803
memcpy(mem, &req->packet._6.magic5, sizeof(req->packet._6.magic5));
1804
mem += sizeof(req->packet._6.magic5);
1806
memcpy(mem, &req->packet._6.magic10, sizeof(req->packet._6.magic10));
1807
mem += sizeof(req->packet._6.magic10);
1809
memcpy(mem, req->packet._6.pad10, sizeof(req->packet._6.pad10));
1810
mem += sizeof(req->packet._6.pad10);
1812
memcpy(mem, &req->packet._6.magic15, sizeof(req->packet._6.magic15));
1813
mem += sizeof(req->packet._6.magic15);
1815
memcpy(mem, &req->packet._6.magic16, sizeof(req->packet._6.magic16));
1816
mem += sizeof(req->packet._6.magic16);
1818
memcpy(mem, &req->packet._6.magic20, sizeof(req->packet._6.magic20));
1819
mem += sizeof(req->packet._6.magic20);
1821
memcpy(mem, &req->packet._6.clientport,
1822
sizeof(req->packet._6.clientport));
1823
mem += sizeof(req->packet._6.clientport);
1825
memcpy(mem, &req->packet._6.clientaddr,
1826
sizeof(req->packet._6.clientaddr));
1827
mem += sizeof(req->packet._6.clientaddr);
1829
memcpy(mem, &req->packet._6.magic30, sizeof(req->packet._6.magic30));
1830
mem += sizeof(req->packet._6.magic30);
1832
memcpy(mem, &req->packet._6.magic35, sizeof(req->packet._6.magic35));
1833
mem += sizeof(req->packet._6.magic35);
1835
memcpy(mem, &req->packet._6.serverport,
1836
sizeof(req->packet._6.serverport));
1837
mem += sizeof(req->packet._6.serverport);
1839
memcpy(mem, &req->packet._6.srcport, sizeof(req->packet._6.srcport));
1840
mem += sizeof(req->packet._6.srcport);
1842
memcpy(mem, &req->packet._6.boundport,
1843
sizeof(req->packet._6.boundport));
1844
mem += sizeof(req->packet._6.boundport);
1846
memcpy(mem, &req->packet._6.boundaddr,
1847
sizeof(req->packet._6.boundaddr));
1848
mem += sizeof(req->packet._6.boundaddr);
1850
memcpy(mem, req->packet._6.pad30, sizeof(req->packet._6.pad30));
1851
mem += sizeof(req->packet._6.pad30);
1855
case MSPROXY_SESSIONEND:
1859
SERRX(req->command);
1866
msproxy_sessionsend(void)
1868
const char *function = "msproxy_sessionsend()";
1870
struct socksfd_t *socksfd;
1872
slog(LOG_DEBUG, function);
1874
for (i = 0, max = getdtablesize(); i < max; ++i) {
1875
if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
1878
if (socksfd->state.version != MSPROXY_V2)
1881
msproxy_sessionend(socksfd->control, &socksfd->state.msproxy);
1886
msproxy_sessionend(s, msproxy)
1888
struct msproxy_state_t *msproxy;
1890
const char *function = "msproxy_sessionend()";
1891
struct msproxy_request_t req;
1893
slog(LOG_DEBUG, function);
1895
bzero(&req, sizeof(req));
1896
*req.username = NUL;
1898
*req.executable = NUL;
1899
*req.clienthost = NUL;
1900
req.clientid = msproxy->clientid;
1901
req.serverid = msproxy->serverid;
1902
req.command = htons(MSPROXY_SESSIONEND);
1904
send_msprequest(s, msproxy, &req);
1909
msproxy_keepalive(sig)
1912
const char *function = "msproxy_keepalive()";
1913
struct msproxy_request_t req;
1914
struct msproxy_response_t res;
1915
struct socksfd_t *socksfd;
1918
slog(LOG_DEBUG, function);
1920
for (i = 0, max = getdtablesize(); i < max; ++i) {
1921
if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
1924
if (socksfd->state.version != MSPROXY_V2
1925
|| socksfd->state.inprogress)
1928
slog(LOG_DEBUG, "%s: sending keepalive packet", function);
1930
bzero(&req, sizeof(req));
1931
req.clientid = socksfd->state.msproxy.clientid;
1932
req.serverid = socksfd->state.msproxy.serverid;
1933
req.command = htons(MSPROXY_HELLO);
1935
if (send_msprequest(socksfd->control, &socksfd->state.msproxy, &req)
1939
if (recv_mspresponse(socksfd->control, &socksfd->state.msproxy, &res)