home *** CD-ROM | disk | FTP | other *** search
- #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"
-
- 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;
-
- 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:
- 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;
- }
-