home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / internet / tcpip / src205 / TCPIP_Src / MiscCli / Selection < prev   
Encoding:
Text File  |  1995-04-17  |  5.6 KB  |  219 lines

  1. >----------CUT HERE----------transfer.c----------
  2. >#include <stdio.h>
  3. >#include <stdlib.h>
  4. >#include <string.h>
  5. >#include "global.h"
  6. >#include "mbuf.h"
  7. >#include "domain.h"
  8. >#include "timer.h"
  9. >#include "icmp.h"
  10. >#include "netuser.h"
  11. >#include "tcp.h"
  12. >#include "telnet.h"
  13. >#include "session.h"
  14. >#include "misc.h"
  15. >#include "Terminal.h"
  16. >#include "wimpt.h"
  17. >
  18. >/* New KFQ */
  19. >#include "os.h"
  20. >/* end new KFQ */
  21. >
  22. >extern char nospace[];
  23. >extern char badhost[];
  24. >
  25. >static void trf_rx(register struct telnet *tn, struct mbuf *bp)
  26. >{
  27. >  if (tn->session->record == NULLFILE)
  28. >  {
  29. >    free_p(bp);
  30. >    return;
  31. >  }
  32. >  while (bp != NULLBUF)
  33. >  {
  34. >    while (bp->cnt-- != 0)
  35. >    {
  36. >      fputc(*bp->data, tn->session->record);
  37. >      bp->data++;
  38. >    }
  39. >    bp = free_mbuf(bp);
  40. >  }
  41. >  fflush(tn->session->record);
  42. >}
  43. >
  44. >static void trf_tx(struct tcb *tcb, int16 cnt)
  45. >{
  46. >  return;
  47. >}
  48. >
  49. >static void trf_rcv_char(register struct tcb *tcb, int16 cnt)
  50. >{
  51. >  struct mbuf *bp;
  52. >  struct telnet *tn;
  53. >
  54. >  if (tn = (struct telnet *) tcb->user, tn == NULLTN)
  55. >  {
  56. >    /* Unknown connection; ignore it */
  57. >    return;
  58. >  }
  59. >  if (recv_tcp(tcb, &bp, cnt) > 0)
  60. >    trf_rx(tn, bp);
  61. >}
  62. >
  63. >static void free_telnet(struct telnet *tn)
  64. >{
  65. >  if (tn->session != NULLSESSION)
  66. >    freesession(tn->session);
  67. >  if (tn != NULLTN)
  68. >    free((char *) tn);
  69. >}
  70. >
  71. >static void trf_state(register struct tcb *tcb, char old_state, char new_state)
  72. >{
  73. >  char buffer[1024];
  74. >  struct mbuf *bp;
  75. >  struct telnet *tn;
  76. >  wimp_msgstr msg;
  77. >  /* new KFQ */
  78. >  char *filespace;
  79. >  int fsize;
  80. >  os_filestr cmdfle;
  81. >  os_error *e;
  82. >  /* end new KFQ */
  83. >
  84. >  old_state = old_state;
  85. >
  86. >  /* Can't add a check for unknown connection here, it would loop
  87. >       on a close upcall! We're just careful later on. */
  88. >  tn = (struct telnet *) tcb->user;
  89. >
  90. >  switch(new_state)
  91. >  {
  92. >  case ESTABLISHED:
  93. >    /* new KFQ */
  94. >    cmdfle.action=23; /* Read catalogue information */
  95. >    cmdfle.name=tn->session->ufile;
  96. >    e=os_file(&cmdfle);
  97. >    if (e==0) { /* Catalogue read successful */
  98. >      /* Transfer file, verbatim */
  99. >      if (cmdfle.action==1) { /* normal file */
  100. >        fsize=cmdfle.start; /* file length */
  101. >        if (filespace=(char *)malloc((size_t) fsize), filespace != NULL) {
  102. >/*           cwprintf(NULL, "ftrf: file %s is %d bytes long\r\n",
  103. >                   tn->session->ufile, fsize); */
  104. >          /* Load file into buffer */
  105. >          cmdfle.action=16; /* load named file, no path */
  106. >          cmdfle.loadaddr=(int) filespace; /* Load address */
  107. >          cmdfle.execaddr=0; /* force load at loadaddr */
  108. >          e=os_file(&cmdfle);
  109. >          if (e==0) {
  110. >            bp = qdata(filespace, fsize);
  111. >            send_tcp(tn->tcb, bp);
  112. >/*             cwprintf(NULL, "ftrf: file %s sent\r\n", tn->session->ufile); */
  113. >          } else {
  114. >            cwprintf(NULL, "trf: load of file %s failed\r\n", tn->session->ufile);
  115. >          }
  116. >        } else {
  117. >          cwprintf(NULL, "trf: Unable to allocate %d bytes\r\n", fsize);
  118. >        }
  119. >      } else {
  120. >        /* Second argument not a file - process as previously */
  121. >        sprintf(buffer, "%s\n", tn->session->ufile);
  122. >        bp = qdata(buffer, strlen(buffer));
  123. >        send_tcp(tn->tcb, bp);
  124. >      }
  125. >    } else {
  126. >      cwprintf(NULL, "trf: osfile 23 for %s failed miserably\r\n",
  127. >          tn->session->ufile);
  128. >    }
  129. >    /* end new KFQ */
  130. >    /* Old code KFQ
  131. >    sprintf(buffer, "%s\n", tn->session->ufile);
  132. >    bp = qdata(buffer, strlen(buffer));
  133. >    send_tcp(tn->tcb, bp);
  134. >    */
  135. >    free(tn->session->ufile);
  136. >    tn->session->ufile  = strdup(tmpnam(NULL));
  137. >/*    cwprintf(NULL, "%s", tn->session->ufile); */
  138. >    tn->session->record = fopen(tn->session->ufile, "wb");
  139. >    break;
  140. >
  141. >  case CLOSE_WAIT:
  142. >    close_tcp(tcb);
  143. >    break;
  144. >
  145. >  case CLOSED:    /* court adjourned */
  146. >    msg.hdr.size     = 256;
  147. >    msg.hdr.your_ref = tn->session->keypad;
  148. >    msg.hdr.action   = 0x823F1;
  149. >    strcpy(msg.data.chars, tn->session->ufile);
  150. >    wimp_sendmessage(wimp_ESEND, &msg, 0);
  151. >/*    os_swi0(0x107); */
  152. >    del_tcp(tcb);
  153. >    if (tn != NULLTN)
  154. >      free_telnet(tn);
  155. >    break;
  156. >
  157. >  default:
  158. >    break;
  159. >  }
  160. >}
  161. >
  162. >int dotransfer(int argc, char **argv)
  163. >{
  164. >  struct session *s;
  165. >  struct telnet *tn;
  166. >  struct tcb *tcb;
  167. >  struct socket lsocket, fsocket;
  168. >  wimp_eventstr last_ev = *wimpt_last_event();
  169. >
  170. >  lsocket.address = ip_addr;
  171. >  lsocket.port    = lport++;
  172. >  if (fsocket.address = resolve(argv[1]), fsocket.address == 0)
  173. >  {
  174. >    cwprintf(NULL, badhost,argv[1]);
  175. >    return(1);
  176. >  }
  177. >  if (argc < 4)
  178. >    return(TRUE);
  179. >
  180. >  fsocket.port = atoi(argv[2]);
  181. >
  182. >  /* Allocate a session descriptor */
  183. >  if (s = newsession(), s == NULLSESSION)
  184. >  {
  185. >    cwprintf(NULL, "Too many sessions\r\n");
  186. >    return(1);
  187. >  }
  188. >  if (s->name = (char *) malloc((unsigned) strlen(argv[1]) + 1), s->name != NULLCHAR)
  189. >    strcpy(s->name, argv[1]);
  190. >
  191. >  s->type  = TELNET;
  192. >  s->parse = NULL;
  193. >
  194. >  /* Create and initialize a Telnet protocol descriptor */
  195. >  if (tn = (struct telnet *) calloc(1, sizeof(struct telnet)), tn == NULLTN)
  196. >  {
  197. >    cwprintf(NULL, nospace);
  198. >    s->type = FREE;
  199. >    return(1);
  200. >  }
  201. >  current = s;
  202. >
  203. >  tn->session  = s;        /* Upward pointer */
  204. >  tn->state    = TS_DATA;
  205. >  s->cb.telnet = tn;       /* Downward pointer */
  206. >  s->window    = NULL;
  207. >  s->ufile     = strdup(argv[3]);
  208. >  s->keypad    = last_ev.data.msg.hdr.my_ref;
  209. >  tn->session->echo = TRUE;
  210. >
  211. >  tcb = open_tcp(&lsocket, &fsocket, TCP_ACTIVE, 0,
  212. >  (void (*)()) trf_rcv_char, (void(*)()) trf_tx, (void(*)()) trf_state, 0, (char *)tn);
  213. >
  214. >  tn->tcb = tcb;  /* Downward pointer */
  215. >  go(s);
  216. >  return 0;
  217. >}
  218. >----------CUT HERE----------transfer.c----------
  219.