home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / MiscCli / c / Transfer < prev   
Encoding:
Text File  |  1994-08-21  |  3.6 KB  |  168 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "domain.h"
  7. #include "timer.h"
  8. #include "icmp.h"
  9. #include "netuser.h"
  10. #include "tcp.h"
  11. #include "telnet.h"
  12. #include "session.h"
  13. #include "misc.h"
  14. #include "Terminal.h"
  15. #include "wimpt.h"
  16.  
  17. extern char nospace[];
  18. extern char badhost[];
  19.  
  20. static void trf_rx(register struct telnet *tn, struct mbuf *bp)
  21. {
  22.   if (tn->session->record == NULLFILE)
  23.   {
  24.     free_p(bp);
  25.     return;
  26.   }
  27.   while (bp != NULLBUF)
  28.   {
  29.     while (bp->cnt-- != 0)
  30.     {
  31.       fputc(*bp->data, tn->session->record);
  32.       bp->data++;
  33.     }
  34.     bp = free_mbuf(bp);
  35.   }
  36.   fflush(tn->session->record);
  37. }
  38.  
  39. static void trf_tx(struct tcb *tcb, int16 cnt)
  40. {
  41.   return;
  42. }
  43.  
  44. static void trf_rcv_char(register struct tcb *tcb, int16 cnt)
  45. {
  46.   struct mbuf *bp;
  47.   struct telnet *tn;
  48.  
  49.   if (tn = (struct telnet *) tcb->user, tn == NULLTN)
  50.   {
  51.     /* Unknown connection; ignore it */
  52.     return;
  53.   }
  54.   if (recv_tcp(tcb, &bp, cnt) > 0)
  55.     trf_rx(tn, bp);
  56. }
  57.  
  58. static void free_telnet(struct telnet *tn)
  59. {
  60.   if (tn->session != NULLSESSION)
  61.     freesession(tn->session);
  62.   if (tn != NULLTN)
  63.     free((char *) tn);
  64. }
  65.  
  66. static void trf_state(register struct tcb *tcb, char old_state, char new_state)
  67. {
  68.   char buffer[1024];
  69.   struct mbuf *bp;
  70.   struct telnet *tn;
  71.   wimp_msgstr msg;
  72.  
  73.   old_state = old_state;
  74.  
  75.   /* Can't add a check for unknown connection here, it would loop
  76.        on a close upcall! We're just careful later on. */
  77.   tn = (struct telnet *) tcb->user;
  78.  
  79.   switch(new_state)
  80.   {
  81.   case ESTABLISHED:
  82.     sprintf(buffer, "%s\n", tn->session->ufile);
  83.     bp = qdata(buffer, strlen(buffer));
  84.     send_tcp(tn->tcb, bp);
  85.     free(tn->session->ufile);
  86.     tn->session->ufile  = strdup(tmpnam(NULL));
  87. /*    cwprintf(NULL, "%s", tn->session->ufile); */
  88.     tn->session->record = fopen(tn->session->ufile, "wb");
  89.     break;
  90.  
  91.   case CLOSE_WAIT:
  92.     close_tcp(tcb);
  93.     break;
  94.  
  95.   case CLOSED:    /* court adjourned */
  96.     msg.hdr.size     = 256;
  97.     msg.hdr.your_ref = tn->session->keypad;
  98.     msg.hdr.action   = 0x823F1;
  99.     strcpy(msg.data.chars, tn->session->ufile);
  100.     wimp_sendmessage(wimp_ESEND, &msg, 0);
  101. /*    os_swi0(0x107); */
  102.     del_tcp(tcb);
  103.     if (tn != NULLTN)
  104.       free_telnet(tn);
  105.     break;
  106.  
  107.   default:
  108.     break;
  109.   }
  110. }
  111.  
  112. int dotransfer(int argc, char **argv)
  113. {
  114.   struct session *s;
  115.   struct telnet *tn;
  116.   struct tcb *tcb;
  117.   struct socket lsocket, fsocket;
  118.   wimp_eventstr last_ev = *wimpt_last_event();
  119.  
  120.   lsocket.address = ip_addr;
  121.   lsocket.port    = lport++;
  122.   if (fsocket.address = resolve(argv[1]), fsocket.address == 0)
  123.   {
  124.     cwprintf(NULL, badhost,argv[1]);
  125.     return(1);
  126.   }
  127.   if (argc < 4)
  128.     return(TRUE);
  129.  
  130.   fsocket.port = atoi(argv[2]);
  131.  
  132.   /* Allocate a session descriptor */
  133.   if (s = newsession(), s == NULLSESSION)
  134.   {
  135.     cwprintf(NULL, "Too many sessions\r\n");
  136.     return(1);
  137.   }
  138.   if (s->name = (char *) malloc((unsigned) strlen(argv[1]) + 1), s->name != NULLCHAR)
  139.     strcpy(s->name, argv[1]);
  140.  
  141.   s->type  = TELNET;
  142.   s->parse = NULL;
  143.  
  144.   /* Create and initialize a Telnet protocol descriptor */
  145.   if (tn = (struct telnet *) calloc(1, sizeof(struct telnet)), tn == NULLTN)
  146.   {
  147.     cwprintf(NULL, nospace);
  148.     s->type = FREE;
  149.     return(1);
  150.   }
  151.   current = s;
  152.  
  153.   tn->session  = s;        /* Upward pointer */
  154.   tn->state    = TS_DATA;
  155.   s->cb.telnet = tn;       /* Downward pointer */
  156.   s->window    = NULL;
  157.   s->ufile     = strdup(argv[3]);
  158.   s->keypad    = last_ev.data.msg.hdr.my_ref;
  159.   tn->session->echo = TRUE;
  160.  
  161.   tcb = open_tcp(&lsocket, &fsocket, TCP_ACTIVE, 0,
  162.   (void (*)()) trf_rcv_char, (void(*)()) trf_tx, (void(*)()) trf_state, 0, (char *)tn);
  163.  
  164.   tn->tcb = tcb;  /* Downward pointer */
  165.   go(s);
  166.   return 0;
  167. }
  168.