Changeset 0f4cea in git
- Timestamp:
- Aug 17, 2010, 7:44:14 PM (14 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 87288e357199d0d1b82ea6991972478b3f85a989
- Parents:
- 2a9ae7e3188ddde0e95b07d8b479d8b54333e214
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/ssiLink.cc
r2a9ae7 r0f4cea 19 19 #include <ctype.h> /*for isdigit*/ 20 20 #include <unistd.h> 21 #include <netdb.h> 21 22 22 23 … … 476 477 else if (strcmp(l->mode, "fork") == 0) mode = "fork"; 477 478 else if (strcmp(l->mode, "tcp") == 0) mode = "tcp"; 479 else if (strcmp(l->mode, "connect") == 0) mode = "connect"; 478 480 else mode = "a"; 479 481 … … 531 533 } 532 534 } 533 // stdin or stdout 534 else if (flag == SI_LINK_READ) 535 { 536 d->f_read = stdin; 537 mode = "r"; 538 } 539 else 540 { 541 d->f_write = stdout; 542 mode = "a"; 543 } 544 } 545 else 546 { 547 // tcp mode 548 if(strcmp(mode,"tcp")==0) 535 else if (strcmp(mode,"tcp")==0) 549 536 { 550 537 int sockfd, newsockfd, portno, clilen; … … 574 561 Print("waiting on port %d\n", portno);mflush(); 575 562 listen(sockfd,5); 576 char* cli_host = (char*)omAlloc(256);577 char* path = (char*)omAlloc(1024);578 int r = sscanf(l->name,"%255[^:]:%s",cli_host,path);579 if(r == 0)580 {581 WerrorS("ERROR: no host specified");582 return TRUE;583 }584 else if(r == 1)585 {586 path = "Singular";587 }588 Print("host: %s\n",cli_host);589 Print("path: %s\n",path);590 Print("%d\n",r);591 char* ssh_command = (char*)omAlloc(256);592 char* ser_host = (char*)omAlloc(64);593 gethostname(ser_host,64);594 sprintf(ssh_command,"ssh %s %s --batch --link=ssi--MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);595 system(ssh_command);596 clilen = sizeof(cli_addr);597 563 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen); 598 564 if(newsockfd < 0) … … 601 567 return TRUE; 602 568 } 569 PrintS("client accepted\n"); 603 570 d->fd_read = newsockfd; 604 571 d->fd_write = newsockfd; … … 607 574 SI_LINK_SET_RW_OPEN_P(l); 608 575 close(sockfd); 609 myynest=0; 610 fe_fgets_stdin=fe_fgets_dummy; 611 loop 612 { 613 leftv h=ssiRead1(l); /*contains an exit.... */ 614 if (feErrors != NULL && *feErrors != '\0') 576 } 577 // stdin or stdout 578 else if (flag == SI_LINK_READ) 579 { 580 d->f_read = stdin; 581 mode = "r"; 582 } 583 else 584 { 585 d->f_write = stdout; 586 mode = "a"; 587 } 588 } 589 else 590 { 591 // tcp mode 592 if(strcmp(mode,"tcp")==0) 593 { 594 int sockfd, newsockfd, portno, clilen; 595 struct sockaddr_in serv_addr, cli_addr; 596 int n; 597 sockfd = socket(AF_INET, SOCK_STREAM, 0); 598 if(sockfd < 0) 599 { 600 WerrorS("ERROR opening socket"); 601 return TRUE; 602 } 603 memset((char *) &serv_addr,0, sizeof(serv_addr)); 604 portno = 1024; 605 serv_addr.sin_family = AF_INET; 606 serv_addr.sin_addr.s_addr = INADDR_ANY; 607 do 608 { 609 portno++; 610 serv_addr.sin_port = htons(portno); 611 if(portno > 50000) 615 612 { 616 // handle errors: 617 PrintS(feErrors); /* currently quite simple */ 618 *feErrors = '\0'; 613 WerrorS("ERROR on binding (no free port available?)"); 614 return TRUE; 619 615 } 620 ssiWrite(l,h); 621 h->CleanUp(); 622 omFreeBin(h, sleftv_bin); 623 } 624 /* never reached*/ 616 } 617 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0); 618 Print("waiting on port %d\n", portno);mflush(); 619 listen(sockfd,5); 620 char* cli_host = (char*)omAlloc(256); 621 char* path = (char*)omAlloc(1024); 622 int r = sscanf(l->name,"%255[^:]:%s",cli_host,path); 623 if(r == 0) 624 { 625 WerrorS("ERROR: no host specified"); 626 return TRUE; 627 } 628 else if(r == 1) 629 { 630 path = "Singular"; 631 } 632 char* ssh_command = (char*)omAlloc(256); 633 char* ser_host = (char*)omAlloc(64); 634 gethostname(ser_host,64); 635 sprintf(ssh_command,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno); 636 system(ssh_command); 637 Print("client on %s started:%s\n",cli_host,path); 638 clilen = sizeof(cli_addr); 639 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen); 640 if(newsockfd < 0) 641 { 642 WerrorS("ERROR on accept"); 643 return TRUE; 644 } 645 PrintS("client accepted\n"); 646 d->fd_read = newsockfd; 647 d->fd_write = newsockfd; 648 d->f_read = fdopen(newsockfd, "r"); 649 d->f_write = fdopen(newsockfd, "w"); 650 SI_LINK_SET_RW_OPEN_P(l); 651 close(sockfd); 652 } 653 else if(strcmp(mode,"connect")==0) 654 { 655 char* host = (char*)omAlloc(256); 656 int sockfd, portno, n; 657 struct sockaddr_in serv_addr; 658 struct hostent *server; 659 660 sscanf(l->name,"%255[^:]:%d",host,&portno); 661 Print("connect to host %s, port %d\n",host,portno);mflush(); 662 if (portno!=0) 663 { 664 sockfd = socket(AF_INET, SOCK_STREAM, 0); 665 if (sockfd < 0) { WerrorS("ERROR opening socket"); return TRUE; } 666 server = gethostbyname(host); 667 if (server == NULL) { WerrorS("ERROR, no such host"); return TRUE; } 668 memset((char *) &serv_addr, 0, sizeof(serv_addr)); 669 serv_addr.sin_family = AF_INET; 670 bcopy((char *)server->h_addr, 671 (char *)&serv_addr.sin_addr.s_addr, 672 server->h_length); 673 serv_addr.sin_port = htons(portno); 674 if (connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 675 { WerrorS("ERROR connecting"); return TRUE; } 676 PrintS("connected\n");mflush(); 677 d->f_read=fdopen(sockfd,"r"); 678 d->fd_read=sockfd; 679 d->f_write=fdopen(sockfd,"w"); 680 d->fd_write=sockfd; 681 l->data=d; 682 SI_LINK_SET_RW_OPEN_P(l); 683 omFree(host); 684 } 685 else return TRUE; 625 686 } 626 687 else … … 931 992 /* return 0 on success, >0 else*/ 932 993 { 933 printf(host); 934 printf(port); 935 mflush(); 936 return(0); 994 int sockfd, portno, n; 995 struct sockaddr_in serv_addr; 996 struct hostent *server; 997 998 portno = atoi(port); 999 if (portno!=0) 1000 { 1001 sockfd = socket(AF_INET, SOCK_STREAM, 0); 1002 if (sockfd < 0) { WerrorS("ERROR opening socket"); exit(0); } 1003 server = gethostbyname(host); 1004 if (server == NULL) { WerrorS("ERROR, no such host"); exit(0); } 1005 memset((char *) &serv_addr, 0, sizeof(serv_addr)); 1006 serv_addr.sin_family = AF_INET; 1007 memcpy((char *)&serv_addr.sin_addr.s_addr, 1008 (char *)server->h_addr, 1009 server->h_length); 1010 serv_addr.sin_port = htons(portno); 1011 if (connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 1012 { WerrorS("ERROR connecting"); exit(0); } 1013 si_link l; 1014 if (slInit(l,"ssi:tcp")) WerrorS("error slInit"); 1015 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo)); 1016 d->f_read=fdopen(sockfd,"r"); 1017 d->fd_read=sockfd; 1018 d->f_write=fdopen(sockfd,"w"); 1019 d->fd_write=sockfd; 1020 l->data=d; 1021 SI_LINK_SET_RW_OPEN_P(l); 1022 loop 1023 { 1024 PrintS("start read\n"); 1025 leftv h=ssiRead1(l); /*contains an exit.... */ 1026 if (feErrors != NULL && *feErrors != '\0') 1027 { 1028 // handle errors: 1029 PrintS(feErrors); /* currently quite simple */ 1030 *feErrors = '\0'; 1031 } 1032 PrintS("start write\n"); 1033 ssiWrite(l,h); 1034 h->CleanUp(); 1035 omFreeBin(h, sleftv_bin); 1036 } 1037 /* never reached*/ 1038 exit(0); 1039 } 1040 exit(0); 937 1041 } 938 1042
Note: See TracChangeset
for help on using the changeset viewer.