Annotation of 43BSDTahoe/usr.bin/uucp/tio.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)tio.c      4.9     (Berkeley) 5/4/88";
                      3: #endif
                      4: 
                      5: #include <signal.h>
                      6: #include "uucp.h"
                      7: #include <setjmp.h>
                      8: #include <sys/stat.h>
                      9: #include <machine/machparam.h>
                     10: 
                     11: extern int pkfail();
                     12: #define TPACKSIZE      512
                     13: #define TBUFSIZE       1024
                     14: #define min(a,b)       (((a)<(b))?(a):(b))
                     15: 
                     16: /*
                     17:  *     htonl is a function that converts a long from host
                     18:  *             order to network order
                     19:  *     ntohl is a function that converts a long from network
                     20:  *             order to host order
                     21:  *
                     22:  *     network order is                0 1 2 3 (bytes in a long)
                     23:  *     host order on a vax is          3 2 1 0
                     24:  *     host order on a pdp11 is        1 0 3 2
                     25:  *     host order on a 68000 is        0 1 2 3
                     26:  *     most other machines are         0 1 2 3
                     27:  */
                     28: 
                     29: struct tbuf {
                     30:        long t_nbytes;
                     31:        char t_data[TBUFSIZE];
                     32: };
                     33: 
                     34: extern jmp_buf Failbuf;
                     35: 
                     36: extern long Bytes_Sent, Bytes_Received;
                     37: 
                     38: twrmsg(type, str, fn)
                     39: char type;
                     40: register char *str;
                     41: {
                     42:        char bufr[TBUFSIZE];
                     43:        register char *s;
                     44:        int len, i;
                     45: 
                     46:        if(setjmp(Failbuf))
                     47:                return FAIL;
                     48:        signal(SIGALRM, pkfail);
                     49:        alarm(MAXMSGTIME*5);
                     50:        bufr[0] = type;
                     51:        s = &bufr[1];
                     52:        while (*str)
                     53:                *s++ = *str++;
                     54:        *s = '\0';
                     55:        if (*(--s) == '\n')
                     56:                *s = '\0';
                     57:        len = strlen(bufr) + 1;
                     58:        if ((i = len % TPACKSIZE)) {
                     59:                len = len + TPACKSIZE - i;
                     60:                bufr[len - 1] = '\0';
                     61:        }
                     62:        twrblk(bufr, len, fn);
                     63:        alarm(0);
                     64:        return SUCCESS;
                     65: }
                     66: 
                     67: trdmsg(str, fn)
                     68: register char *str;
                     69: {
                     70:        int len, cnt = 0;
                     71: 
                     72:        if(setjmp(Failbuf))
                     73:                return FAIL;
                     74:        signal(SIGALRM, pkfail);
                     75:        alarm(MAXMSGTIME*5);
                     76:        for (;;) {
                     77:                len = read(fn, str, TPACKSIZE);
                     78:                if (len <= 0) {
                     79:                        alarm(0);
                     80:                        return FAIL;
                     81:                }
                     82:                str += len;
                     83:                cnt += len;
                     84:                if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0)
                     85:                        break;
                     86:        }
                     87:        alarm(0);
                     88:        return SUCCESS;
                     89: }
                     90: 
                     91: twrdata(fp1, fn)
                     92: FILE *fp1;
                     93: {
                     94:        struct tbuf bufr;
                     95:        register int len;
                     96:        int ret, mil;
                     97:        struct timeb t1, t2;
                     98:        long bytes;
                     99:        char text[TBUFSIZE];
                    100:        float ft;
                    101: 
                    102:        if(setjmp(Failbuf))
                    103:                return FAIL;
                    104:        signal(SIGALRM, pkfail);
                    105:        bytes = 0L;
                    106: #ifdef USG
                    107:        time(&t1.time);
                    108:        t1.millitm = 0;
                    109: #else !USG
                    110:        ftime(&t1);
                    111: #endif !USG
                    112:        while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
                    113:                bytes += len;
                    114: #if defined(vax) || defined(pdp11) || defined(ns32000)
                    115:                bufr.t_nbytes = htonl((long)len);
                    116: #else !vax and !pdp11 and !ns32000
                    117:                bufr.t_nbytes = len;
                    118: #endif !vax and !pdp11 and !ns32000
                    119:                DEBUG(8,"twrdata sending %d bytes\n",len);
                    120:                len += sizeof(long);
                    121:                alarm(MAXMSGTIME*5);
                    122:                ret = twrblk((char *)&bufr, len, fn);
                    123:                alarm(0);
                    124:                if (ret != len)
                    125:                        return FAIL;
                    126:                if (len != TBUFSIZE+sizeof(long))
                    127:                        break;
                    128:        }
                    129:        bufr.t_nbytes = 0;
                    130:        len = sizeof(long);
                    131:        alarm(MAXMSGTIME*5);
                    132:        ret = twrblk((char *)&bufr, len, fn);
                    133:        alarm(0);
                    134:        if (ret != len)
                    135:                return FAIL;
                    136: #ifdef USG
                    137:        time(&t2.time);
                    138:        t2.millitm = 0;
                    139: #else !USG
                    140:        ftime(&t2);
                    141: #endif !USG
                    142:        Now = t2;
                    143:        t2.time -= t1.time;
                    144:        mil = t2.millitm - t1.millitm;
                    145:        if (mil < 0) {
                    146:                --t2.time;
                    147:                mil += 1000;
                    148:        }
                    149:        ft = (float)t2.time + (float)mil/1000.;
                    150:        sprintf(text, "sent data %ld bytes %.2f secs %ld bps",
                    151:                bytes, ft, (long)((float)bytes*8./ft));
                    152:        sysacct(bytes, t2.time);
                    153:        Bytes_Sent += bytes;
                    154:        DEBUG(1, "%s\n", text);
                    155:        log_xferstats(text);
                    156:        return SUCCESS;
                    157: }
                    158: 
                    159: trddata(fn, fp2)
                    160: FILE *fp2;
                    161: {
                    162:        register int len, nread;
                    163:        char bufr[TBUFSIZE];
                    164:        struct timeb t1, t2;
                    165:        int mil;
                    166:        long bytes, Nbytes;
                    167:        float ft;
                    168: 
                    169:        if(setjmp(Failbuf))
                    170:                return FAIL;
                    171:        signal(SIGALRM, pkfail);
                    172: #ifdef USG
                    173:        time(&t1.time);
                    174:        t1.millitm = 0;
                    175: #else !USG
                    176:        ftime(&t1);
                    177: #endif !USG
                    178:        bytes = 0L;
                    179:        for (;;) {
                    180:                alarm(MAXMSGTIME*5);
                    181:                len = trdblk((char *)&Nbytes,sizeof Nbytes,fn);
                    182:                alarm(0);
                    183:                if (len != sizeof Nbytes)
                    184:                        return FAIL;
                    185: #if defined(vax) || defined(pdp11) || defined(ns32000)
                    186:                Nbytes = ntohl(Nbytes);
                    187: #endif vax or pdp11 or ns32000
                    188:                DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
                    189:                nread = Nbytes;
                    190:                if (nread == 0)
                    191:                        break;
                    192:                alarm(MAXMSGTIME*5);
                    193:                len = trdblk(bufr, nread, fn);
                    194:                alarm(0);
                    195:                if (len < 0) {
                    196:                        return FAIL;
                    197:                }
                    198:                bytes += len;
                    199:                DEBUG(11,"trddata got %ld\n",bytes);
                    200:                if (write(fileno(fp2), bufr, len) != len) {
                    201:                        alarm(0);
                    202:                        return FAIL;
                    203:                }
                    204:        }
                    205: #ifdef USG
                    206:        time(&t2.time);
                    207:        t2.millitm = 0;
                    208: #else !USG
                    209:        ftime(&t2);
                    210: #endif !USG
                    211:        Now = t2;
                    212:        t2.time -= t1.time;
                    213:        mil = t2.millitm - t1.millitm;
                    214:        if (mil < 0) {
                    215:                --t2.time;
                    216:                mil += 1000;
                    217:        }
                    218:        ft = (float)t2.time + (float)mil/1000.;
                    219:        sprintf(bufr, "received data %ld bytes %.2f secs %ld bps",
                    220:                bytes, ft, (long)((float)bytes*8./ft));
                    221:        sysacct(bytes, t2.time);
                    222:        Bytes_Received += bytes;
                    223:        DEBUG(1, "%s\n", bufr);
                    224:        log_xferstats(bufr);
                    225:        return SUCCESS;
                    226: }
                    227: 
                    228: #if !defined(BSD4_2) && !defined(USG)
                    229: #define        TC      1024
                    230: static int tc = TC;
                    231: #endif !BSD4_2 && !USG
                    232: 
                    233: trdblk(blk, len,  fn)
                    234: register int len;
                    235: char *blk;
                    236: {
                    237:        register int i, ret;
                    238: 
                    239: #if !defined(BSD4_2) && !defined(USG)
                    240:        /* call ultouch occasionally */
                    241:        if (--tc < 0) {
                    242:                tc = TC;
                    243:                ultouch();
                    244:        }
                    245: #endif !BSD4_2 && !USG
                    246:        for (i = 0; i < len; i += ret) {
                    247:                ret = read(fn, blk, len - i);
                    248:                if (ret < 0)
                    249:                        return FAIL;
                    250:                blk += ret;
                    251:                if (ret == 0)
                    252:                        return i;
                    253:        }
                    254:        return i;
                    255: }
                    256: 
                    257: 
                    258: twrblk(blk, len, fn)
                    259: register char *blk;
                    260: {
                    261: #if !defined(BSD4_2) && !defined(USG)
                    262:        /* call ultouch occasionally */
                    263:        if (--tc < 0) {
                    264:                tc = TC;
                    265:                ultouch();
                    266:        }
                    267: #endif !BSD4_2 && !USG
                    268:        return write(fn, blk, len);
                    269: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.