home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / uniflex.zip / ufserv.c < prev    next >
C/C++ Source or Header  |  1993-08-23  |  7KB  |  235 lines

  1. #include "ufk.h"
  2. #include <signal.h>
  3. #include <stat.h>
  4.  
  5. /*
  6.  *      s e r v e r
  7.  */
  8.  
  9. server()
  10. {
  11.    char num, i;
  12.    int len;
  13.    extern char rec_filnam[];
  14.    char filename[50];
  15.    struct stat statbuf;
  16.  
  17.    if (!open_port(TRUE,FALSE))         /* Setup communication port */
  18.       prterr(ER_POPNERR);
  19.    else
  20.    {
  21.       n = 0;                           /* initialize message number */
  22.       numtry = 0;                      /* say no tries yet */
  23.       sflg = 0;
  24.       set_frame();
  25.       posit(0,21);
  26.       if (!nooutput)
  27.       {
  28.          if (remote)
  29.          {
  30.             fputs("Server running... Type your kermit 'BYE' or 'FINISH'\n\l",
  31.                   stdout);
  32.             fputs("commands, or ctrl-X to quit the server.\n\l",stdout);
  33.          }
  34.          else
  35.            fputs("Type ctrl-X to quit the server.\n\l",stdout);
  36.       }
  37.       set_default_comm();              /* Set default communication */
  38.       if (alloc_pkt(RECEIVE))          /* Setup packet buffers */
  39.          while(TRUE)
  40.          {
  41.             aborted = FALSE;           /* Reset eventual abort condition */
  42.             switch(rpack(&len,&num,recpkt,1))/* do this as long as necessary */
  43.             {
  44.                case 'S':
  45.                      rflg++;           /* Flag receive file */
  46.                      set_frame();
  47.                      n = num;
  48.                      rpar(recpkt,len);  /* setup receive parameters */
  49.                      spar(sndpkt,&len); /* setup transmit parameters */
  50.                      spack('Y',n,len,sndpkt,0,1);
  51.                      alloc_pkt(RECEIVE);/* Define correct buffers */
  52.                      numtry = 0;
  53.                      rec_filnam[0] = '\0'; /* Use default name */
  54.                      n = (n + 1) % 64;
  55.                      recsw('F');        /* switch to 'F' state */
  56.                      break;
  57.  
  58.                case 'I':
  59.                      set_frame();
  60.                      n = num;
  61.                      rpar(recpkt,len);   /* setup receive parameters */
  62.                      spar(sndpkt,&len);  /* setup transmit parameters */
  63.                      spack('Y',n,len,sndpkt,0,1);
  64.                      break;
  65.  
  66.                case 'R':
  67.                      i = 0;
  68.                      do
  69.                         filename[i] = recpkt[i]; /* copy filename */
  70.                      while((recpkt[i++] != '\0') && (i < len));
  71.                      filename[i] = '\0';   /* Mark end of string */
  72.                      numprm = 2;
  73.                      params[1] = filename; /* Setup pointer to filename */
  74.                      if (get_file_spec(TRUE))/* Parse filespec */
  75.                      {
  76.                         sflg = 2;          /* Flag send file */
  77.                         set_frame();
  78.                         alloc_pkt(SEND);   /* Define correct buffers */
  79.                         sendsw();          /* Send file */
  80.                         n = 0;
  81.                      }
  82.                      else
  83.                         error(PER_OPEN,"%s",filename); /* Cannot open file */
  84.                      break;
  85.  
  86.                case 'G':                   /* 'general' command */
  87.                      set_frame();
  88.                      switch(*recpkt)
  89.                      {
  90.                         case 'L':          /* logout */
  91.                                  spack('Y',num,0,0,0,1);  /* acknowledge */
  92.                                  kdelay(1); /* Give him time for response */
  93.                                  close_port(TRUE,TRUE);
  94.                                  stat("/act/utmp",&statbuf);
  95.                                  if (statbuf.st_size != 0)/* su mode if not 0*/
  96.                                     kill(0,SIGKILL);/* stop if successful */
  97.                                  else
  98.                                     exit(0);  /* Normal exit in su mode */
  99.  
  100.                         case 'F':          /* finish */
  101.                                  spack('Y',num,0,0,0,1);  /* acknowledge */
  102.                                  close_port(TRUE,FALSE);
  103.                                  return;
  104.  
  105.                         default:
  106.                                  error(PER_UNIMPL); /* Not implemented */
  107.                      }
  108.                      break;
  109.  
  110.                case 'T':                   /* timeout */
  111.                      if (aborted)
  112.                      {
  113.                         close_port(TRUE,FALSE);
  114.                         return;            /* aborted by user */
  115.                      }
  116.                      spack('N',n,0,0,0,1); /* send NAK */
  117.                      break;
  118.  
  119.                case 'N':
  120.                case 'E':
  121.                      break;                /* Eat NAK and error packet */
  122.  
  123.                case FALSE:
  124.                      error(PER_PACKET);    /* Packet error */
  125.                      break;
  126.  
  127.                default:
  128.                      if (aborted)
  129.                      {
  130.                         close_port(TRUE,FALSE);
  131.                         return;
  132.                      }
  133.                      error(PER_UNIMPL);    /* Not implemented */
  134.             }
  135.             rflg = sflg = 0;
  136.             set_default_comm();            /* Set default communication */
  137.          }
  138.       close_port(TRUE,FALSE);
  139.    }
  140. }
  141.  
  142. /*
  143.  * stop remote server
  144.  */
  145.  
  146. finish()
  147. {
  148.    if (remote)
  149.       prterr(ER_ILLREMOT);
  150.    else
  151.    {
  152.       if (!do_generic('F'))
  153.       {
  154.          disp(0,18,"Finish failed\n");
  155.          beep();
  156.       }
  157.       close_port(TRUE,FALSE);
  158.    }
  159. }
  160.  
  161. /*
  162.  * log out remote server and local kermit
  163.  */
  164.  
  165. bye()
  166. {
  167.    if (remote)
  168.       prterr(ER_ILLREMOT);
  169.    else
  170.    {
  171.       if (!do_generic('L'))
  172.       {
  173.          disp(0,18,"Bye failed\n");
  174.          beep();
  175.       }
  176.       else
  177.       {
  178.          close_port(TRUE,FALSE);
  179.          kerm_exit();
  180.       }
  181.       close_port(TRUE,FALSE);
  182.    }
  183. }
  184.  
  185. /*
  186.  * send server function
  187.  */
  188.  
  189. do_generic(function)
  190. char function;
  191. {
  192.    char num;
  193.    int len;
  194.  
  195.    n = 0;                                 /* initialize message number */
  196.    numtry = 0;                            /* say no tries yet */
  197.  
  198.    if (!open_port(TRUE,FALSE))            /* Setup communication port */
  199.       prterr(ER_POPNERR);
  200.    else
  201.    {
  202.       if (alloc_pkt(SEND))                /* Setup buffers */
  203.       {
  204.          set_frame();
  205.          set_default_comm();              /* setup default communication */
  206.          *sndpkt = function;              /* insert GENERIC command */
  207.          *(sndpkt+sizeof(char)) = '\0';   /* For debug printout */
  208.  
  209.          while(TRUE)
  210.          {
  211.             num = 0;
  212.             spack('G',num,1,sndpkt,0,1);  /* send GENERIC packet */
  213.             switch(rpack(&len,&num,recpkt,1))
  214.             {
  215.                case 'Y':
  216.                         return(TRUE);     /* valid response */
  217.  
  218.                case 'E':
  219.                         prerrpkt(recpkt);
  220.                         return(FALSE);    /* received an error */
  221.  
  222.                case 'T':
  223.                         if (aborted)
  224.                            return(FALSE); /* aborted by user */
  225.  
  226.                default:
  227.                         if (numtry++ > maxtry)
  228.                            return(FALSE); /* too many errors */
  229.             }
  230.          }
  231.       }
  232.    }
  233.    return (FALSE);                     /* failure */
  234. }
  235.