Annotation of researchv10no/dk/cmd/pupu/pupucommon.c, revision 1.1

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

unix.superglobalmegacorp.com

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