main.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. #include"chaos.h"
  2. #include"definations.h"
  3. #include"errno.h"
  4. #include"fileManager.h"
  5. #include"include/ipmsg.h"
  6. #include"msgManager.h"
  7. #include"packMaker.h"
  8. #include"tcpReceiver.h"
  9. #include"udpReceiver.h"
  10. #include"usermanager.h"
  11. #include<arpa/inet.h>
  12. #include<cstdio>
  13. #include<cstdlib>
  14. #include<cstring>
  15. #include<fcntl.h>
  16. #include<net/if.h>
  17. #include<netdb.h>
  18. #include<netinet/in.h>
  19. #include<pthread.h>
  20. #include<pthread.h>
  21. #include<pwd.h>
  22. #include<sys/ioctl.h>
  23. #include<sys/socket.h>
  24. #include<sys/stat.h>
  25. #include<sys/types.h>
  26. #include<unistd.h>
  27. #include<utime.h>
  28. #include<vector>
  29. using std::vector;
  30. static Chaos* chaos=0;
  31. static UserManager* users=0;
  32. static MsgManager* msgs=0;
  33. static FileManager* filels=0;
  34. int main(){
  35. chaos=Chaos::getInstance();
  36. if(unlikely(chaos==NULL)){
  37. printf("\e[31mFatel error:\e[0mChaos not exist.\n");
  38. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,chaos,errno);
  39. exit(1);
  40. }
  41. users=UserManager::getInstance();
  42. if(unlikely(users==NULL)){
  43. printf("\e[31mFatel error:\e[0mUserManager not exist.\n");
  44. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,users,errno);
  45. exit(1);
  46. }
  47. msgs=MsgManager::getInstance();
  48. if(unlikely(msgs==NULL)){
  49. printf("\e[31mFatel error:\e[0mMsgManager not exist.\n");
  50. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,msgs,errno);
  51. }
  52. filels=FileManager::getInstance();
  53. if(unlikely(filels==NULL)){
  54. printf("\e[31mFatel error:\e[0mFileManager not exist.\n");
  55. dpf("%s,%d,%p,%d\n",__FILE__,__LINE__,filels,errno);
  56. }
  57. pthread_t udpThd;
  58. pthread_t tcpThd;
  59. pthread_attr_t attr;
  60. int funcAns=pthread_attr_init(&attr);
  61. if(unlikely(funcAns!=0)){
  62. printf("\e[31mFatel error:\e[0mthread create error.\n");
  63. dpf("%s,%d,%d,%d\n",__FILE__,__LINE__,funcAns,errno);
  64. exit(1);
  65. }
  66. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
  67. funcAns=pthread_create(&udpThd,&attr,thd_udpReceiver,NULL);
  68. if(unlikely(funcAns!=0)){
  69. printf("\e[31mFatel error:\e[0mthread create error.\n");
  70. dpf("%s,%d,%d,%d\n",__FILE__,__LINE__,funcAns,errno);
  71. exit(1);
  72. }
  73. funcAns=pthread_create(&tcpThd,&attr,thd_tcpReceiver,NULL);
  74. if(unlikely(funcAns!=0)){
  75. printf("\e[31mFatel error:\e[0mthread create error.\n");
  76. dpf("%s,%d,%d,%d\n",__FILE__,__LINE__,funcAns,errno);
  77. exit(1);
  78. }
  79. gethostname(users->myinfo.computername,100);
  80. struct passwd *pwd;
  81. pwd=getpwuid(getuid());
  82. strncpy(users->myinfo.sysusrname,pwd->pw_name,100);
  83. printf("waiting udp thread ready...\n");
  84. while(chaos->udpListen==false);
  85. printf("waiting tcp thread ready...\n");
  86. while(chaos->tcpListen==false);
  87. //broadcast...
  88. char buff[BUFFLEN];
  89. int opt=1;
  90. int pklen=mkHeartPack(buff,IPMSG_BR_ENTRY|IPMSG_BROADCASTOPT);
  91. int bcudpsock=chaos->udpsocket;
  92. struct sockaddr_in bcudpaddr;
  93. bzero(&bcudpaddr,sizeof(struct sockaddr_in));
  94. bcudpaddr.sin_family=AF_INET;
  95. bcudpaddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
  96. bcudpaddr.sin_port=htons(PORT);
  97. socklen_t bcudpaddr_len=sizeof(bcudpaddr);
  98. sprintf(buff+1,"1.feige.1");
  99. buff[10]=':';
  100. sendto(bcudpsock,buff+1,pklen-1,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  101. sprintf(buff,"%s",vermagic);
  102. buff[10]=':';
  103. sendto(bcudpsock,buff,pklen,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  104. if(1){ //console...
  105. char cmdbuf[BUFFLEN];
  106. char sendbuff[BUFFLEN];
  107. int sendlen=0;
  108. struct sockaddr_in c_addr;
  109. int sock=chaos->udpsocket;
  110. bzero(&c_addr,sizeof(c_addr));
  111. c_addr.sin_family=AF_INET;
  112. c_addr.sin_port=htons(PORT);
  113. socklen_t addr_len=sizeof(c_addr);
  114. while(chaos->programOK){
  115. msg_t tmpmsg;
  116. while(msgs->PopMsg(tmpmsg)==FUNCSUCCEED){
  117. char sztmpip[24];
  118. struct in_addr ip;
  119. ip.s_addr=tmpmsg.ip;
  120. strcpy(sztmpip,inet_ntoa(ip));
  121. printf("%s said:\n%s\n",sztmpip,tmpmsg.msg.c_str());
  122. }
  123. memset(cmdbuf,0,sizeof(cmdbuf));
  124. memset(sendbuff,0,sizeof(sendbuff));
  125. printf(">");
  126. fflush(stdin);
  127. fgets(cmdbuf,sizeof(cmdbuf),stdin);
  128. if(cmdbuf[0]==0)continue;
  129. if(cmdbuf[0]=='\n')continue;
  130. int curpos=0;
  131. char tmpbuf[BUFFLEN/16];
  132. sscanf(cmdbuf+curpos," %[^\n ]%n",tmpbuf,&curpos);
  133. if(strncmp(tmpbuf,"ls",3) ==0){
  134. list<user_t> tmplist;
  135. users->GetUserCopy(tmplist);
  136. for(auto person:tmplist){
  137. char tmpip[24];
  138. strcpy(tmpip,inet_ntoa(person.ip.sin_addr));
  139. printf("%-20s %-12s %-12s %-10s\n",tmpip,person.sysusrname,
  140. person.computername,person.usrname);
  141. }
  142. }else if(strncmp(tmpbuf,"la",3) ==0){
  143. char ipbuf[20];
  144. sscanf(cmdbuf+curpos," %[0-9.]",ipbuf);
  145. in_addr_t tarip=inet_addr(ipbuf);
  146. if(tarip==-1){
  147. printf("Invaild ip address.\n");
  148. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  149. }else{
  150. user_t tar;
  151. int findans=users->Finduser(tar,tarip);
  152. if(findans==FUNCSUCCEED){
  153. printf("%-20s:%s\n","IP Address",ipbuf);
  154. printf("%-20s:%s\n","System Username",tar.sysusrname);
  155. printf("%-20s:%s\n","Computer Username",tar.computername);
  156. printf("%-20s:%s\n","Username",tar.usrname);
  157. printf("%-20s:%s\n","Groupname",tar.grpname);
  158. printf("%-20s:%s\n","Mac Address",tar.macaddr);
  159. printf("%-20s:%s\n","Telephone Number",tar.phone);
  160. printf("%-20s:%s\n","E-mail Address",tar.mail);
  161. printf("%-20s:%s\n","Share Printer Name",tar.printer);
  162. printf("%-20s:%s\n","Icon Number",tar.icon);
  163. char statusbuf[16]={0};
  164. switch(tar.icon[0]){
  165. case '0':
  166. sprintf(statusbuf,"Online");
  167. break;
  168. case '1':
  169. sprintf(statusbuf,"Busy");
  170. break;
  171. case '2':
  172. sprintf(statusbuf,"Away from keyboard");
  173. break;
  174. }
  175. printf("%-20s:%s\n","User Status",statusbuf);
  176. printf("%-20s:%s\n","Sign",tar.sign);
  177. }else{
  178. printf("User %s not found.\n",ipbuf);
  179. }
  180. printf("\n");
  181. }
  182. }else if(strncmp(tmpbuf,"setmyinfo",10) ==0){
  183. char infobuf[1000];
  184. fflush(stdin);
  185. infobuf[0]=0;
  186. printf("Please input your username.Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.usrname);
  187. scanf(" %[^\n]",infobuf);
  188. if(infobuf[0]!='\n'){
  189. strncpy(users->myinfo.usrname,infobuf,100);
  190. }
  191. printf("\e[0m");
  192. fflush(stdin);
  193. infobuf[0]=0;
  194. printf("Please input your groupname.Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.grpname);
  195. scanf(" %[^\n]",infobuf);
  196. if(infobuf[0]!='\n'){
  197. strncpy(users->myinfo.grpname,infobuf,100);
  198. }
  199. printf("\e[0m");
  200. fflush(stdin);
  201. infobuf[0]=0;
  202. printf("Please input your phone number.Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.phone);
  203. scanf(" %[^\n]",infobuf);
  204. if(infobuf[0]!='\n'){
  205. strncpy(users->myinfo.phone,infobuf,20);
  206. }
  207. printf("\e[0m");
  208. fflush(stdin);
  209. infobuf[0]=0;
  210. printf("Please input your e-mail.Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.mail);
  211. scanf(" %[^\n]",infobuf);
  212. if(infobuf[0]!='\n'){
  213. strncpy(users->myinfo.mail,infobuf,100);
  214. }
  215. printf("\e[0m");
  216. fflush(stdin);
  217. infobuf[0]=0;
  218. printf("Please select your icon(0-31).Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.icon);
  219. scanf(" %[^\n]",infobuf);
  220. if(infobuf[0]!='\n'){
  221. strncpy(users->myinfo.icon,infobuf,10);
  222. }
  223. printf("\e[0m");
  224. fflush(stdin);
  225. infobuf[0]=0;
  226. printf("Please input your sign.Input nothing to keep current value.\n(current is \e[32m%2s\e[0m)\e[47;32m\n",users->myinfo.sign);
  227. scanf(" %[^\n]",infobuf);
  228. if(infobuf[0]!='\n'){
  229. strncpy(users->myinfo.sign,infobuf,1000);
  230. }
  231. printf("\e[0m");
  232. strncpy(users->myinfo.netstatus,"10000001",10);
  233. strncpy(users->myinfo.space02,"5",10);
  234. pklen=mkHeartPack(buff,IPMSG_BR_ENTRY);
  235. sendto(bcudpsock,buff,pklen,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  236. printf("Set personal info complete!\n");
  237. }else if(strncmp(tmpbuf,"send",5) ==0){
  238. char ipbuf[20];
  239. int optstart;
  240. sscanf(cmdbuf+curpos," %[^\n ]%n",ipbuf,&optstart);
  241. in_addr_t tarip=inet_addr(ipbuf);
  242. if(tarip==-1){
  243. printf("Invaild ip address.\n");
  244. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  245. }else{
  246. char msgbuf[BUFFLEN];
  247. sscanf(cmdbuf+curpos+optstart," %[^\n]%n",msgbuf,&curpos);
  248. c_addr.sin_addr.s_addr=tarip;
  249. sendlen=mkHeader(sendbuff,IPMSG_SENDMSG);
  250. sendlen+=sprintf(sendbuff+sendlen,msgbuf);
  251. sendlen+=sprintf(sendbuff+sendlen,"%s",fontmagic);
  252. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  253. printf("\n");
  254. }
  255. }else if(strncmp(tmpbuf,"refresh",8) ==0){
  256. users->UserIllness();
  257. pklen=mkHeartPack(buff,IPMSG_BR_ENTRY|IPMSG_BROADCASTOPT);
  258. sprintf(buff+1,"1.feige.1");
  259. buff[10]=':';
  260. sendto(bcudpsock,buff+1,pklen-1,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  261. sprintf(buff,"%s",vermagic);
  262. buff[10]=':';
  263. sendto(bcudpsock,buff,pklen,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  264. printf("BroadCast to %s\n",inet_ntoa(bcudpaddr.sin_addr));
  265. printf("Refreshing");
  266. fflush(stdout);
  267. sleep(1);
  268. printf(".");
  269. fflush(stdout);
  270. sleep(1);
  271. printf(".");
  272. fflush(stdout);
  273. sleep(1);
  274. printf(".");
  275. fflush(stdout);
  276. sleep(1);
  277. list<user_t> tmpusr;
  278. users->GetUserCopy(tmpusr);
  279. auto i=tmpusr.begin();
  280. auto z=tmpusr.end();
  281. for(;i!=z;i++){
  282. if(i->healthy==false){
  283. users->Deluser(i->ip);
  284. }
  285. }
  286. printf("\n");
  287. }else if(strncmp(tmpbuf,"lsfile",7) ==0){
  288. list<recvfile_t> tmprecvls;
  289. filels->GetrecvCopy(tmprecvls);
  290. for(auto i:tmprecvls){
  291. struct sockaddr_in tmpaddr;
  292. tmpaddr.sin_addr.s_addr=i.tarIp;
  293. char tmpip[24];
  294. strcpy(tmpip,inet_ntoa(tmpaddr.sin_addr));
  295. int typeindex=((i.filetype>0)&&(i.filetype<11))?i.filetype:0;
  296. printf("%20s-%-12u %15s %s\n",tmpip,i.fileno,filetype_str[i.filetype],i.filename.c_str());
  297. }
  298. printf("Press any key to continue...");
  299. getchar();
  300. list<sendfile_t> tmpsendls;
  301. filels->GetsendCopy(tmpsendls);
  302. for(auto i:tmpsendls){
  303. struct sockaddr_in tmpaddr;
  304. tmpaddr.sin_addr.s_addr=i.tarIp;
  305. char tmpip[24];
  306. strcpy(tmpip,inet_ntoa(tmpaddr.sin_addr));
  307. int typeindex=((i.filetype>0)&&(i.filetype<11))?i.filetype:0;
  308. printf("%20s-%-12u %15s %s\n",tmpip,i.fileno,filetype_str[i.filetype],i.filename.c_str());
  309. }
  310. printf("Press any key to continue...");
  311. getchar();
  312. }else if(strncmp(tmpbuf,"sendfile",9) ==0){
  313. char raw_ip[20];
  314. char fnamebuf[BUFFLEN];
  315. char extra=0;
  316. struct in_addr tmpip;
  317. int optindex=0;
  318. sscanf(cmdbuf+curpos," %[^\n ]%n",raw_ip,&optindex);
  319. if(inet_aton(raw_ip,&tmpip)!=-1){
  320. sscanf(cmdbuf+curpos+optindex," %[^\n ]%n",fnamebuf,&optindex);
  321. if(fnamebuf[0]=='-'){
  322. extra=fnamebuf[1];
  323. sscanf(cmdbuf+curpos," %[^\n ]%n",fnamebuf,&curpos);
  324. }
  325. struct stat statbuf;
  326. int statans=stat(fnamebuf,&statbuf);
  327. puts(fnamebuf);
  328. if(statans==0){
  329. char nakedfnamebuf[BUFFLEN];
  330. char* tmp=strrchr(fnamebuf,'/');
  331. if(tmp!=NULL){
  332. strcpy(nakedfnamebuf,strrchr(fnamebuf,'/')+1);
  333. }else{
  334. strcpy(nakedfnamebuf,fnamebuf);
  335. }
  336. int filetp=0;
  337. if(S_ISREG(statbuf.st_mode)){
  338. filetp=IPMSG_FILE_REGULAR;
  339. }else if(S_ISDIR(statbuf.st_mode)){
  340. filetp=IPMSG_FILE_DIR;
  341. }
  342. if(filetp){
  343. unsigned packno;
  344. sendlen=mkHeader(sendbuff,IPMSG_SENDMSG|IPMSG_FILEATTACHOPT|IPMSG_SENDCHECKOPT,&packno);
  345. sendlen+=sprintf(sendbuff+sendlen,"")+1;
  346. sendlen+=sprintf(sendbuff+sendlen,"%u:%s:%x:0:%u:%u:%u:%u:",
  347. packno-1,nakedfnamebuf,statbuf.st_size,filetp,
  348. statbuf.st_atime,statbuf.st_mtime,statbuf.st_ctime)+1;
  349. sendfile_t sendnode;
  350. sendnode.tarIp=tmpip.s_addr;
  351. sendnode.fileno=packno-1;
  352. sendnode.filename=nakedfnamebuf;
  353. sendnode.filesize=statbuf.st_size;
  354. sendnode.filelocate=fnamebuf;
  355. sendnode.filetype=filetp;
  356. if(filels->Addsend(sendnode)==FUNCSUCCEED){
  357. c_addr.sin_addr.s_addr=tmpip.s_addr;
  358. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  359. }else{
  360. printf("Unknown error,please retry.\n");
  361. }
  362. }
  363. }else{
  364. printf("Read file information error.\n");
  365. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  366. }
  367. }else{
  368. printf("Invalid ip address!\n");
  369. }
  370. }else if(strncmp(tmpbuf,"recvfile",9) ==0){ //From this function, A rebuild occured, Code style changed
  371. char raw_ip[20];
  372. unsigned fileno;
  373. struct in_addr tmpip;
  374. char other[BUFFLEN]={0};
  375. char optlocate[BUFFLEN]={0};
  376. sscanf(cmdbuf+curpos," %[^\n-]-%u %[%^\n]",raw_ip,&fileno,other);
  377. if(inet_aton(raw_ip,&tmpip)==-1){
  378. printf("Invalid ip address!\n");
  379. continue;
  380. }
  381. if((other[0]=='-')&&((other[1]=='f')||(other[1]=='F'))){
  382. sscanf(other+2," %[^\n]",optlocate);
  383. }
  384. recvfile_t recvnode;
  385. if(filels->Findrecv(fileno,tmpip.s_addr,recvnode)==FUNCFAILED){
  386. printf("Pending file not found!\n");
  387. continue;
  388. }
  389. if(optlocate[0]==0){
  390. sprintf(optlocate,"./%s",recvnode.filename.c_str());
  391. }
  392. int sockfd=socket(AF_INET,SOCK_STREAM,0); //NC
  393. if(sockfd==-1){
  394. printf("Connect failed!\n");
  395. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  396. continue;
  397. }
  398. struct sockaddr_in addr;
  399. addr.sin_family=AF_INET;
  400. addr.sin_addr.s_addr=tmpip.s_addr;
  401. addr.sin_port=htons(PORT);
  402. int len=sizeof(addr);
  403. int newsockfd=connect(sockfd,(struct sockaddr *)&addr,len); //NC
  404. if(newsockfd==-1){
  405. printf("Connect failed!\n");
  406. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  407. close(sockfd);
  408. continue;
  409. }
  410. char sendbuff[BUFFLEN];
  411. int sendlen;
  412. char recvbuff[BUFFLEN];
  413. int recvlen;
  414. int filetp;
  415. if(recvnode.filetype==IPMSG_FILE_REGULAR){
  416. filetp=IPMSG_GETFILEDATA;
  417. FILE * fp;
  418. if((fp=fopen(optlocate,"wb"))==NULL){ //NC
  419. printf("Open %s failed:%d.\n",optlocate,errno);
  420. close(sockfd);
  421. continue;
  422. }
  423. sendlen=mkHeader(sendbuff,filetp);
  424. sendlen+=sprintf(sendbuff+sendlen,"%lx:%lx:0:",recvnode.fileno+1,recvnode.fileno);
  425. send(sockfd,sendbuff,sendlen,0);
  426. char *filebuff=(char *)malloc(recvnode.filesize); //NC
  427. if(filebuff==NULL){
  428. printf("Recving failed.Not enough memory.\n");
  429. close(sockfd);
  430. fclose(fp);
  431. }
  432. bool transok=false;
  433. while(transok==false){
  434. recvlen=recv(sockfd,filebuff,sizeof(filebuff),0);
  435. if(recvlen<=0){
  436. transok=true;
  437. }else{
  438. fwrite(filebuff,recvlen,1,fp);
  439. }
  440. }
  441. fclose(fp);
  442. free(filebuff);
  443. filels->Delrecv(fileno,tmpip.s_addr);
  444. }else if(recvnode.filetype==IPMSG_FILE_DIR){
  445. filetp=IPMSG_GETDIRFILES;
  446. int mkans=mkdir(optlocate,0755);
  447. if(mkans==-1){
  448. printf("Create directory failed:%d.",errno);
  449. dpf("%d,%s,%d\n",__LINE__,__FILE__,errno);
  450. continue;
  451. }
  452. sendlen=mkHeader(sendbuff,filetp);
  453. sendlen+=sprintf(sendbuff+sendlen,"%lx:%lx:0:",recvnode.fileno+1,recvnode.fileno);
  454. send(sockfd,sendbuff,sendlen,0);
  455. bool transok=false;
  456. while(transok==false){
  457. recvlen=recv(sockfd,recvbuff,BUFFLEN,0);
  458. if(recvlen<=0){
  459. transok=true;
  460. }else{
  461. utime(optlocate,NULL);
  462. transok=true;//FIXME: I ignored all file under a directory.Someday this sentence need to be removed.
  463. }
  464. }
  465. filels->Delrecv(fileno,tmpip.s_addr);
  466. }else{
  467. printf("Unsupported file type.\n");
  468. }
  469. close(sockfd);
  470. }else if(strncmp(tmpbuf,"refuse",7) ==0){
  471. char raw_ip[20];
  472. unsigned fileno;
  473. struct in_addr tmpip;
  474. char other[BUFFLEN]={0};
  475. char optlocate[BUFFLEN]={0};
  476. sscanf(cmdbuf+curpos," %[^\n-]-%u",raw_ip,&fileno);
  477. if(inet_aton(raw_ip,&tmpip)==-1){
  478. printf("Invalid ip address!\n");
  479. continue;
  480. }
  481. recvfile_t recvnode;
  482. if(filels->Findrecv(fileno,tmpip.s_addr,recvnode)==FUNCFAILED){
  483. printf("Pending file not found!\n");
  484. continue;
  485. }
  486. filels->Delrecv(fileno,tmpip.s_addr);
  487. sendlen=mkHeader(sendbuff,IPMSG_EX_REFUSEFILE);
  488. sendlen+=sprintf(sendbuff+sendlen,"%lx",recvnode.fileno+1)+1;
  489. sendlen+=sprintf(sendbuff+sendlen,"");
  490. sendlen+=sprintf(sendbuff+sendlen,"%lx",recvnode.fileno);
  491. c_addr.sin_addr.s_addr=tmpip.s_addr;
  492. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  493. printf("\n");
  494. }else if(strncmp(tmpbuf,"cancel",7) ==0){
  495. char raw_ip[20];
  496. unsigned fileno;
  497. struct in_addr tmpip;
  498. char other[BUFFLEN]={0};
  499. char optlocate[BUFFLEN]={0};
  500. sscanf(cmdbuf+curpos," %[^\n-]-%u",raw_ip,&fileno);
  501. if(inet_aton(raw_ip,&tmpip)==-1){
  502. printf("Invalid ip address!\n");
  503. continue;
  504. }
  505. sendfile_t sendnode;
  506. if(filels->Findsend(fileno,tmpip.s_addr,sendnode)==FUNCFAILED){
  507. printf("Pending file not found!\n");
  508. continue;
  509. }
  510. filels->Delsend(fileno,tmpip.s_addr);
  511. sendlen=mkHeader(sendbuff,IPMSG_EX_CANCELFILE);
  512. sendlen+=sprintf(sendbuff+sendlen,"%lx",sendnode.fileno+1)+1;
  513. sendlen+=sprintf(sendbuff+sendlen,"");
  514. sendlen+=sprintf(sendbuff+sendlen,"%lx",sendnode.fileno);
  515. c_addr.sin_addr.s_addr=tmpip.s_addr;
  516. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  517. printf("\n");
  518. }else if(strncmp(tmpbuf,"listen",7) ==0){
  519. printf("Unimplemented feature.\n");
  520. continue;
  521. }else if(strncmp(tmpbuf,"system",7) ==0){
  522. char other[BUFFLEN]={0};
  523. sscanf(cmdbuf+curpos," %[^\n]",other);
  524. system(other);
  525. printf("\n");
  526. }else if(strncmp(tmpbuf,"setnetwork",11)==0){
  527. struct ifconf ifconf;
  528. struct ifreq *ifreq;
  529. vector<unsigned> arrayip;
  530. char buf[512];
  531. ifconf.ifc_len=512;
  532. ifconf.ifc_buf=buf;
  533. ioctl(sock,SIOCGIFCONF,&ifconf);
  534. ifreq=(struct ifreq*)ifconf.ifc_buf;
  535. struct ifreq*ifreqbackup=ifreq;
  536. printf("Founded network device number:%d\n",(ifconf.ifc_len/sizeof (struct ifreq)));
  537. for (int i=(ifconf.ifc_len/sizeof (struct ifreq)); i>0; i--){
  538. if(ifreq->ifr_flags == AF_INET){ //for ipv4
  539. printf("name =[%s]\n" , ifreq->ifr_name);
  540. printf("local addr = [%s]\n" ,inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
  541. arrayip.push_back(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr.s_addr);
  542. ifreq++;
  543. }
  544. }
  545. printf("Select your device[1-%d]:",arrayip.size());
  546. int select=0;
  547. scanf(" %d",&select);
  548. fflush(stdin);
  549. if((select>=1)&&(select<=arrayip.size())){
  550. printf("Reset network device success!\n");
  551. bcudpaddr.sin_addr.s_addr=arrayip[select-1]|0xFF000000UL;
  552. struct in_addr tmpip;
  553. tmpip.s_addr=arrayip[select-1];
  554. strncpy(users->myinfo.ipaddr,inet_ntoa(tmpip),20);
  555. int macsel=select;
  556. while(macsel>1){
  557. macsel--;
  558. ifreqbackup++;
  559. }
  560. sprintf(users->myinfo.macaddr,"%02X-%02X-%02X-%02X-%02X-%02X",
  561. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[0],
  562. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[1],
  563. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[2],
  564. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[3],
  565. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[4],
  566. (unsigned char)ifreqbackup->ifr_hwaddr.sa_data[5]);
  567. }else{
  568. printf("Invalid device number!\n");
  569. }
  570. }else if(strncmp(tmpbuf,"exit",5) ==0){
  571. chaos->programOK=false;
  572. }else if(strncmp(tmpbuf,"help",5) ==0){
  573. printf("*****************************Help Menu****************************\n");
  574. printf(" ls-------------------------------------------list all online usr \n");
  575. printf(" la [ip]-----------------------------------list detail infomation \n");
  576. printf(" refresh---------------------------------------refresh online usr \n");
  577. printf(" **************************************************************** \n");
  578. printf(" send [ip] [message]--------------------------------begin to chat \n");
  579. printf(" sendfile [ip] [filename] -----------------send file or directory \n");
  580. printf(" recvfile [ip]-[fileno] {-fF [newname]}----recv file or directory \n");
  581. printf(" lsfile-------------------------------------list all pending file \n");
  582. printf(" refuse [ip]-[fileno]-----------------------refuse to accept file \n");
  583. printf(" cancel [ip]-[fileno]-------------------------cancel to send file \n");
  584. printf(" **************************************************************** \n");
  585. printf(" setmyinfo---------------------------------------------set myinfo \n");
  586. printf(" setnetwork---------------------------------select network device \n");
  587. printf(" help---------------------------------------------------help info \n");
  588. printf(" exit-------------------------------------------------quit system \n");
  589. printf(" **************************************************************** \n");
  590. printf(" system [command]------------------------------call shell command \n");
  591. printf("*****************************Help Menu*************************** \n");
  592. }else{
  593. printf("Unknown command!\nUse \"help\" to get more info.\n");
  594. }
  595. }
  596. sendlen=mkHeader(sendbuff,IPMSG_BR_EXIT);
  597. sendlen+=sprintf(sendbuff+sendlen,"%s",users->myinfo.usrname);
  598. sendto(bcudpsock,sendbuff,sendlen,0,(struct sockaddr*)&bcudpaddr,bcudpaddr_len);
  599. list<user_t> tmplist;
  600. users->GetUserCopy(tmplist);
  601. for(auto person:tmplist){
  602. c_addr.sin_addr.s_addr=person.ip.sin_addr.s_addr;
  603. sendto(sock,sendbuff,sendlen,0,(struct sockaddr*)&c_addr,addr_len);
  604. }
  605. printf("Exiting...\n");
  606. pthread_join(udpThd,NULL);
  607. pthread_join(tcpThd,NULL);
  608. }
  609. if(0){ //TODO:XCUI...
  610. }
  611. return 0;
  612. }