Ultrix-3.1/src/cmd/uucp/gio.c
/**********************************************************************
* Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. *
* All Rights Reserved. *
* Reference "/usr/src/COPYRIGHT" for applicable restrictions. *
**********************************************************************/
static char Sccsid[] = "@(#)gio.c 3.0 4/22/86";
/***************************
* front end routines for the "g" packet protocol routines
*/
#define USER 1
#include "pk.p"
#include <sys/types.h>
#include "pk.h"
#include <setjmp.h>
#include "uucp.h"
extern time_t time();
jmp_buf Failbuf;
struct pack *Pk;
pkfail()
{
longjmp(Failbuf, 1);
}
/* initialize protocol data structures and synchronize
* source and destination sites.
*/
gturnon()
{
int ret;
struct pack *pkopen();
if (setjmp(Failbuf))
return(FAIL);
if (Pkdrvon) {
/* Pkdrvon can be set to 1 if the packet driver is not needed */
ret = pkon(Ofn, PACKSIZE);
DEBUG(4, "pkon - %d ", ret);
DEBUG(4, "Ofn - %d\n", Ofn);
if (ret <= 0)
return(FAIL);
}
else {
if (Debug > 4)
pkdebug = 1;
Pk = pkopen(Ifn, Ofn);
if ((int) Pk == NULL)
return(FAIL);
}
return(0);
}
/* Free any allocated space, inform destination that
* circuit is closing down.
*/
gturnoff()
{
if(setjmp(Failbuf))
return(FAIL);
if (Pkdrvon)
pkoff(Ofn);
else
pkclose(Pk);
return(0);
}
/* transmit the string that str points to */
gwrmsg(type, str, fn)
char type, *str;
{
char bufr[BUFSIZ], *s;
int len, i;
if(setjmp(Failbuf))
return(FAIL);
bufr[0] = type;
s = &bufr[1];
while (*str)
*s++ = *str++;
*s = '\0';
if (*(--s) == '\n')
*s = '\0';
len = strlen(bufr) + 1;
if ((i = len % PACKSIZE)) {
len = len + PACKSIZE - i;
bufr[len - 1] = '\0';
}
gwrblk(bufr, len, fn);
return(0);
}
/* read in a message and place in string pointed to by str */
grdmsg(str, fn)
char *str;
{
unsigned len;
if(setjmp(Failbuf))
return(FAIL);
for (;;) {
if (Pkdrvon)
len = read(fn, str, PACKSIZE);
else
len = pkread(Pk, str, PACKSIZE);
if (len == 0)
continue;
str += len;
if (*(str - 1) == '\0')
break;
}
return(0);
}
/* transmit data in the file that fp1 points to */
gwrdata(fp1, fn)
FILE *fp1;
{
char bufr[BUFSIZ];
int len;
int ret;
time_t t1, t2;
long bytes;
char text[BUFSIZ];
if(setjmp(Failbuf))
return(FAIL);
bytes = 0L;
Totalrxmts = Totalpackets = 0;
time(&t1);
while ((len = fread(bufr, sizeof (char), BUFSIZ, fp1)) > 0) {
int i = 0;
bytes += len;
ret = gwrblk(bufr, len, fn);
if (ret != len) {
return(FAIL);
}
if (len != BUFSIZ) /* less than BUFSIZ implies end */
break;
}
ret = gwrblk(bufr, 0, fn);
time(&t2);
sprintf(text, "sent %ld b %ld secs, Pk: %d, Rxmt: %d",
bytes, t2 - t1, Totalpackets, Totalrxmts);
DEBUG(1, "%s\n", text);
syslog(text);
sysacct(bytes, t2 - t1);
return(0);
}
/* read in data and place in the file pointed to by fp2 */
grddata(fn, fp2)
FILE *fp2;
{
int len;
char bufr[BUFSIZ];
time_t t1, t2;
long bytes;
char text[BUFSIZ];
if(setjmp(Failbuf))
return(FAIL);
bytes = 0L;
time(&t1);
for (;;) {
len = grdblk(bufr, BUFSIZ, fn);
if (len < 0) {
return(FAIL);
}
bytes += len;
/* ittvax!swatt: check return value of fwrite */
if (fwrite(bufr, sizeof (char), len, fp2) != len)
return(FAIL);
if (len < BUFSIZ)
break;
}
time(&t2);
sprintf(text, "received %ld b %ld secs", bytes, t2 - t1);
DEBUG(1, "%s\n", text);
syslog(text);
sysacct(bytes, t2 - t1);
return(0);
}
/* call ultouch every TC calls to either grdblk or gwrblk -- rti!trt */
#define TC 20
static int tc = TC;
grdblk(blk, len, fn)
char *blk;
{
int i, ret;
/* call ultouch occasionally -- rti!trt */
/* so LCK.files will not be removed precipitously */
if (--tc < 0) {
tc = TC;
ultouch();
}
for (i = 0; i < len; i += ret) {
if (Pkdrvon)
ret = read(fn, blk, len - i);
else
ret = pkread(Pk, blk, len - i);
if (ret < 0)
return(FAIL);
blk += ret;
if (ret == 0)
return(i);
}
return(i);
}
gwrblk(blk, len, fn)
char *blk;
{
int ret;
/* call ultouch occasionally -- rti!trt */
if (--tc < 0) {
tc = TC;
ultouch();
}
if (Pkdrvon)
ret = write(fn, blk, len);
else
ret = pkwrite(Pk, blk, len);
return(ret);
}