Annotation of researchv10dc/ipc/bin/pupu/pupucommon.c, revision 1.1.1.1

1.1       root        1: 
                      2:        static char     SCCSID[] = "@(#)pupucommon.c    2.1 DKHOST 85/01/15";
                      3: 
                      4: #include       <sys/types.h>
                      5: #include       "sysexits.h"
                      6: #include       <signal.h>
                      7: #include       "tdefs.h"
                      8: #include       "udefs.h"
                      9: #include       <varargs.h>
                     10: #include       <errno.h>
                     11: #include       <string.h>
                     12: #include       <stdio.h>
                     13: #include       "pupu.h"
                     14: extern int     errno ;
                     15: 
                     16:        Xint    cfd;
                     17: 
                     18:        Xchar   mhead[H_DATA]   = "\206\006";
                     19:        Xchar   buf[BLOCKSIZE];
                     20:        XcharP  mnext;
                     21:        Xchar   sseq, rseq;
                     22: 
                     23:        Xjmp    giveup;
                     24:        XfnP    alarmwas;
                     25: 
                     26:        Xchar   wdir[NAMELEN];
                     27:        Xchar   basedir[NAMELEN];
                     28:        Xchar   wholename[NAMELEN];
                     29: 
                     30:        Xlink   linkhead;
                     31: 
                     32:        XfnP    errorfunction;
                     33:        Xint    lasterror;
                     34:        XcharP  remoteorlocal;
                     35:        XcharP  currentfile, timeoutmsg;
                     36: 
                     37:        Xchar   openfiles[TOPFD+4];
                     38: 
                     39:        Efn     gotinit, gotinitreply;
                     40: 
                     41:        Xexp    inittable[] = {
                     42:                'I',    gotinit,
                     43:                'i',    gotinitreply,
                     44:                0,      0
                     45:        };
                     46: 
                     47:        Efn     remotedone, remoteerror, alldone;
                     48: 
                     49:        Xexp    justquit[] = {
                     50:                'x',    remotedone,
                     51:                'e',    remoteerror,
                     52:                'X',    alldone,
                     53:                0,      0
                     54:        };
                     55: 
                     56:        SexpP   toexpect;
                     57: 
                     58:        Xchar   myversion[6]    = "1";
                     59:        Xchar   theirversion[6];
                     60: 
                     61:        Xchar   options[32];
                     62: 
                     63:        Efn     timeout;
                     64: 
                     65: begin(fd, errfcn, rol, initwdir)
                     66:        PfnP    errfcn;
                     67:        PcharP  rol, initwdir;
                     68: {
                     69:        cfd = fd;
                     70:        errorfunction = errfcn;
                     71:        remoteorlocal = rol;
                     72:        currentfile = NIL;
                     73:        lasterror = 0;
                     74: 
                     75:        strcpy(wdir, initwdir);
                     76: 
                     77:        signal(SIGALRM, timeout);
                     78: }
                     79: 
                     80: sendinit(opt)
                     81:        PcharP  opt;
                     82: {
                     83:        msginit('I');
                     84:        msgfmt("%s", myversion);
                     85:        msgfmt("%s", opt);
                     86: 
                     87:        msgconf(inittable);
                     88: }
                     89: 
                     90: gotinit()
                     91: {
                     92:        msgtake("%s", theirversion);
                     93:        msgtake("%s", options);
                     94: 
                     95:        msginit('i');
                     96:        msgfmt("%s", myversion);
                     97:        msgsend();
                     98: 
                     99:        return(1);
                    100: }
                    101: 
                    102: gotinitreply()
                    103: {
                    104:        msgtake("%s", theirversion);
                    105: 
                    106:        return(1);
                    107: }
                    108:        
                    109: err(msg, parm, en)
                    110:        PcharP  msg, parm;
                    111: {
                    112:        warn(msg, parm, en);
                    113: 
                    114:        if(*remoteorlocal == 'r')
                    115:                reply('X');
                    116: 
                    117:        stopnow(en);
                    118: }
                    119: 
                    120: warn(msg, parm, en)
                    121:        PcharP  msg, parm;
                    122: {
                    123:        RcharP  ep;
                    124:        Achar   ebuf[BUFSIZ];
                    125: 
                    126:        ep = ebuf;
                    127: 
                    128:        ep += sprintf(ep, "(%s): %s", remoteorlocal, msg);
                    129: 
                    130:        if(parm)
                    131:                ep += sprintf(ep, " [%s]", parm);
                    132: 
                    133:        if(en > 0 && errno >= 0 && errno <= sys_nerr)
                    134:                sprintf(ep, " -- %s", sys_errlist[errno]);
                    135: 
                    136: db(stderr, "warn * %s\n", ebuf);
                    137:        if(*remoteorlocal == 'l')
                    138:                (*errorfunction)(ebuf);
                    139:        else{
                    140:                msginit('e');
                    141:                msgfmt("%s", ebuf);
                    142:                msgsend();
                    143:        }
                    144: 
                    145:        lasterror = en < 0 ? -en : en;
                    146: }
                    147: 
                    148: creatn(name, mode)
                    149:        PcharP  name;
                    150: {
                    151:        Rint    fd;
                    152: 
                    153:        fd = creat(name, mode);
                    154: 
                    155:        if(fd >= 0)
                    156:                openfiles[fd] = 1;
                    157: 
                    158:        return(fd);
                    159: }
                    160: 
                    161: openn(name, flags)
                    162:        PcharP  name;
                    163: {
                    164:        Rint    fd;
                    165: 
                    166:        fd = open(name, flags);
                    167: 
                    168:        if(fd >= 0)
                    169:                openfiles[fd] = 1;
                    170: 
                    171:        return(fd);
                    172: }
                    173: 
                    174: closen(fd)
                    175: {
                    176:        close(fd);
                    177: 
                    178:        openfiles[fd] = 0;
                    179: }
                    180: 
                    181: remotedone()
                    182: {
                    183:        Aint    en;
                    184: 
                    185:        msgtake("%d", &en);
                    186: 
                    187:        if(en)
                    188:                lasterror = en;
                    189: 
                    190:        return(1);
                    191: }
                    192: 
                    193: alldone()
                    194: {
                    195:        stopnow(0);
                    196: }
                    197: 
                    198: stopnow(en)
                    199: {
                    200:        Rint    i;
                    201:        RlinkP  lp, nlp;
                    202: 
                    203:        alarm(0);
                    204:        signal(SIGALRM, alarmwas);
                    205: 
                    206:        for(i = 0; i < sizeof(openfiles)/sizeof(openfiles[0]); i++)
                    207:                if(openfiles[i])
                    208:                        closen(i);
                    209: 
                    210:        for(lp = linkhead.next; lp; lp = nlp){
                    211:                nlp = lp->next;
                    212:                free(lp);
                    213:        }
                    214:        linkhead.next = 0;
                    215: 
                    216:        if(en > 0)
                    217:                lasterror = en;
                    218:        else if(en < 0)
                    219:                lasterror = -en;
                    220: 
                    221:        longjmp(giveup, 1);
                    222: }
                    223: 
                    224: msgtake(fmt, ptr)
                    225:        PcharP  fmt, ptr;
                    226: {
                    227:        if(strcmp(fmt, "%s") == 0)
                    228:                strcpy(ptr, mnext);     /* Foo!  sscanf stops at white space */
                    229:        else
                    230:                sscanf(mnext, fmt, ptr);
                    231: 
                    232:        mnext += strlen(mnext)+1;
                    233: }
                    234: 
                    235: reply(type)
                    236:        Pchar   type;
                    237: {
                    238:        if(++sseq > SEQMAX)
                    239:                sseq = SEQMIN;
                    240:        mhead[H_SEQN] = sseq;
                    241: 
                    242:        mhead[H_TYPE] = type;
                    243: 
                    244:        timeoutmsg = "Protocol exchange timed out";
                    245: 
                    246:        alarm(WTIMEOUT);
                    247: 
                    248:        msgwrite(cfd, mhead, sizeof(mhead));
                    249: 
                    250:        alarm(0);
                    251: }
                    252: 
                    253: confirmed()
                    254: {
                    255:        return(1);
                    256: }
                    257: 
                    258: remoteerror()
                    259: {
                    260:        Achar   ebuf[BUFSIZ];
                    261: 
                    262:        msgtake("%s", ebuf);
                    263: 
                    264:        (*errorfunction)(ebuf);
                    265: 
                    266:        return(0);
                    267: }
                    268: 
                    269: msginit(type)
                    270:        Pchar   type;
                    271: {
                    272:        if(toexpect){
                    273:                msgwait(toexpect);
                    274:                toexpect = 0;
                    275:        }
                    276: 
                    277:        if(++sseq > SEQMAX)
                    278:                sseq = SEQMIN;
                    279:        mhead[H_SEQN] = sseq;
                    280: 
                    281:        mhead[H_TYPE] = type;
                    282: 
                    283:        strcpy(buf, mhead);
                    284: 
                    285:        mnext = &buf[H_DATA];
                    286: }
                    287: 
                    288:        /* VARARGS0 */
                    289: msgfmt(va_alist)
                    290:        va_dcl
                    291: {
                    292:        RcharP  fmt;
                    293:        va_list args;
                    294: 
                    295:        va_start(args);
                    296: 
                    297:        fmt = va_arg(args, TcharP);
                    298: 
                    299:        mnext += vsprintf(mnext, fmt, args) + 1;
                    300: }
                    301: 
                    302: msgconf(expect)
                    303:        PexpP   expect;
                    304: {
                    305:        msgsend();
                    306: 
                    307:        toexpect = expect;
                    308: }
                    309: 
                    310: msgsend()
                    311: {
                    312:        Rint    len;
                    313: db(stderr, "msgsend %c\n", buf[H_TYPE]);
                    314: 
                    315:        len = mnext - buf;
                    316: 
                    317:        timeoutmsg = "Protocol exchange timed out";
                    318: 
                    319:        alarm(WTIMEOUT);
                    320: 
                    321:        if(msgwrite(cfd, buf, len) != len)
                    322:                if(*remoteorlocal == 'r')
                    323:                        stopnow(EX_IOERR);
                    324:                else
                    325:                        err("Message write failed", NIL, EX_IOERR);
                    326: 
                    327:        alarm(0);
                    328: }
                    329: 
                    330: msgwait(expect)
                    331:        PexpP   expect;
                    332: {
                    333:        Rint    len;
                    334:        RexpP   ep;
                    335: 
                    336: db(stderr, "msgwait %X\n", expect);
                    337:        timeoutmsg = "Protocol exchange timed out";
                    338: 
                    339:        for(;;){
                    340:                alarm(RTIMEOUT);
                    341: 
                    342:                len = msgread(cfd, buf, sizeof(buf));
                    343: 
                    344:                alarm(0);
                    345: db(stderr, "read len %d type %c\n", len, buf[H_TYPE]);
                    346: 
                    347:                if(len <= 0)
                    348:                        err("Message read error", NIL, EX_IOERR);
                    349: 
                    350:                if(++rseq > SEQMAX)
                    351:                        rseq = SEQMIN;
                    352:                if(buf[H_MAG1] != mhead[H_MAG1] || buf[H_MAG2] != mhead[H_MAG2])
                    353:                        err("Bad magic number on message", NIL, -EX_PROTOCOL);
                    354:                if(buf[H_SEQN] != rseq)
                    355:                        err("Bad sequence number on message", NIL, -EX_PROTOCOL);
                    356: 
                    357:                mnext = &buf[H_DATA];
                    358: 
                    359:                for(ep = expect; ep->type; ep++)
                    360:                        if(ep->type == buf[H_TYPE])
                    361:                                if((*ep->fn)())
                    362:                                        return;
                    363:                                else
                    364:                                        break;
                    365: 
                    366:                if(!ep->type)
                    367:                        err("Unexpected message type", &buf[H_TYPE], -EX_PROTOCOL);
                    368:        }
                    369: }
                    370: 
                    371: 
                    372: sendfile(name)
                    373:        RcharP  name;
                    374: {
                    375:        AcharP  d;
                    376: 
                    377: db(stderr, "sendfile %s\n", name);
                    378:        if(d = strrchr(name, '/')){
                    379:                if(!wdir[0])
                    380:                        curdir(wdir);
                    381: 
                    382:                if(d == name)
                    383:                        name = "/";
                    384:                else
                    385:                        *d = '\0';
                    386: 
                    387:                if(chdir(name) < 0){
                    388:                        warn("Can't change directory to", name, EX_NOINPUT);
                    389:                        return;
                    390:                }
                    391: 
                    392:                name = d+1;
                    393:        }
                    394: 
                    395:        putfile(name, name);
                    396: 
                    397:        if(d)
                    398:                chdir(wdir);
                    399: }
                    400: 
                    401: timeout()
                    402: {
                    403:        err(timeoutmsg, currentfile, -EX_IOERR);
                    404: }

unix.superglobalmegacorp.com

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