Annotation of researchv8dc/cmd/uucp/eio.c, revision 1.1.1.1

1.1       root        1: /*     /sccs/src/cmd/uucp/s.eio.c
                      2:        eio.c   1.4     8/30/84 17:37:17
                      3: */
                      4: 
                      5: #include "uucp.h"
                      6: VERSION(@(#)eio.c      1.4);
                      7: 
                      8: #ifdef ATTSV
                      9: #define     MIN(a,b) (((a)<(b))?(a):(b))
                     10: #endif
                     11: 
                     12: static jmp_buf Failbuf;
                     13: 
                     14: /*
                     15:  * error-free channel protocol
                     16:  */
                     17: static
                     18: ealarm() {
                     19:        longjmp(Failbuf, 1);
                     20: }
                     21: static int (*esig)();
                     22: 
                     23: /*
                     24:  * turn on protocol timer
                     25:  */
                     26: eturnon()
                     27: {
                     28:        esig=signal(SIGALRM, ealarm);
                     29:        return(0);
                     30: }
                     31: 
                     32: eturnoff()
                     33: {
                     34:        signal(SIGALRM, esig);
                     35:        return(0);
                     36: }
                     37: 
                     38: /*
                     39:  * write message across link
                     40:  *     type    -> message type
                     41:  *     str     -> message body (ascii string)
                     42:  *     fn      -> link file descriptor
                     43:  * return
                     44:  *     FAIL    -> write failed
                     45:  *     0       -> write succeeded
                     46:  */
                     47: ewrmsg(type, str, fn)
                     48: register char *str;
                     49: int fn;
                     50: char type;
                     51: {
                     52:        register char *s;
                     53:        char bufr[BUFSIZ];
                     54:        int     s1, s2;
                     55: 
                     56:        bufr[0] = type;
                     57:        s = &bufr[1];
                     58:        while (*str)
                     59:                *s++ = *str++;
                     60:        *s = '\0';
                     61:        if (*(--s) == '\n')
                     62:                *s = '\0';
                     63:        s1 = strlen(bufr) + 1;
                     64:        if (setjmp(Failbuf)) {
                     65:                DEBUG(7, "ewrmsg write failed\n", "");
                     66:                return(FAIL);
                     67:        }
                     68:        alarm(60);
                     69:        s2 = write(fn, bufr, (unsigned) s1);
                     70:        alarm(0);
                     71:        if (s1 != s2)
                     72:                return(FAIL);
                     73:        return(0);
                     74: }
                     75: 
                     76: /*
                     77:  * read message from link
                     78:  *     str     -> message buffer
                     79:  *     fn      -> file descriptor
                     80:  * return
                     81:  *     FAIL    -> read timed out
                     82:  *     0       -> ok message in str
                     83:  */
                     84: erdmsg(str, fn)
                     85: register char *str;
                     86: {
                     87:        register int i;
                     88:        register unsigned len;
                     89: 
                     90:        if(setjmp(Failbuf)) {
                     91:                DEBUG(7, "erdmsg read failed\n", "");
                     92:                return(FAIL);
                     93:        }
                     94: 
                     95:        i = BUFSIZ;
                     96:        for (;;) {
                     97:                alarm(60);
                     98:                if ((len = read(fn, str, i)) == 0)
                     99:                        continue;       /* Perhaps should be FAIL, but the */
                    100:                                        /* timeout will get it (skip alarm(0) */
                    101:                alarm(0);
                    102:                if (len < 0) return(FAIL);
                    103:                str += len; i -= len;
                    104:                if (*(str - 1) == '\0')
                    105:                        break;
                    106:        }
                    107:        return(0);
                    108: }
                    109: 
                    110: /*
                    111:  * read data from file fp1 and write
                    112:  * on link
                    113:  *     fp1     -> file descriptor
                    114:  *     fn      -> link descriptor
                    115:  * returns:
                    116:  *     FAIL    ->failure in link
                    117:  *     0       -> ok
                    118:  */
                    119: ewrdata(fp1, fn)
                    120: int    fn;
                    121: register FILE *fp1;
                    122: {
                    123:        register int ret;
                    124:        int len;
                    125:        long bytes;
                    126:        char bufr[BUFSIZ];
                    127:        char text[BUFSIZ];
                    128:        time_t  ticks;
                    129:        int     mil;
                    130:        struct stat     statbuf;
                    131:        off_t   msglen;
                    132:        char    cmsglen[20];
                    133: 
                    134:        if (setjmp(Failbuf)) {
                    135:                DEBUG(7, "ewrdata failed\n", "");
                    136:                return(FAIL);
                    137:        }
                    138:        bytes = 0L;
                    139:        fstat(fileno(fp1), &statbuf);
                    140:        bytes = msglen = statbuf.st_size;
                    141:        (void) millitick();
                    142:        sprintf(cmsglen, "%ld", (long) msglen);
                    143:        alarm(60);
                    144:        ret = write(fn, cmsglen, sizeof(cmsglen));
                    145:        DEBUG(7, "ewrmsg write %d\n", statbuf.st_size);
                    146:        while ((len = fread(bufr, sizeof (char), BUFSIZ, fp1)) > 0) {
                    147:                alarm(60);
                    148:                ret = write(fn, bufr, (unsigned) len);
                    149:                alarm(0);
                    150:                DEBUG(7, "ewrmsg ret %d\n", ret);
                    151:                if (ret != len)
                    152:                        return(FAIL);
                    153:                if ((msglen -= len) <= 0)
                    154:                        break;
                    155:        }
                    156:        if (len < 0 || (len == 0 && msglen != 0)) return(FAIL);
                    157:        ticks = millitick();
                    158:        sprintf(text, "-> %ld / %ld.%.3d secs", bytes, ticks / 1000, ticks % 1000);
                    159:        DEBUG(4, "%s\n", text);
                    160:        syslog(text);
                    161:        return(0);
                    162: }
                    163: 
                    164: /*
                    165:  * read data from link and
                    166:  * write into file
                    167:  *     fp2     -> file descriptor
                    168:  *     fn      -> link descriptor
                    169:  * returns:
                    170:  *     0       -> ok
                    171:  *     FAIL    -> failure on link
                    172:  */
                    173: erddata(fn, fp2)
                    174: register FILE *fp2;
                    175: {
                    176:        register int len;
                    177:        long bytes;
                    178:        char text[BUFSIZ];
                    179:        char bufr[BUFSIZ];
                    180:        time_t  ticks;
                    181:        int     mil;
                    182:        long    msglen;
                    183:        char    cmsglen[20];
                    184: 
                    185:        bytes = 0L;
                    186:        (void) millitick();
                    187:        len = erdblk(cmsglen, sizeof(cmsglen), fn);
                    188:        if (len < 0) return(FAIL);
                    189:        sscanf(cmsglen, "%ld", &msglen);
                    190:        bytes = msglen;
                    191:        DEBUG(7, "erdblk msglen %d\n", msglen);
                    192:        for (;;) {
                    193:                len = erdblk(bufr, MIN(msglen, BUFSIZ), fn);
                    194:                DEBUG(7, "erdblk ret %d\n", len);
                    195:                if (len < 0) {
                    196:                        DEBUG(7, "erdblk failed\n", "");
                    197:                        return(FAIL);
                    198:                }
                    199:                if ((msglen -= len) < 0) {
                    200:                        DEBUG(7, "erdblk read too much\n", "");
                    201:                        return(FAIL);
                    202:                }
                    203:                fwrite(bufr, sizeof (char), len, fp2);
                    204:                if (msglen == 0)
                    205:                        break;
                    206:        }
                    207:        ticks = millitick();
                    208:        sprintf(text, "<- %ld / %ld.%.3d secs", bytes, ticks / 1000, ticks % 1000);
                    209:        DEBUG(4, "%s\n", text);
                    210:        syslog(text);
                    211:        return(0);
                    212: }
                    213: 
                    214: /*
                    215:  * read block from link
                    216:  * reads are timed
                    217:  *     blk     -> address of buffer
                    218:  *     len     -> size to read
                    219:  *     fn      -> link descriptor
                    220:  * returns:
                    221:  *     FAIL    -> link error timeout on link
                    222:  *     i       -> # of bytes read
                    223:  */
                    224: erdblk(blk, len,  fn)
                    225: register char *blk;
                    226: {
                    227:        register int i, ret;
                    228: 
                    229:        if(setjmp(Failbuf)) {
                    230:                DEBUG(7, "erdblk timeout\n", "");
                    231:                return(FAIL);
                    232:        }
                    233: 
                    234:        for (i = 0; i < len; i += ret) {
                    235:                alarm(60);
                    236:                DEBUG(7, "ask %d ", len - i);
                    237:                if ((ret = read(fn, blk, (unsigned) len - i)) < 0) {
                    238:                        alarm(0);
                    239:                        DEBUG(7, "read failed\n", "");
                    240:                        return(FAIL);
                    241:                }
                    242:                DEBUG(7, "got %d\n", ret);
                    243:                blk += ret;
                    244:                if (ret == 0)
                    245:                        break;
                    246:        }
                    247:        alarm(0);
                    248:        return(i);
                    249: }

unix.superglobalmegacorp.com

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