Changeset 0f4cea in git


Ignore:
Timestamp:
Aug 17, 2010, 7:44:14 PM (14 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
87288e357199d0d1b82ea6991972478b3f85a989
Parents:
2a9ae7e3188ddde0e95b07d8b479d8b54333e214
Message:
ssi:connect

git-svn-id: file:///usr/local/Singular/svn/trunk@13124 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/ssiLink.cc

    r2a9ae7 r0f4cea  
    1919#include <ctype.h>   /*for isdigit*/
    2020#include <unistd.h>
     21#include <netdb.h>
    2122
    2223
     
    476477  else if (strcmp(l->mode, "fork") == 0) mode = "fork";
    477478  else if (strcmp(l->mode, "tcp") == 0) mode = "tcp";
     479  else if (strcmp(l->mode, "connect") == 0) mode = "connect";
    478480  else mode = "a";
    479481
     
    531533      }
    532534    }
    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)
    549536    {
    550537      int sockfd, newsockfd, portno, clilen;
     
    574561      Print("waiting on port %d\n", portno);mflush();
    575562      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);
    597563      newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
    598564      if(newsockfd < 0)
     
    601567        return TRUE;
    602568      }
     569      PrintS("client accepted\n");
    603570      d->fd_read = newsockfd;
    604571      d->fd_write = newsockfd;
     
    607574      SI_LINK_SET_RW_OPEN_P(l);
    608575      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)
    615612        {
    616           // handle errors:
    617           PrintS(feErrors); /* currently quite simple */
    618           *feErrors = '\0';
     613          WerrorS("ERROR on binding (no free port available?)");
     614          return TRUE;
    619615        }
    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;
    625686    }
    626687    else
     
    931992/* return 0 on success, >0 else*/
    932993{
    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);
    9371041}
    9381042
Note: See TracChangeset for help on using the changeset viewer.