Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/nap/dragonap/napster/nappy.c
1074 views
1
/*
2
napster code base by Drago ([email protected])
3
released: 11-30-99
4
*/
5
6
#include <stdio.h>
7
#include <netinet/in.h>
8
#include <sys/socket.h>
9
#include <stdlib.h>
10
#include <sys/types.h>
11
#include <netdb.h>
12
#include <errno.h>
13
#include <time.h>
14
#include <sys/time.h>
15
#include <unistd.h>
16
#include <string.h>
17
#include <signal.h>
18
#include <fcntl.h>
19
#include <sys/shm.h>
20
#include <signal.h>
21
#include <stdarg.h>
22
#include <assert.h>
23
24
//#define PACKET_FILE "10.0.0.115.1165-208.178.163.58.8888"
25
26
//#define PACKET_FILE "10.0.0.115.1146-208.178.163.58.7777"
27
//#define PACKET_FILE "208.178.163.58.6666-10.0.0.115.1117"
28
29
#define DEBUG
30
31
#ifdef DEBUG
32
#define D(fmt, args...) fprintf(stderr, fmt, ## args)
33
#else
34
#define D(fmt, args...) (void)0
35
#endif
36
37
#define I(fmt, args...) fprintf(stdout, fmt, ## args)
38
39
#define E(fmt, args...) fprintf(stderr, fmt, ## args)
40
41
42
typedef unsigned char COMMAND;
43
44
char *nslookup(char *addr);
45
int connect_to(char *to, int port);
46
47
void NAP_login(void);
48
int NAP_send(char *, int);
49
void NAP_disconnect(void);
50
void NAP_connect(void);
51
void NAP_loop(void);
52
void NAP_getcommand(void);
53
void NAP_addfile(char *, char *, int, int, int, int);
54
int NAP_readcount(char *, int);
55
void KB_getcommand(void);
56
void NAP_search(char *);
57
int getargs(char *, char ***);
58
void freeargs(char **);
59
char *argstring(char **);
60
void NAP_requestfile(char *, char *);
61
void NAP_getfile(char *);
62
char *basefile(char *);
63
64
char *username;
65
char *password;
66
int dataport=0;
67
int connectionspeed=6;
68
69
enum recv_Commands {
70
CMDR_STATS=214,
71
CMDR_EMAILADDR=3,
72
CMDR_MOTD=109,
73
CMDR_SEARCHRESULTS=201,
74
CMDR_SEARCHRESULTSEND=202,
75
CMDR_ERROR=0,
76
CMDR_ANOTHERUSER=148,
77
CMDR_SENDFILE=95,
78
CMDR_USERSPEED=209,
79
CMDR_REQUESTUSERSPEED=89,
80
CMDR_FILEREADY=204,
81
CMDR_GETERROR=206,
82
CMDR_GETQUEUE=108
83
};
84
85
86
enum send_Commands {
87
CMDS_LOGIN=2,
88
CMDS_SEARCH=200,
89
CMDS_REQUESTFILE=203,
90
CMDS_ADDFILE=100,
91
CMDS_ADDHOTLIST=208
92
};
93
94
int NAP_fd;
95
96
97
int main(int argc, char **argv) {
98
if (argc<3) {
99
I("nappy v0.1Beta1 By Drago ([email protected])\n");
100
I("Usage: %s <username> <password> [line speed]\n", argv[0]);
101
exit(1);
102
}
103
username=argv[1];
104
password=argv[2];
105
if (argc>3) connectionspeed=atoi(argv[3]);
106
NAP_connect();
107
NAP_login();
108
NAP_loop();
109
NAP_disconnect();
110
exit(0);
111
}
112
113
void NAP_loop() {
114
int sret;
115
struct timeval tv, tmptv;
116
fd_set rfd, tmprfd;
117
FD_ZERO(&rfd);
118
FD_SET(NAP_fd, &rfd);
119
FD_SET(STDIN_FILENO, &rfd);
120
tv.tv_sec=1;
121
tv.tv_usec=0;
122
while (1) {
123
tmprfd=rfd;
124
tmptv=tv;
125
sret = select(NAP_fd+1, &tmprfd, NULL, NULL, &tmptv);
126
if (sret>0) {
127
if (FD_ISSET(NAP_fd, &tmprfd)) {
128
NAP_getcommand();
129
}
130
if (FD_ISSET(STDIN_FILENO, &tmprfd)) {
131
KB_getcommand();
132
}
133
}
134
}
135
}
136
137
void NAP_sendcommand(COMMAND ncmd, char *fmt, ...) {
138
char buff[2048];
139
COMMAND cmd[4];
140
141
va_list ap;
142
va_start(ap, fmt);
143
cmd[0]=vsnprintf(buff, sizeof(buff), fmt, ap);
144
va_end(ap);
145
146
cmd[1]='\0';
147
cmd[2]=ncmd;
148
cmd[3]='\0';
149
150
D("Send Flags: %d %d %d %d\n", cmd[0], cmd[1], cmd[2], cmd[3]);
151
D("Send Data: %s\n", buff);
152
153
NAP_send(cmd, 4);
154
NAP_send(buff, cmd[0]);
155
}
156
157
void NAP_getcommand(void) {
158
char rbuff[1024];
159
static COMMAND cmd[4];
160
read(NAP_fd, cmd, sizeof(cmd));
161
if (cmd[1]==0) {
162
int r;
163
assert(sizeof(rbuff) > cmd[0]);
164
r=NAP_readcount(rbuff, cmd[0]);
165
} else {
166
int r=0;
167
int cc=cmd[3]+1;
168
while(cc>0) {
169
assert(sizeof(rbuff) > r);
170
if (read(NAP_fd, &rbuff[r], sizeof(char))==1) r++;
171
if (rbuff[r-1]=='.') cc--;
172
}
173
rbuff[r]=0;
174
}
175
176
D("Recv Flags: %d %d %d %d\n", cmd[0], cmd[1], cmd[2], cmd[3]);
177
D("Recv Data: %s\n", rbuff);
178
179
switch(cmd[2]) {
180
case CMDR_GETQUEUE:
181
I("Added to get queue: %s\n", rbuff);
182
break;
183
case CMDR_REQUESTUSERSPEED:
184
I("Requested user speed: %s\n", rbuff);
185
break;
186
case CMDR_GETERROR:
187
I("Get error: %s\n", rbuff);
188
break;
189
case CMDR_FILEREADY:
190
I("File is ready: %s\n", rbuff);
191
NAP_getfile(rbuff);
192
break;
193
case CMDR_USERSPEED:
194
I("User speed: %s\n", rbuff);
195
break;
196
case CMDR_SENDFILE:
197
I("Someone trying to get file: %s\n", rbuff);
198
break;
199
200
case CMDR_ANOTHERUSER:
201
I("Another user has logged in as you!\n");
202
exit(1);
203
break;
204
205
case CMDR_ERROR:
206
E("Error: %s\n", rbuff);
207
break;
208
209
case CMDR_SEARCHRESULTS:
210
I("Search results: %s\n", rbuff);
211
break;
212
213
case CMDR_SEARCHRESULTSEND:
214
I("End of search results\n");
215
break;
216
217
case CMDR_STATS:
218
I("Got stats: %s\n", rbuff);
219
break;
220
221
case CMDR_EMAILADDR:
222
I("Email address: %s\n", rbuff);
223
break;
224
225
case CMDR_MOTD:
226
I("Message: %s\n", rbuff);
227
break;
228
229
default:
230
E("Unknown command: %d\n", cmd[2]);
231
break;
232
}
233
}
234
235
int NAP_readcount(char *buff, int c) {
236
int rc=0;
237
while (c>rc) {
238
if (read(NAP_fd, &buff[rc], sizeof(char))==1) rc++;
239
}
240
buff[rc]=0;
241
}
242
243
void NAP_disconnect(void) {
244
close(NAP_fd);
245
}
246
247
void NAP_connect(void) {
248
#ifdef PACKET_FILE
249
NAP_fd=open(PACKET_FILE, O_RDONLY);
250
#else
251
NAP_fd=connect_to("208.178.163.59", 8888);
252
#endif
253
if (!NAP_fd>0) {
254
E("Error making connection.\n");
255
exit(1);
256
}
257
}
258
259
void NAP_login(void) {
260
int c;
261
char loginstr[1024];
262
c=snprintf(loginstr, sizeof(loginstr), "%s %s %d \"v2.0 BETA 3\" %d", username, password, dataport, connectionspeed);
263
NAP_sendcommand(CMDS_LOGIN, loginstr);
264
}
265
266
int NAP_send(char *data, int s) {
267
return write(NAP_fd, data, s);
268
}
269
270
int connect_to(char *to, int port) {
271
struct sockaddr_in socka;
272
int fd;
273
fd=socket(AF_INET, SOCK_STREAM, 0);
274
socka.sin_addr.s_addr=inet_addr(nslookup(to));
275
socka.sin_family=AF_INET;
276
socka.sin_port=htons(port);
277
if (connect(fd, (struct sockaddr *)&socka, sizeof(struct sockaddr))!=0) {
278
return -1;
279
}
280
return fd;
281
}
282
283
char *nslookup(char *addr) {
284
struct hostent *h;
285
if ((h=gethostbyname(addr)) == NULL) {
286
return addr;
287
}
288
return (char *)inet_ntoa(*((struct in_addr *)h->h_addr)) ;
289
}
290
291
void KB_getcommand(void) {
292
char **argv=NULL;
293
int argc;
294
char buff[1024];
295
fgets(buff, sizeof(buff), stdin);
296
buff[strlen(buff)-1]=0;
297
argc=getargs(buff, &argv);
298
299
if (argc>0) {
300
if (!strcasecmp(argv[0], "raw")) {
301
if (argc==1) {
302
I("raw <command id> <data>\n");
303
} else {
304
char *data;
305
if (argc==2) NAP_sendcommand(atoi(argv[1]), "");
306
else {
307
data=argstring(&argv[2]);
308
NAP_sendcommand(atoi(argv[1]), data);
309
free(data);
310
}
311
}
312
} else if (!strcasecmp(argv[0], "get")) {
313
if (argc<3) {
314
I("get <name> <file>\n");
315
} else {
316
char *f;
317
f=argstring(&argv[2]);
318
NAP_requestfile(argv[1], f);
319
free(f);
320
}
321
} else if (!strcasecmp(argv[0], "search")) {
322
if (argc==1) {
323
I("search <file>");
324
} else {
325
char *s;
326
s=argstring(&argv[1]);
327
NAP_search(s);
328
free(s);
329
}
330
}
331
}
332
333
freeargs(argv);
334
335
// NAP_sendcommand(CMDS_GETFILE, "Avenger713 \"The A-Team Theme.mp3\"");
336
337
}
338
339
void NAP_search(char *string) {
340
/*
341
FILENAME CONTAINS \"filename\" MAX_RESULTS 100000
342
*/
343
344
NAP_sendcommand(CMDS_SEARCH, "FILENAME CONTAINS \"%s\" MAX_RESULTS 10", string);
345
}
346
347
void NAP_addfile(char *filen, char *checksum, int size, int bitrate, int freq, int length) {
348
/*
349
Recv Flags: 121 0 100 0
350
Recv Data: "C:\napster2\Music\Korn - Follow The Leader - 15 - Got The Life.mp3"
351
fd40cd10955270701dd169d4e6739858 749568 160 44100 37
352
*/
353
NAP_sendcommand(CMDS_ADDFILE, "\"%s\" %s %d %d %d %d", filen, checksum, size, bitrate, freq, length);
354
}
355
356
void NAP_requestfile(char *from, char *file) {
357
NAP_sendcommand(CMDS_REQUESTFILE, "%s \"%s\"", from, file);
358
}
359
360
int getargs(char *s, char ***sargs) {
361
char *orig;
362
int escape=0;
363
char *beginword;
364
char *endword;
365
char **args=NULL;
366
int argc=0;
367
int myidx=0;
368
369
beginword=s;
370
endword=NULL;
371
372
while (1) {
373
switch(*s) {
374
case '"':
375
escape^=1;
376
break;
377
378
case ' ':
379
if (!escape)
380
endword=s;
381
break;
382
}
383
s++;
384
if (*s=='\0') endword=s;
385
if (endword) {
386
int len=endword-beginword;
387
char tmp[len+1];
388
strncpy(tmp, beginword, len);
389
tmp[len]=0;
390
endword=NULL;
391
beginword=s;
392
myidx=argc;
393
argc++;
394
args=(char **) realloc(args, sizeof(char *) * argc);
395
assert(args!=NULL);
396
args[myidx]=strdup(tmp);
397
}
398
if (!*s) break;
399
}
400
myidx=argc;
401
argc++;
402
args=(char **) realloc(args, sizeof(char *) * argc);
403
assert(args!=NULL);
404
args[myidx]=NULL;
405
*sargs=args;
406
return argc-1;
407
}
408
409
void freeargs(char **args) {
410
char **save=args;
411
while (*args) {
412
free(*args);
413
args++;
414
}
415
free(save);
416
}
417
418
char *argstring(char **start) {
419
char *buildit=NULL;
420
int len=0;
421
int addl=0;
422
423
while (*start) {
424
addl=strlen(*start);
425
buildit=(char *) realloc(buildit, addl+len+2);
426
assert(buildit!=NULL);
427
strncpy(&buildit[len], *start, addl);
428
len+=addl;
429
buildit[len]=' ';
430
buildit[len+1]='\0';
431
len++;
432
start++;
433
}
434
if (buildit!=NULL) {
435
buildit[len-1]=0;
436
}
437
return buildit;
438
}
439
440
void NAP_getfile(char *data) {
441
/*
442
gato242 3068149784 6699 "d:\mp3\Hackers_-_07_-_Orbital_-_Halcyon_&_On_&_On.mp3"
443
8b451240c17fec98ea4f63e26bd42c60 7
444
*/
445
446
int getfd, argc, port, linespeed, outfd, rc;
447
unsigned long int longip;
448
char getcmd[1024], cip[20], **argv, *nick, *ip, *file, *checksum;
449
char indata[1024];
450
char *fixedfile, c;
451
char *savefile;
452
struct sockaddr_in socka;
453
argc=getargs(data, &argv);
454
nick=argv[0];
455
ip=argv[1];
456
port=atoi(argv[2]);
457
file=argv[3];
458
checksum=argv[4];
459
linespeed=atoi(argv[5]);
460
getfd=socket(AF_INET, SOCK_STREAM, 0);
461
socka.sin_addr.s_addr=atol(ip);
462
socka.sin_family=AF_INET;
463
socka.sin_port=htons(port);
464
if (connect(getfd, (struct sockaddr *)&socka, sizeof(struct sockaddr))!=0) {
465
E("error connecting to file host (%s)\n", strerror(errno));
466
return;
467
}
468
469
read(getfd, &c, sizeof(c));
470
snprintf(getcmd, sizeof(getcmd), "GET");
471
write(getfd, getcmd, strlen(getcmd));
472
sleep(1);
473
snprintf(getcmd, sizeof(getcmd), "%s %s 0", username, file);
474
write(getfd, getcmd, strlen(getcmd));
475
476
fixedfile=file;
477
fixedfile++;
478
fixedfile[strlen(fixedfile)-1]=0;
479
480
savefile=basefile(fixedfile);
481
482
outfd=open(savefile, O_CREAT|O_EXCL|O_WRONLY);
483
if (!outfd) {
484
E("Error opening output file %s: %s\n", savefile, strerror(errno));
485
return;
486
}
487
if (fork()) return;
488
I("New child has been spawned with pid %d for download of %s from %s\n", getpid(), savefile, nick);
489
while ((rc=read(getfd, indata, sizeof(indata)))>0) {
490
if (rc==0) continue;
491
write(outfd, indata, rc);
492
}
493
I("File %s from %s done!\n", savefile, nick);
494
close(getfd);
495
close(outfd);
496
}
497
498
char *basefile(char *s) {
499
char *lastslash;
500
lastslash=strrchr(s, '\\');
501
if (!lastslash) return basename(s);
502
lastslash++;
503
return basename(lastslash);
504
}
505
506
507