home *** CD-ROM | disk | FTP | other *** search
- >----------CUT HERE----------transfer.c----------
- >#include <stdio.h>
- >#include <stdlib.h>
- >#include <string.h>
- >#include "global.h"
- >#include "mbuf.h"
- >#include "domain.h"
- >#include "timer.h"
- >#include "icmp.h"
- >#include "netuser.h"
- >#include "tcp.h"
- >#include "telnet.h"
- >#include "session.h"
- >#include "misc.h"
- >#include "Terminal.h"
- >#include "wimpt.h"
- >
- >/* New KFQ */
- >#include "os.h"
- >/* end new KFQ */
- >
- >extern char nospace[];
- >extern char badhost[];
- >
- >static void trf_rx(register struct telnet *tn, struct mbuf *bp)
- >{
- > if (tn->session->record == NULLFILE)
- > {
- > free_p(bp);
- > return;
- > }
- > while (bp != NULLBUF)
- > {
- > while (bp->cnt-- != 0)
- > {
- > fputc(*bp->data, tn->session->record);
- > bp->data++;
- > }
- > bp = free_mbuf(bp);
- > }
- > fflush(tn->session->record);
- >}
- >
- >static void trf_tx(struct tcb *tcb, int16 cnt)
- >{
- > return;
- >}
- >
- >static void trf_rcv_char(register struct tcb *tcb, int16 cnt)
- >{
- > struct mbuf *bp;
- > struct telnet *tn;
- >
- > if (tn = (struct telnet *) tcb->user, tn == NULLTN)
- > {
- > /* Unknown connection; ignore it */
- > return;
- > }
- > if (recv_tcp(tcb, &bp, cnt) > 0)
- > trf_rx(tn, bp);
- >}
- >
- >static void free_telnet(struct telnet *tn)
- >{
- > if (tn->session != NULLSESSION)
- > freesession(tn->session);
- > if (tn != NULLTN)
- > free((char *) tn);
- >}
- >
- >static void trf_state(register struct tcb *tcb, char old_state, char new_state)
- >{
- > char buffer[1024];
- > struct mbuf *bp;
- > struct telnet *tn;
- > wimp_msgstr msg;
- > /* new KFQ */
- > char *filespace;
- > int fsize;
- > os_filestr cmdfle;
- > os_error *e;
- > /* end new KFQ */
- >
- > old_state = old_state;
- >
- > /* Can't add a check for unknown connection here, it would loop
- > on a close upcall! We're just careful later on. */
- > tn = (struct telnet *) tcb->user;
- >
- > switch(new_state)
- > {
- > case ESTABLISHED:
- > /* new KFQ */
- > cmdfle.action=23; /* Read catalogue information */
- > cmdfle.name=tn->session->ufile;
- > e=os_file(&cmdfle);
- > if (e==0) { /* Catalogue read successful */
- > /* Transfer file, verbatim */
- > if (cmdfle.action==1) { /* normal file */
- > fsize=cmdfle.start; /* file length */
- > if (filespace=(char *)malloc((size_t) fsize), filespace != NULL) {
- >/* cwprintf(NULL, "ftrf: file %s is %d bytes long\r\n",
- > tn->session->ufile, fsize); */
- > /* Load file into buffer */
- > cmdfle.action=16; /* load named file, no path */
- > cmdfle.loadaddr=(int) filespace; /* Load address */
- > cmdfle.execaddr=0; /* force load at loadaddr */
- > e=os_file(&cmdfle);
- > if (e==0) {
- > bp = qdata(filespace, fsize);
- > send_tcp(tn->tcb, bp);
- >/* cwprintf(NULL, "ftrf: file %s sent\r\n", tn->session->ufile); */
- > } else {
- > cwprintf(NULL, "trf: load of file %s failed\r\n", tn->session->ufile);
- > }
- > } else {
- > cwprintf(NULL, "trf: Unable to allocate %d bytes\r\n", fsize);
- > }
- > } else {
- > /* Second argument not a file - process as previously */
- > sprintf(buffer, "%s\n", tn->session->ufile);
- > bp = qdata(buffer, strlen(buffer));
- > send_tcp(tn->tcb, bp);
- > }
- > } else {
- > cwprintf(NULL, "trf: osfile 23 for %s failed miserably\r\n",
- > tn->session->ufile);
- > }
- > /* end new KFQ */
- > /* Old code KFQ
- > sprintf(buffer, "%s\n", tn->session->ufile);
- > bp = qdata(buffer, strlen(buffer));
- > send_tcp(tn->tcb, bp);
- > */
- > free(tn->session->ufile);
- > tn->session->ufile = strdup(tmpnam(NULL));
- >/* cwprintf(NULL, "%s", tn->session->ufile); */
- > tn->session->record = fopen(tn->session->ufile, "wb");
- > break;
- >
- > case CLOSE_WAIT:
- > close_tcp(tcb);
- > break;
- >
- > case CLOSED: /* court adjourned */
- > msg.hdr.size = 256;
- > msg.hdr.your_ref = tn->session->keypad;
- > msg.hdr.action = 0x823F1;
- > strcpy(msg.data.chars, tn->session->ufile);
- > wimp_sendmessage(wimp_ESEND, &msg, 0);
- >/* os_swi0(0x107); */
- > del_tcp(tcb);
- > if (tn != NULLTN)
- > free_telnet(tn);
- > break;
- >
- > default:
- > break;
- > }
- >}
- >
- >int dotransfer(int argc, char **argv)
- >{
- > struct session *s;
- > struct telnet *tn;
- > struct tcb *tcb;
- > struct socket lsocket, fsocket;
- > wimp_eventstr last_ev = *wimpt_last_event();
- >
- > lsocket.address = ip_addr;
- > lsocket.port = lport++;
- > if (fsocket.address = resolve(argv[1]), fsocket.address == 0)
- > {
- > cwprintf(NULL, badhost,argv[1]);
- > return(1);
- > }
- > if (argc < 4)
- > return(TRUE);
- >
- > fsocket.port = atoi(argv[2]);
- >
- > /* Allocate a session descriptor */
- > if (s = newsession(), s == NULLSESSION)
- > {
- > cwprintf(NULL, "Too many sessions\r\n");
- > return(1);
- > }
- > if (s->name = (char *) malloc((unsigned) strlen(argv[1]) + 1), s->name != NULLCHAR)
- > strcpy(s->name, argv[1]);
- >
- > s->type = TELNET;
- > s->parse = NULL;
- >
- > /* Create and initialize a Telnet protocol descriptor */
- > if (tn = (struct telnet *) calloc(1, sizeof(struct telnet)), tn == NULLTN)
- > {
- > cwprintf(NULL, nospace);
- > s->type = FREE;
- > return(1);
- > }
- > current = s;
- >
- > tn->session = s; /* Upward pointer */
- > tn->state = TS_DATA;
- > s->cb.telnet = tn; /* Downward pointer */
- > s->window = NULL;
- > s->ufile = strdup(argv[3]);
- > s->keypad = last_ev.data.msg.hdr.my_ref;
- > tn->session->echo = TRUE;
- >
- > tcb = open_tcp(&lsocket, &fsocket, TCP_ACTIVE, 0,
- > (void (*)()) trf_rcv_char, (void(*)()) trf_tx, (void(*)()) trf_state, 0, (char *)tn);
- >
- > tn->tcb = tcb; /* Downward pointer */
- > go(s);
- > return 0;
- >}
- >----------CUT HERE----------transfer.c----------
-