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

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

unix.superglobalmegacorp.com

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