head 1.5; access ; symbols ; locks ; comment @ * @; 1.5 date 89.02.03.18.38.15; author pkern; state Exp; branches ; next 1.4; 1.4 date 89.02.01.18.14.01; author pkern; state Exp; branches ; next 1.3; 1.3 date 89.01.31.14.30.51; author pkern; state Exp; branches ; next 1.2; 1.2 date 89.01.31.14.30.14; author pkern; state Exp; branches ; next 1.1; 1.1 date 89.01.31.13.37.53; author pkern; state Exp; branches ; next ; desc @@ 1.5 log @*** empty log message *** @ text @/* * text.c: * raw ascii text transfer functions (*very* kludgey) * * copyright (c) University of Toronto, 1988. */ static char rcsid[] = "$Header: text.c,v 1.4 89/02/01 18:14:01 pkern Exp $"; #include #include static FILE *xfp=NULL; static int xfd=0; unsigned char txtxfr=0, khits=0; #define LSZ 128 static int ln = 0; static char *lp, lbuf[LSZ]; static char prog[16], *opt, fnam[16]; static int oparms; static int sflag, rflag, fdone, bflag, tflag, errflg; /* * text -- text transfer "interface" called from setups() * sets local flags needed by txtset(). * checks argument options and the filename. */ text(ac, av) int ac; char *av[]; { char *p; strcpy(prog, av[0]); sflag = rflag = fdone = bflag = tflag = errflg = 0; if (ac < 2 || ac > 3) goto usage; opt = av[1]; for (p = opt; *p; p++) switch (*p) { case '$': fdone++; break; case 's': sflag++; break; case 'r': rflag++; break; case 't': tflag++; break; case 'b': bflag++; break; default: errflg++; break; } if (errflg || (sflag+rflag) != 1 || (bflag+tflag+fdone) != 1) { usage: cprintf("\ Usage: %s {st|sb|s$|rt|rb|r$} filename\r\n", prog); cputs("\ \tst - send text\r\n\ \tsb - send binary\r\n\ \ts$ - terminate send (close file)\r\n\ \trt - receive text\r\n\ \trb - receive binary\r\n\ \tr$ - terminate receive\r\n"); return(-1); } if (fdone) { /* shutdown rtxt() */ /* stxt() shuts down on its own */ if (xfd > 0) { if (rflag && ln > 0) write(xfd, lbuf, ln); close(xfd); } txtxfr = xfd = 0; return(0); } if (sflag) oparms = O_RDONLY | ((bflag) ? O_BINARY : 0); else oparms = O_WRONLY|O_BINARY|O_CREAT; strcpy(fnam, av[2]); if (xfd > 0) close(xfd); if ((xfd = open(fnam, oparms, 0664)) < 0) { perror(fnam); txtxfr = xfd = 0; return(-1); } close(xfd); /* only wanted to test fnam */ cprintf("\r\n%s transfer of %s will begin on exit from setups.\r\n", (tflag) ? "Ascii text" : "Raw data", fnam); txtxfr++; return(0); } extern char rxoff; extern int (*recv)(), (*o_recv)(); extern int (*keyg)(), (*xmit)(); extern int (*keyhit)(), (*o_keyhit)(); /* prepare files and routines for text transfer */ txtset() { int o_fmode; int stxt(), rtxt(), txtchk(); extern int recv_byt(); extern unsigned char local, transparent; lp = lbuf; ln = 0; if (sflag) { o_fmode = _fmode; if (oparms & O_BINARY) _fmode |= O_BINARY; xfp = fopen(fnam, "r"); _fmode = o_fmode; if (xfp == NULL) { txtxfr = 0; return; } if (keyhit()) { /* user hit a key! */ txtxfr = 0; fclose(xfp); devset(); return; } keyg = stxt; keyhit = txtchk; khits = 2; } else if (rflag) { recv = rtxt; xfd = open(fnam, oparms, 0664); if (bflag && !(local || transparent)) o_recv = recv_byt; /* was recv_chr */ } /* txtxfr = 0; */ } /* check for more text */ txtchk() { int c; c = fgetc(xfp); if (o_keyhit() || c == EOF) { /* shutdown */ fclose(xfp); txtxfr = 0; devset(); /* reset {o_}keyhit() */ return(0); } ungetc(c, xfp); /* stxt() will get it later */ return(1); } /* send text */ stxt() { int c; if (rxoff < 0) /* reset our last rxoff setting */ rxoff = 0; if (!rxoff && !--khits) { /* ok, take a breather */ /* gives rcvr side a chance to * catch incoming XOFF request. */ khits = 2; rxoff = -1; } if (rxoff) /* remote XOFF? ok, take a break */ return(0); c = fgetc(xfp); if (tflag && c == '\n') /* text mode: LF -> CR */ c = '\r'; return(c); } /* receive text */ rtxt() { int c; if ((c = o_recv()) < 0) return(c); lbuf[ln] = c; ln++; if (ln >= LSZ) { write(xfd, lbuf, ln); ln = 0; } return(c); } @ 1.4 log @send-shutdown moved from stxt() to txtchk() stat(2)-related stuff deleted. @ text @d3 1 a3 1 * raw ascii text transfer functions d7 1 a7 1 static char rcsid[] = "$Header: text.c,v 1.3 89/01/31 14:30:51 pkern Exp $"; a18 5 #ifdef debug static int dfd; static char *dp, dbuf[LSZ]; #endif @ 1.3 log @*** empty log message *** @ text @d7 1 a7 1 static char rcsid[] = "$Header: text.c,v 1.2 89/01/31 14:30:14 pkern Exp $"; a10 1 #include a13 1 static int xfsiz=0; a111 1 struct stat st; a135 2 stat(fnam, &st); xfsiz = st.st_size; d148 1 a148 1 /* check amount left to send */ d151 12 a162 1 return(xfsiz); d168 1 a168 1 int n; d182 5 a186 12 if (o_keyhit() || (n = fgetc(xfp)) == EOF) { fclose(xfp); txtxfr = 0; devset(); /* reset (o_)keyhit() */ return(0); } if (tflag && n == '\n') /* text mode: LF -> CR */ n = '\r'; xfsiz--; /* xfsiz will be off in O_TEXT mode because * in that mode CRs are skipped over since * TC assumes they're followed by LFs */ return(n); d192 1 a192 2 int n; char c; d194 3 a196 3 if ((n = o_recv()) < 0) return(n); lbuf[ln] = n; ln++; d201 1 a201 1 return(n); @ 1.2 log @*** empty log message *** @ text @d7 1 a7 1 static char rcsid[] = "$Header$"; d11 1 d15 1 d75 2 a76 1 if (fdone) { /* shutdown rtxt() or stxt() */ a104 1 extern unsigned char keyhit; d108 1 d114 2 a115 2 int stxt(); int rtxt(); d131 1 a131 1 if (keyhit) { d138 3 a140 1 keyhit = 1; d153 6 d164 1 a164 1 if (rxoff < 0) d167 2 d176 1 a176 1 if (keyhit > 1 || (n = fgetc(xfp)) == EOF) { d179 1 a179 2 keyhit--; devset(); d182 1 a182 1 if (tflag && n == '\n') d184 3 @ 1.1 log @Initial revision @ text @d7 1 a7 1 static char *ID = "text.c Oct/88 Univ. of Toronto"; @