Annotation of researchv8dc/cmd/uucp/cntrl.c, revision 1.1

1.1     ! root        1: /*     /sccs/src/cmd/uucp/s.cntrl.c
        !             2:        cntrl.c 1.9     8/30/84 17:37:09
        !             3: */
        !             4: #include "uucp.h"
        !             5: VERSION(@(#)cntrl.c    1.9);
        !             6: 
        !             7: struct Proto {
        !             8:        char P_id;
        !             9:        int (*P_turnon)();
        !            10:        int (*P_rdmsg)();
        !            11:        int (*P_wrmsg)();
        !            12:        int (*P_rddata)();
        !            13:        int (*P_wrdata)();
        !            14:        int (*P_turnoff)();
        !            15: };
        !            16: 
        !            17: extern int gturnon(), gturnoff();
        !            18: extern int errno;
        !            19: extern int grdmsg(), grddata();
        !            20: extern int gwrmsg(), gwrdata();
        !            21: #ifdef DATAKIT
        !            22: extern int dturnon(), dturnoff();
        !            23: extern int drdmsg(), drddata();
        !            24: extern int dwrmsg(), dwrdata();
        !            25: #endif DATAKIT
        !            26: #ifdef X25
        !            27: extern int xturnon(), xturnoff();
        !            28: extern int xrdmsg(), xrddata();
        !            29: extern int xwrmsg(), xwrdata();
        !            30: #endif X25
        !            31: 
        !            32: #if  defined (TCP) || defined (UNET)
        !            33: extern int eturnon(), eturnoff();
        !            34: extern int erdmsg(), erddata();
        !            35: extern int ewrmsg(), ewrdata();
        !            36: #endif UNET || TCP
        !            37: 
        !            38: extern int imsg();
        !            39: extern int omsg();
        !            40: 
        !            41: struct Proto Ptbl[]={
        !            42:        'g', gturnon, grdmsg, gwrmsg, grddata, gwrdata, gturnoff,
        !            43: 
        !            44: #if  defined (TCP) || defined (UNET)
        !            45:        'e', eturnon, erdmsg, ewrmsg, erddata, ewrdata, eturnoff,
        !            46: #endif UNET || TCP
        !            47: 
        !            48: #ifdef DATAKIT
        !            49:        'd', dturnon, drdmsg, dwrmsg, drddata, dwrdata, dturnoff,
        !            50: #endif DATAKIT
        !            51: 
        !            52: #ifdef X25
        !            53:        'x', xturnon, xrdmsg, xwrmsg, xrddata, xwrdata, xturnoff,
        !            54: #endif X25
        !            55:        '\0'
        !            56: };
        !            57: 
        !            58: int (*Rdmsg)()=imsg, (*Rddata)();
        !            59: int (*Wrmsg)()=omsg, (*Wrdata)();
        !            60: int (*Turnon)(), (*Turnoff)();
        !            61: 
        !            62: 
        !            63: #define YES "Y"
        !            64: #define NO "N"
        !            65: 
        !            66: /*
        !            67:  * failure messages
        !            68:  */
        !            69: #define EM_MAX         7
        !            70: #define EM_LOCACC      "N1"    /* local access to file denied */
        !            71: #define EM_RMTACC      "N2"    /* remote access to file/path denied */
        !            72: #define EM_BADUUCP     "N3"    /* a bad uucp command was generated */
        !            73: #define EM_NOTMP       "N4"    /* remote error - can't create temp */
        !            74: #define EM_RMTCP       "N5"    /* can't copy to remote directory - file in public */
        !            75: #define EM_LOCCP       "N6"    /* can't copy on local system */
        !            76: 
        !            77: char *Em_msg[] = {
        !            78:        "COPY FAILED (reason not given by remote)",
        !            79:        "local access to file denied",
        !            80:        "remote access to path/file denied",
        !            81:        "system error - bad uucp command generated",
        !            82:        "remote system can't create temp file",
        !            83:        "can't copy to file/directory - file left in PUBDIR/user/file",
        !            84:        "can't copy to file/directory - file left in PUBDIR/user/file",
        !            85:        "forwarding error"
        !            86: };
        !            87: 
        !            88: 
        !            89: #define XUUCP 'X'      /* execute uucp (string) */
        !            90: #define SLTPTCL 'P'    /* select protocol  (string)  */
        !            91: #define USEPTCL 'U'    /* use protocol (character) */
        !            92: #define RCVFILE 'R'    /* receive file (string) */
        !            93: #define SNDFILE 'S'    /* send file (string) */
        !            94: #define RQSTCMPT 'C'   /* request complete (string - yes | no) */
        !            95: #define HUP     'H'    /* ready to hangup (string - yes | no) */
        !            96: #define RESET  'X'     /* reset line modes */
        !            97: 
        !            98: #define W_MAX          10      /* maximum number of C. files per line */
        !            99: #define W_TYPE         wrkvec[0]
        !           100: #define W_FILE1                wrkvec[1]
        !           101: #define W_FILE2                wrkvec[2]
        !           102: #define W_USER         wrkvec[3]
        !           103: #define W_OPTNS                wrkvec[4]
        !           104: #define W_DFILE                wrkvec[5]
        !           105: #define W_MODE         wrkvec[6]
        !           106: #define W_NUSER                wrkvec[7]
        !           107: #define W_SFILE                wrkvec[8]
        !           108: #define W_RFILE                wrkvec[5]
        !           109: #define W_XFILE                wrkvec[5]
        !           110: char   *mf;
        !           111: 
        !           112: #define RMESG(m, s) if (rmesg(m, s) != 0) {(*Turnoff)(); return(FAIL);}
        !           113: #define RAMESG(s) if (rmesg('\0', s) != 0) {(*Turnoff)(); return(FAIL);}
        !           114: #define WMESG(m, s) if(wmesg(m, s) != 0) {(*Turnoff)(); return(FAIL);}
        !           115: 
        !           116: char Wfile[MAXFULLNAME] = {'\0'};
        !           117: char Dfile[MAXFULLNAME];
        !           118: 
        !           119: /*
        !           120:  * execute the conversation between the two machines 
        !           121:  * after both programs are running.
        !           122:  * returns:
        !           123:  *     SUCCESS         -> ok
        !           124:  *     FAIL            -> failed
        !           125:  */
        !           126: char   *wrkvec[W_MAX+1];
        !           127: int    statfopt;
        !           128: cntrl(role)
        !           129: register int   role;
        !           130: {
        !           131:        FILE * fp;
        !           132:        struct stat stbuf;
        !           133:        extern (*Rdmsg)(), (*Wrmsg)();
        !           134:        int     filemode;
        !           135:        int     status = 1;
        !           136:        int     i, narg;
        !           137:        int     mailopt, ntfyopt;
        !           138:        int     ret;
        !           139:        char    rqstr[BUFSIZ];  /* contains the current request message */
        !           140:        char    msg[BUFSIZ];
        !           141:        char    filename[MAXFULLNAME], wrktype;
        !           142:        static int      pnum;
        !           143: 
        !           144:        pnum = getpid();
        !           145:        Wfile[0] = '\0';
        !           146: top:
        !           147:        (void) strcpy(User, Uucp);
        !           148:        statfopt = 0;
        !           149:        *Jobid = '\0';
        !           150:        DEBUG(4, "*** TOP ***  -  role=%d, ", role);
        !           151:        setline(RESET);
        !           152:        if (role == MASTER) {
        !           153: 
        !           154:                /*
        !           155:                 * get work
        !           156:                 */
        !           157:                if ((narg = gtwvec(Wfile, wrkvec, W_MAX)) == 0) {
        !           158:                        WMESG(HUP, "");
        !           159:                        RMESG(HUP, msg);
        !           160:                        goto process;
        !           161:                }
        !           162:                DEBUG(7, "Wfile - %s,", Wfile);
        !           163:                strncpy(Jobid, BASENAME(Wfile, '/')+2, NAMESIZE);
        !           164:                Jobid[NAMESIZE-1] = '\0';
        !           165:                DEBUG(7, "Jobid = %s\n", Jobid);
        !           166:                wrktype = W_TYPE[0];
        !           167:                mailopt = strchr(W_OPTNS, 'm') != NULL;
        !           168:                statfopt = strchr(W_OPTNS, 'o') != NULL;
        !           169:                ntfyopt = strchr(W_OPTNS, 'n') != NULL;
        !           170: 
        !           171:                msg[0] = '\0';
        !           172:                for (i = 1; i < narg; i++) {
        !           173:                        (void) strcat(msg, " ");
        !           174:                        (void) strcat(msg, wrkvec[i]);
        !           175:                }
        !           176: 
        !           177:                /*
        !           178:                 * We used to check for corrupt workfiles here (narg < 5),
        !           179:                 * but we were doing it wrong, and besides, anlwrk.c is the
        !           180:                 * appropriate place to do it.
        !           181:                 */
        !           182: 
        !           183:                (void) sprintf(User, "%s", W_USER);
        !           184:                if (wrktype == SNDFILE ) {
        !           185:                        (void) sprintf(rqstr, "%s!%s --> %s!%s (%s)", Myname,
        !           186:                            W_FILE1, Rmtname, W_FILE2, User);
        !           187:                        logent(rqstr, "REQUEST");
        !           188:                        CDEBUG(1, "Request: %s\n", rqstr);
        !           189:                        mf = W_SFILE;
        !           190:                        (void) strcpy(filename, W_FILE1);
        !           191:                        expfile(filename);
        !           192:                        if ( !READSOME(filename) && !READSOME(W_DFILE)) {
        !           193: 
        !           194:                                /*
        !           195:                                 * access denied
        !           196:                                 */
        !           197:                                logent("DENIED", "ACCESS");
        !           198:                                unlinkdf(W_DFILE);
        !           199:                                lnotify(User, rqstr, "access denied");
        !           200:                                CDEBUG(1, "Failed: Access Denied\n", 0);
        !           201:                                goto top;
        !           202:                        }
        !           203: 
        !           204:                        (void) strcpy(Dfile, W_DFILE);
        !           205:                        fp = NULL;
        !           206:                        fp = fopen(Dfile, "r");
        !           207:                        if (fp == NULL && 
        !           208:                            (fp = fopen(filename, "r")) == NULL) {
        !           209: 
        !           210:                                /*  can not read data file */
        !           211:                                unlinkdf(Dfile);
        !           212:                                lnotify(User, rqstr, "can't access");
        !           213: 
        !           214:                                (void) sprintf(msg, "CAN'T READ %s %d",
        !           215:                                        filename, errno);
        !           216:                                logent(msg, "FAILED");
        !           217:                                CDEBUG(1, "Failed: Can't Read %s\n", filename);
        !           218:                                goto top;
        !           219:                        }
        !           220:                        Seqn++;
        !           221:                        setline(SNDFILE);
        !           222:                }
        !           223: 
        !           224:                if (wrktype == RCVFILE) {
        !           225:                        (void) sprintf(rqstr, "%s!%s --> %s!%s (%s)", Rmtname,
        !           226:                            W_FILE1, Myname, W_FILE2, User);
        !           227:                        logent(rqstr, "REQUEST");
        !           228:                        CDEBUG(1, "Request: %s\n", rqstr);
        !           229:                        mf = W_RFILE;
        !           230:                        (void) strcpy(filename, W_FILE2);
        !           231:                        expfile(filename);
        !           232:                        if (chkperm(W_FILE1, filename, strchr(W_OPTNS, 'd'))) {
        !           233: 
        !           234:                                /* access denied */
        !           235:                                logent("DENIED", "ACCESS");
        !           236:                                lnotify(User, rqstr, "access denied");
        !           237:                                CDEBUG(1, "Failed: Access Denied--File: $s\n", 
        !           238:                                    filename);
        !           239:                                goto top;
        !           240:                        }
        !           241:                        TMname(Dfile, pnum); /* get TM file name */
        !           242: 
        !           243:                        if ( ((fp = fopen(Dfile, "w")) == NULL)
        !           244:                             || nospace(Dfile)) {
        !           245: 
        !           246:                                /* can not create temp */
        !           247:                                logent("CAN'T CREATE TM", "FAILED");
        !           248:                                CDEBUG(1, "Failed: No Space!\n", 0);
        !           249:                                unlinkdf(Dfile);
        !           250:                                assert(Ct_CREATE, Dfile, nospace(Dfile),
        !           251:                                    sccsid, __FILE__, __LINE__);
        !           252:                                cleanup(FAIL);
        !           253:                        }
        !           254:                        Seqn++;
        !           255:                        chmod(Dfile, DFILEMODE);        /* no peeking! */
        !           256:                        setline(RCVFILE);
        !           257:                }
        !           258: sendmsg:
        !           259:                DEBUG(4, "wrktype - %c\n ", wrktype);
        !           260:                WMESG(wrktype, msg);
        !           261:                RMESG(wrktype, msg);
        !           262:                goto process;
        !           263:        }
        !           264: 
        !           265:        /*
        !           266:         * role is slave
        !           267:         */
        !           268:        RAMESG(msg);
        !           269: 
        !           270: process:
        !           271: 
        !           272:        /*
        !           273:         * touch all lock files
        !           274:         */
        !           275:        ultouch();
        !           276:        DEBUG(4, " PROCESS: msg - %s\n", msg);
        !           277:        switch (msg[0]) {
        !           278: 
        !           279:        case RQSTCMPT:
        !           280:                DEBUG(4, "%s\n", "RQSTCMPT:");
        !           281:                if (msg[1] == 'N') {
        !           282:                        i = atoi(&msg[2]);
        !           283:                        if (i < 0 || i > EM_MAX) 
        !           284:                                i = 0;
        !           285:                        logent(Em_msg[i], "REQUESTED");
        !           286:                }
        !           287:                if (role == MASTER) {
        !           288:                        notify(mailopt, W_USER, rqstr, Rmtname, &msg[1]);
        !           289:                }
        !           290:                goto top;
        !           291: 
        !           292:        case HUP:
        !           293:                DEBUG(4, "%s\n", "HUP:");
        !           294:                if (msg[1] == 'Y') {
        !           295:                        WMESG(HUP, YES);
        !           296:                        (*Turnoff)();
        !           297:                        Rdmsg = imsg;
        !           298:                        Wrmsg = omsg;
        !           299:                        return(0);
        !           300:                }
        !           301: 
        !           302:                if (msg[1] == 'N') {
        !           303:                        ASSERT(role == MASTER, Wr_ROLE, "", role);
        !           304:                        role = SLAVE;
        !           305:                        goto top;
        !           306:                }
        !           307: 
        !           308:                /*
        !           309:                 * get work
        !           310:                 */
        !           311:                if ( (switchRole() == FALSE) || !iswrk(Wfile) ) {
        !           312:                        DEBUG(5, "SLAVE-switchRole (%s)\n",
        !           313:                            switchRole() ? "TRUE" : "FALSE");
        !           314:                        WMESG(HUP, YES);
        !           315:                        RMESG(HUP, msg);
        !           316:                        goto process;
        !           317:                }
        !           318: 
        !           319:                /* Note that Wfile is the first C. to process at top
        !           320:                 * set above by iswrk() call
        !           321:                 */
        !           322:                WMESG(HUP, NO);
        !           323:                role = MASTER;
        !           324:                goto top;
        !           325: 
        !           326:        case XUUCP:
        !           327:                /*
        !           328:                 * slave part
        !           329:                 * No longer accepted
        !           330:                 */
        !           331: 
        !           332:                WMESG(XUUCP, NO);
        !           333:                goto top;
        !           334: 
        !           335:        case SNDFILE:
        !           336: 
        !           337:                /*
        !           338:                 * MASTER section of SNDFILE
        !           339:                 */
        !           340:                DEBUG(4, "%s\n", "SNDFILE:");
        !           341:                if (msg[1] == 'N')
        !           342:                   {
        !           343:                    i = atoi(&msg[2]);
        !           344:                    if (i < 0 || i > EM_MAX)
        !           345:                        i = 0;
        !           346:                    logent(Em_msg[i], "REQUEST");
        !           347:                    notify(mailopt, W_USER, rqstr, Rmtname, &msg[1]);
        !           348:                    ASSERT(role == MASTER, Wr_ROLE, "", role);
        !           349:                    (void) fclose(fp);
        !           350:                    ASSERT(i != 4, Em_msg[4], Rmtname, i);      /* EM_NOTMP */
        !           351:                    unlinkdf(W_DFILE);
        !           352:                    goto top;
        !           353:                   }
        !           354: 
        !           355:                if (msg[1] == 'Y') {
        !           356: 
        !           357:                        /*
        !           358:                         * send file
        !           359:                         */
        !           360:                        ASSERT(role == MASTER, Wr_ROLE, "", role);
        !           361:                        if (fstat(fileno(fp), &stbuf)) /* never fail but .. */
        !           362:                            stbuf.st_size = 0;  /* for time loop calculation */
        !           363:                        ret = (*Wrdata)(fp, Ofn);
        !           364:                        (void) fclose(fp);
        !           365:                        if (ret != 0) {
        !           366:                                (*Turnoff)();
        !           367:                                return(FAIL);
        !           368:                        }
        !           369: 
        !           370:                        /* loop depending on the size of the file */
        !           371:                        /* give an extra try for each megabyte */
        !           372:                        for (i = stbuf.st_size >> 10; i >= 0; --i) {
        !           373:                            if ((ret = rmesg(RQSTCMPT, msg)) == 0)
        !           374:                                break;  /* got message */
        !           375:                        }
        !           376:                        if (ret != 0) {
        !           377:                            (*Turnoff)();
        !           378:                             return(FAIL);
        !           379:                        }
        !           380:                        unlinkdf(W_DFILE);
        !           381:                        goto process;
        !           382:                }
        !           383: 
        !           384:                /* 
        !           385:                 * SLAVE section of SNDFILE
        !           386:                 */
        !           387:                ASSERT(role == SLAVE, Wr_ROLE, "", role);
        !           388: 
        !           389:                /*
        !           390:                 * request to receive file
        !           391:                 * check permissions
        !           392:                 */
        !           393:                i = getargs(msg, wrkvec, W_MAX);
        !           394: 
        !           395:                /* Check for bad request */
        !           396:                if (i < 7) {
        !           397:                        WMESG(SNDFILE, EM_BADUUCP);
        !           398:                        logent("DENIED", "TOO FEW ARGS IN SLAVE SNDFILE");
        !           399:                        goto top;
        !           400:                }
        !           401: 
        !           402:                mf = W_SFILE;
        !           403:                (void) sprintf(rqstr, "%s!%s --> %s!%s (%s)", Rmtname,
        !           404:                            W_FILE1, Myname, W_FILE2, W_USER);
        !           405:                logent(rqstr, "REMOTE REQUESTED");
        !           406:                DEBUG(4, "msg - %s\n", msg);
        !           407:                CDEBUG(1, "Remote Requested: %s\n", rqstr);
        !           408:                (void) strcpy(filename, W_FILE2);
        !           409:                expfile(filename);
        !           410:                DEBUG(4, "SLAVE - filename: %s\n", filename);
        !           411:                if (chkpth(filename, CK_WRITE)
        !           412:                     || chkperm(W_FILE1, filename, strchr(W_OPTNS, 'd'))) {
        !           413:                        WMESG(SNDFILE, EM_RMTACC);
        !           414:                        logent("DENIED", "PERMISSION");
        !           415:                        CDEBUG(1, "Failed: Access Denied\n", 0);
        !           416:                        goto top;
        !           417:                }
        !           418:                (void) sprintf(User, "%s", W_USER);
        !           419: 
        !           420:                DEBUG(4, "chkpth ok Rmtname - %s\n", Rmtname);
        !           421:                TMname(Dfile, pnum); /* get TM file name */
        !           422: 
        !           423:                if ( ((fp = fopen(Dfile, "w")) == NULL) || nospace(Dfile) ) {
        !           424:                        WMESG(SNDFILE, EM_NOTMP);
        !           425:                        logent("CAN'T OPEN", "DENIED");
        !           426:                        CDEBUG(1, "Failed: Can't Create Temp File\n", 0);
        !           427:                        unlinkdf(Dfile);
        !           428:                        goto top;
        !           429:                }
        !           430:                Seqn++;
        !           431:                chmod(Dfile, DFILEMODE);        /* no peeking! */
        !           432:                WMESG(SNDFILE, YES);
        !           433:                ret = (*Rddata)(Ifn, fp);
        !           434:                (void) fclose(fp);
        !           435:                if (ret != 0) {
        !           436:                        (*Turnoff)();
        !           437:                        logent("INPUT FAILURE", "IN SEND/SLAVE MODE");
        !           438:                        return(FAIL);
        !           439:                }
        !           440:                /* copy to user directory */
        !           441:                ntfyopt = strchr(W_OPTNS, 'n') != NULL;
        !           442:                status = xmv(Dfile, filename);
        !           443:                WMESG(RQSTCMPT, status ? EM_RMTCP : YES);
        !           444:                if (status == 0) {
        !           445:                        sscanf(W_MODE, "%o", &filemode);
        !           446:                        if (filemode <= 0)
        !           447:                                filemode = 0666;
        !           448:                        if (PREFIX(RemSpool, filename))
        !           449:                                chmod(filename, 0600);
        !           450:                        else
        !           451:                                chmod(filename, filemode | 0666);
        !           452:                        arrived(ntfyopt, filename, W_NUSER, Rmtname, User);
        !           453:                } else {
        !           454:                        logent("FAILED",  "COPY");
        !           455:                        status = putinpub(filename, Dfile,
        !           456:                            BASENAME(W_USER, '!'));
        !           457:                        DEBUG(4, "->PUBDIR %d\n", status);
        !           458:                        if (status == 0)
        !           459:                                arrived(ntfyopt, filename, W_NUSER,
        !           460:                                    Rmtname, User);
        !           461:                }
        !           462:                goto top;
        !           463: 
        !           464:        case RCVFILE:
        !           465: 
        !           466:                /*
        !           467:                 * MASTER section of RCVFULE 
        !           468:                 */
        !           469:                DEBUG(4, "%s\n", "RCVFILE:");
        !           470:                if (msg[1] == 'N') {
        !           471:                        i = atoi(&msg[2]);
        !           472:                        if (i < 0 || i > EM_MAX)
        !           473:                                i = 0;
        !           474:                        logent(Em_msg[i], "REQUEST");
        !           475:                        notify(mailopt, W_USER, rqstr, Rmtname, &msg[1]);
        !           476:                        ASSERT(role == MASTER, Wr_ROLE, "", role);
        !           477:                        (void) fclose(fp);
        !           478:                        unlinkdf(Dfile);
        !           479:                        goto top;
        !           480:                }
        !           481: 
        !           482:                if (msg[1] == 'Y') {
        !           483: 
        !           484:                        /*
        !           485:                         * receive file
        !           486:                         */
        !           487:                        ASSERT(role == MASTER, Wr_ROLE, "", role);
        !           488:                        ret = (*Rddata)(Ifn, fp);
        !           489:                        (void) fclose(fp);
        !           490:                        if (ret != 0) {
        !           491:                                (*Turnoff)();
        !           492:                                return(FAIL);
        !           493:                        }
        !           494: 
        !           495:                        status = xmv(Dfile, filename);
        !           496:                        WMESG(RQSTCMPT, status ? EM_RMTCP : YES);
        !           497:                        notify(mailopt, W_USER, rqstr, Rmtname,
        !           498:                            status ? EM_LOCCP : YES);
        !           499:                        if (status == 0) {
        !           500:                                sscanf(&msg[2], "%o", &filemode);
        !           501:                                if (filemode <= 0)
        !           502:                                        filemode = 0666;
        !           503:                                if (PREFIX(RemSpool, filename))
        !           504:                                        chmod(filename, 0600);
        !           505:                                else
        !           506:                                        chmod(filename, filemode | 0666);
        !           507:                        } else {
        !           508:                                logent("FAILED", "COPY");
        !           509:                                putinpub(filename, Dfile, W_USER);
        !           510:                        }
        !           511:                        goto top;
        !           512:                }
        !           513: 
        !           514:                /*
        !           515:                 * SLAVE section of RCVFILE
        !           516:                 * (request to send file)
        !           517:                 */
        !           518:                ASSERT(role == SLAVE, Wr_ROLE, "", role);
        !           519: 
        !           520:                /* check permissions */
        !           521:                i = getargs(msg, wrkvec, W_MAX);
        !           522: 
        !           523:                /* Check for bad request */
        !           524:                if (i < 5) {
        !           525:                        WMESG(RCVFILE, EM_BADUUCP);
        !           526:                        logent("DENIED", "TOO FEW ARGS IN SLAVE RCVFILE");
        !           527:                        goto top;
        !           528:                }
        !           529: 
        !           530:                (void) sprintf(rqstr, "%s!%s --> %s!%s (%s)", Myname,
        !           531:                            W_FILE1, Rmtname, W_FILE2, W_USER);
        !           532:                logent(rqstr, "REMOTE REQUESTED");
        !           533:                CDEBUG(1, "Remote Requested: %s\n", rqstr);
        !           534:                mf = W_RFILE;
        !           535:                DEBUG(4, "msg - %s\n", msg);
        !           536:                DEBUG(4, "W_FILE1 - %s\n", W_FILE1);
        !           537:                (void) strcpy(filename, W_FILE1);
        !           538:                expfile(filename);
        !           539:                if (DIRECTORY(filename)) {
        !           540:                        (void) strcat(filename, "/");
        !           541:                        (void) strcat(filename, BASENAME(W_FILE2, '/'));
        !           542:                }
        !           543:                (void) sprintf(User, "%s", W_USER);
        !           544:                if (requestOK() == FALSE) {
        !           545:                        WMESG(RCVFILE, EM_RMTACC);
        !           546:                        logent("DENIED", "REQUESTING");
        !           547:                        CDEBUG(1, "Failed: Access Denied\n", 0);
        !           548:                        goto top;
        !           549:                }
        !           550:                DEBUG(4, "requestOK for Loginuser - %s\n", Loginuser);
        !           551: 
        !           552:                if (chkpth(filename, CK_READ) || !READANY(filename)) {
        !           553:                        WMESG(RCVFILE, EM_RMTACC);
        !           554:                        logent("DENIED", "PERMISSION");
        !           555:                        CDEBUG(1, "Failed: Access Denied\n", 0);
        !           556:                        goto top;
        !           557:                }
        !           558:                DEBUG(4, "chkpth ok Loginuser - %s\n", Loginuser);
        !           559: 
        !           560:                if ((fp = fopen(filename, "r")) == NULL) {
        !           561:                        WMESG(RCVFILE, EM_RMTACC);
        !           562:                        logent("CAN'T OPEN", "DENIED");
        !           563:                        CDEBUG(1, "Failed: Can't Open %s\n", filename);
        !           564:                        goto top;
        !           565:                }
        !           566: 
        !           567:                /*
        !           568:                 * ok to send file
        !           569:                 */
        !           570:                
        !           571:                ASSERT(fstat(fileno(fp), &stbuf) == 0, Ct_STAT,
        !           572:                    filename, errno);
        !           573:                (void) sprintf(msg, "%s %o", YES, stbuf.st_mode & 0777);
        !           574:                WMESG(RCVFILE, msg);
        !           575:                Seqn++;
        !           576:                ret = (*Wrdata)(fp, Ofn);
        !           577:                (void) fclose(fp);
        !           578:                if (ret != 0) {
        !           579:                        (*Turnoff)();
        !           580:                        return(FAIL);
        !           581:                }
        !           582: 
        !           583:                /* loop depending on the size of the file */
        !           584:                /* give an extra try for each megabyte */
        !           585:                /* stbuf set in fstat several lines back  */
        !           586:                for (i = stbuf.st_size >> 10; i >= 0; --i) {
        !           587:                    if ((ret = rmesg(RQSTCMPT, msg)) == 0)
        !           588:                        break;  /* got message */
        !           589:                }
        !           590:                if (ret != 0) {
        !           591:                    (*Turnoff)();
        !           592:                     return(FAIL);
        !           593:                }
        !           594:                goto process;
        !           595:        }
        !           596:        (*Turnoff)();
        !           597:        return(FAIL);
        !           598: }
        !           599: 
        !           600: 
        !           601: 
        !           602: /*
        !           603:  * read message
        !           604:  * returns:
        !           605:  *     0       -> success
        !           606:  *     FAIL    -> failure
        !           607:  */
        !           608: rmesg(c, msg)
        !           609: char *msg, c;
        !           610: {
        !           611:        char str[50];
        !           612: 
        !           613:        DEBUG(4, "rmesg - '%c' ", c);
        !           614:        if ((*Rdmsg)(msg, Ifn) != 0) {
        !           615:                DEBUG(4, "got %s\n", "FAIL");
        !           616:                (void) sprintf(str, "expected '%c' got FAIL", c);
        !           617:                logent(str, "BAD READ");
        !           618:                return(FAIL);
        !           619:        }
        !           620:        if (c != '\0' && msg[0] != c) {
        !           621:                DEBUG(4, "got %s\n", msg);
        !           622:                (void) sprintf(str, "expected '%c' got %s", c, msg);
        !           623:                logent(str, "BAD READ");
        !           624:                return(FAIL);
        !           625:        }
        !           626:        DEBUG(4, "got %s\n", msg);
        !           627:        return(0);
        !           628: }
        !           629: 
        !           630: 
        !           631: /*
        !           632:  * write a message
        !           633:  * returns:
        !           634:  *     0       -> ok
        !           635:  *     FAIL    -> ng
        !           636:  */
        !           637: wmesg(m, s)
        !           638: char *s, m;
        !           639: {
        !           640:        CDEBUG(4, "wmesg '%c'", m);
        !           641:        CDEBUG(4, "%s\n", s);
        !           642:        return((*Wrmsg)(m, s, Ofn));
        !           643: }
        !           644: 
        !           645: 
        !           646: /*
        !           647:  * mail results of command
        !           648:  * return: 
        !           649:  *     none
        !           650:  */
        !           651: notify(mailopt, user, msgin, sys, msgcode)
        !           652: char *user, *msgin, *sys;
        !           653: register char *msgcode;
        !           654: {
        !           655:        register int i;
        !           656:        char str[BUFSIZ];
        !           657:        register char *msg;
        !           658: 
        !           659:        DEBUG(4,"mailopt %d, ", mailopt);
        !           660:        DEBUG(4,"statfopt %d\n", statfopt);
        !           661:        if (statfopt == 0 && mailopt == 0 && *msgcode == 'Y')
        !           662:                return;
        !           663:        if (*msgcode == 'Y')
        !           664:                msg = "copy succeeded";
        !           665:        else {
        !           666:                i = atoi(msgcode + 1);
        !           667:                if (i < 1 || i > EM_MAX)
        !           668:                        i = 0;
        !           669:                msg = Em_msg[i];
        !           670:        }
        !           671:        if(statfopt){
        !           672:                stmesg(msgin, msg);
        !           673:                return;
        !           674:        }
        !           675:        (void) sprintf(str, "REQUEST: %s\n(SYSTEM: %s)  %s\n",
        !           676:                msgin, sys, msg);
        !           677:        mailst(user, str, "", "");
        !           678:        return;
        !           679: }
        !           680: 
        !           681: /*
        !           682:  * local notify
        !           683:  * return:
        !           684:  *     none
        !           685:  */
        !           686: lnotify(user, msgin, mesg)
        !           687: char *user, *msgin, *mesg;
        !           688: {
        !           689:        char mbuf[BUFSIZ];
        !           690: 
        !           691:        if(statfopt){
        !           692:                stmesg(msgin, mesg);
        !           693:                return;
        !           694:        }
        !           695:        (void) sprintf(mbuf, "REQUEST: %s\n(SYSTEM: %s)  %s\n",
        !           696:                msgin, Myname, mesg);
        !           697:        mailst(user, mbuf, "", "");
        !           698:        return;
        !           699: }
        !           700: static
        !           701: stmesg(f, m)
        !           702: char   *f, *m;
        !           703: {
        !           704:        FILE    *Cf;
        !           705:        time_t  clock;
        !           706:        long    td, th, tm, ts;
        !           707: 
        !           708:        DEBUG(4,"STMES %s\n",mf);
        !           709:        if((Cf = fopen(mf, "a+")) == NULL){
        !           710:                chmod(mf, 0666);
        !           711:                return;
        !           712:        }
        !           713:        (void) time(&clock);
        !           714:        (void) fprintf(Cf, "uucp job: %s (%s) ", Jobid, timeStamp());
        !           715:        td = clock - Nstat.t_qtime;
        !           716:        ts = td%60;
        !           717:        td /= 60;
        !           718:        tm = td%60;
        !           719:        td /= 60;
        !           720:        th = td;
        !           721:        (void) fprintf(Cf, "(%ld:%ld:%ld)\n%s\n%s\n\n", th, tm, ts, f, m);
        !           722:        (void) fclose(Cf);
        !           723:        chmod(mf, 0666);
        !           724: 
        !           725: }
        !           726: 
        !           727: 
        !           728: /*
        !           729:  * converse with the remote machine, agree upon a 
        !           730:  * protocol (if possible) and start the protocol.
        !           731:  * return:
        !           732:  *     SUCCESS -> successful protocol selection
        !           733:  *     FAIL    -> can't find common or open failed
        !           734:  */
        !           735: startup(role)
        !           736: register int role;
        !           737: {
        !           738:        extern (*Rdmsg)(), (*Wrmsg)();
        !           739:        extern imsg(), omsg();
        !           740:        extern char *blptcl(), fptcl(), *protoString();
        !           741:        char msg[BUFSIZ], str[BUFSIZ];
        !           742: 
        !           743:        Rdmsg = imsg;
        !           744:        Wrmsg = omsg;
        !           745:        if (role == MASTER) {
        !           746:                RMESG(SLTPTCL, msg);
        !           747:                if ((str[0] = fptcl(&msg[1])) == NULL) {
        !           748: 
        !           749:                        /*
        !           750:                         * no protocol match
        !           751:                         */
        !           752:                        WMESG(USEPTCL, NO);
        !           753:                        return(FAIL);
        !           754:                }
        !           755:                str[1] = '\0';
        !           756:                WMESG(USEPTCL, str);
        !           757:                if (stptcl(str) != 0)
        !           758:                        return(FAIL);
        !           759:                return(SUCCESS);
        !           760:        } else {
        !           761:                WMESG(SLTPTCL, blptcl(str));
        !           762:                RMESG(USEPTCL, msg);
        !           763:                if (msg[1] == 'N') {
        !           764:                        return(FAIL);
        !           765:                }
        !           766: 
        !           767:                if (stptcl(&msg[1]) != 0)
        !           768:                        return(FAIL);
        !           769:                return(SUCCESS);
        !           770:        }
        !           771: }
        !           772: 
        !           773: 
        !           774: /*
        !           775:  * choose a protocol from the input string (str)
        !           776:  * and return the found letter.
        !           777:  * Use the MASTER string for order of selection.
        !           778:  * If a preferred protocol was named, use that if possible.
        !           779:  * return:
        !           780:  *     '\0'            -> no acceptable protocol
        !           781:  *     any character   -> the chosen protocol
        !           782:  */
        !           783: char
        !           784: fptcl(str)
        !           785: register char *str;
        !           786: {
        !           787:        char *l, list[20];      /* assume less than 20 protocols */
        !           788: 
        !           789:        if ((l = protoString()) != NULL)
        !           790:                for (; *l; l++)
        !           791:                        if (strchr(str, *l))
        !           792:                                return (*l);
        !           793:        blptcl(list);
        !           794:        for (l = list; *l != '\0'; l++)
        !           795:                if (strchr(str, *l) != NULL)
        !           796:                        return(*l);
        !           797:        return('\0');
        !           798: }
        !           799: 
        !           800: /*
        !           801:  * build a string of the letters of the available
        !           802:  * protocols and return the string (str).
        !           803:  * return:
        !           804:  *     a pointer to string (str)
        !           805:  */
        !           806: char *
        !           807: blptcl(str)
        !           808: register char *str;
        !           809: {
        !           810:        register struct Proto *p;
        !           811:        char *s;
        !           812: 
        !           813:        for (p = Ptbl, s = str; (*s++ = p->P_id) != '\0'; p++)
        !           814:                ;
        !           815:        return(str);
        !           816: }
        !           817: 
        !           818: /*
        !           819:  * set up the six routines (Rdmg. Wrmsg, Rddata
        !           820:  * Wrdata, Turnon, Turnoff) for the desired protocol.
        !           821:  * returns:
        !           822:  *     SUCCESS         -> ok
        !           823:  *     FAIL            -> no find or failed to open
        !           824:  */
        !           825: stptcl(c)
        !           826: register char *c;
        !           827: {
        !           828:        register struct Proto *p;
        !           829: 
        !           830:        for (p = Ptbl; p->P_id != '\0'; p++) {
        !           831:                if (*c == p->P_id) {
        !           832: 
        !           833:                        /*
        !           834:                         * found protocol 
        !           835:                         * set routine
        !           836:                         */
        !           837:                        Rdmsg = p->P_rdmsg;
        !           838:                        Wrmsg = p->P_wrmsg;
        !           839:                        Rddata = p->P_rddata;
        !           840:                        Wrdata = p->P_wrdata;
        !           841:                        Turnon = p->P_turnon;
        !           842:                        Turnoff = p->P_turnoff;
        !           843:                        if ((*Turnon)() != 0)
        !           844:                                break;
        !           845:                        CDEBUG(4, "Proto started %c\n", *c);
        !           846:                        return(SUCCESS);
        !           847:                }
        !           848:        }
        !           849:        CDEBUG(4, "Proto start-fail %c\n", *c);
        !           850:        return(FAIL);
        !           851: }
        !           852: 
        !           853: /*
        !           854:  * put file in public place
        !           855:  * if successful, filename is modified
        !           856:  * returns:
        !           857:  *     0       -> success
        !           858:  *     FAIL    -> failure
        !           859:  */
        !           860: putinpub(file, tmp, user)
        !           861: char *file, *user, *tmp;
        !           862: {
        !           863:        int status;
        !           864:        char fullname[MAXFULLNAME];
        !           865: 
        !           866:        (void) sprintf(fullname, "%s/%s/", Pubdir, user);
        !           867:        if (mkdirs(fullname) != 0) {
        !           868: 
        !           869:                /*
        !           870:                 * can not make directories
        !           871:                 */
        !           872:                return(FAIL);
        !           873:        }
        !           874:        (void) strcat(fullname, BASENAME(file, '/'));
        !           875:        status = xmv(tmp, fullname);
        !           876:        if (status == 0) {
        !           877:                (void) strcpy(file, fullname);
        !           878:                (void) chmod(fullname,0666);
        !           879:        }
        !           880:        return(status);
        !           881: }
        !           882: 
        !           883: /*
        !           884:  * unlink D. file
        !           885:  * returns:
        !           886:  *     none
        !           887:  */
        !           888: unlinkdf(file)
        !           889: register char *file;
        !           890: {
        !           891:        if (strlen(file) > 6)
        !           892:                (void) unlink(file);
        !           893:        return;
        !           894: }
        !           895: 
        !           896: /*
        !           897:  * notify receiver of arrived file
        !           898:  * returns:
        !           899:  *     none
        !           900:  */
        !           901: arrived(opt, file, nuser, rmtsys, rmtuser)
        !           902: char *file, *nuser, *rmtsys, *rmtuser;
        !           903: {
        !           904:        char mbuf[200];
        !           905: 
        !           906:        if (!opt)
        !           907:                return;
        !           908:        (void) sprintf(mbuf, "%s from %s!%s arrived\n", file, rmtsys, rmtuser);
        !           909:        mailst(nuser, mbuf, "", "");
        !           910:        return;
        !           911: }
        !           912: 
        !           913: 
        !           914: /*
        !           915:  * Check to see if there is space for file
        !           916:  */
        !           917: 
        !           918: #define FREESPACE 50  /* Minimum freespace in blocks to permit transfer */
        !           919: #define FREENODES 5   /* Minimum number of inodes to permit transfer */
        !           920: 
        !           921: /*ARGSUSED*/
        !           922: static
        !           923: nospace(name)
        !           924: char *name;
        !           925: #ifdef NOUSTAT
        !           926: {return(FALSE);}
        !           927: #else
        !           928: {
        !           929:        struct stat statb;
        !           930:        struct ustat ustatb;
        !           931: 
        !           932:        if( stat(name, &statb) < 0 )
        !           933:                return(TRUE);
        !           934: #ifdef RT
        !           935:        if( (statb.st_mode|S_IFMT) == S_IFREG ||
        !           936:            (statb.st_mode|S_IFMT) == S_IFEXT ||
        !           937:            (statb.st_mode&S_IFMT) == S_IF1EXT )
        !           938: #else
        !           939:        if( (statb.st_mode&S_IFMT) == S_IFREG )
        !           940: #endif
        !           941:        {
        !           942:                if( ustat(statb.st_dev, &ustatb)<0 )
        !           943:                        return(TRUE);
        !           944:                if( ustatb.f_tfree < FREESPACE ) {
        !           945:                        logent("FREESPACE IS LOW","REMOTE TRANSFER DENIED - ");
        !           946:                        return(TRUE);
        !           947:                }
        !           948:                if( ustatb.f_tinode < FREENODES ) {
        !           949:                        logent("TOO FEW INODES","REMOTE TRANSFER DENIED - ");
        !           950:                        return(TRUE);
        !           951:                }
        !           952:        }
        !           953:        return(FALSE);
        !           954: }
        !           955: #endif
        !           956: 
        !           957: #ifdef V7USTAT
        !           958: ustat(dev, ustat)
        !           959: int    dev;
        !           960: struct ustat *ustat;
        !           961: {
        !           962:        FILE    *dfp, *popen();
        !           963:        struct fstab    *fstab = NULL;
        !           964:        char    *fval, buf[BUFSIZ];
        !           965: 
        !           966:        sprintf(buf, "%s %d %d 2>&1", V7USTAT, major(dev), minor(dev));
        !           967:        if ((dfp = popen(buf, "r")) == NULL)
        !           968:                return(-1);
        !           969:        fval = fgets(buf, sizeof(buf), dfp);
        !           970:        if (pclose(dfp) != 0
        !           971:         || fval == NULL
        !           972:         || sscanf(buf, "%d %d", &ustat->f_tfree, &ustat->f_tinode) != 2)
        !           973:                return(-1);
        !           974:        return(0);
        !           975: }
        !           976: #endif V7USTAT

unix.superglobalmegacorp.com

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