Annotation of 43BSDReno/contrib/isode-beta/others/rtf/rtf.c, revision 1.1.1.1

1.1       root        1: /* rtf.c - RT-file transfer utility -- initiator */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/rtf/RCS/rtf.c,v 7.1 90/07/01 21:04:45 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/rtf/RCS/rtf.c,v 7.1 90/07/01 21:04:45 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       rtf.c,v $
                     12:  * Revision 7.1  90/07/01  21:04:45  mrose
                     13:  * pepsy
                     14:  * 
                     15:  * Revision 7.0  89/11/23  22:10:45  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: #include "RTF-types.h"
                     32: #include "rtf.h"
                     33: #include "isoservent.h"
                     34: 
                     35: /*    DATA */
                     36: 
                     37: static char *myname = "rtf";
                     38: 
                     39: static char *myprovider = "rtsap";
                     40: static char *myentity = "file transfer";
                     41: 
                     42: static char *host = NULL;
                     43: static char *user = NULL;
                     44: static char *password = NULL;
                     45: static char *source = NULL;
                     46: static char *destination = NULL;
                     47: static int   turn = NOTOK;
                     48: 
                     49: static int   fd;
                     50: static int   nbytes;
                     51: 
                     52: int    downtrans (), uptrans ();
                     53: 
                     54: 
                     55: char   *getenv ();
                     56: 
                     57: /*    MAIN */
                     58: 
                     59: /* ARGSUSED */
                     60: 
                     61: main (argc, argv, envp)
                     62: int    argc;
                     63: char  **argv,
                     64:       **envp;
                     65: {
                     66:     int            result,
                     67:            sd;
                     68:     char   *file;
                     69:     register struct isoservent *is;
                     70:     struct SSAPaddr *sa;
                     71:     struct RtSAPaddr rtzs;
                     72:     register struct RtSAPaddr *rtz = &rtzs;
                     73:     struct RtSAPconnect rtcs;
                     74:     register struct RtSAPconnect   *rtc = &rtcs;
                     75:     struct RtSAPindication  rtis;
                     76:     register struct RtSAPindication *rti = &rtis;
                     77:     register struct RtSAPabort   *rta = &rti -> rti_abort;
                     78:     PE     pe;
                     79:     struct type_RTF_Request reqs;
                     80:     register struct type_RTF_Request *req = &reqs;
                     81: 
                     82:     arginit (argv);
                     83:     
                     84:     if (turn == RTS_INITIATOR) {
                     85:        if ((fd = open (source, O_RDONLY, 0x00)) == NOTOK)
                     86:            adios (source, "unable to open");
                     87:        file = destination;
                     88:     }
                     89:     else
                     90:        file = source;
                     91: 
                     92:     if ((req -> user = str2qb (user, strlen (user), 1)) == NULL
                     93:            || (req -> password = str2qb (password, strlen (password), 1))
                     94:                    == NULL
                     95:            || (req -> file = str2qb (file, strlen (file), 1)) == NULL)
                     96:        adios (NULLCP, "out of memory");
                     97:     pe = NULLPE;
                     98:     if (encode_RTF_Request (&pe, 1, 0, NULLCP, req) == NOTOK)
                     99:        adios (NULLCP, "error encoding request: %s", PY_pepy);
                    100:     PLOGP (pgm_log,RTF_Request, pe, "Request", 0);
                    101: 
                    102:     if ((is = getisoserventbyname (myentity, myprovider)) == NULL)
                    103:        adios (NULLCP, "%s/%s: unknown provider/entity pair",
                    104:               myentity, myprovider);
                    105:     rtz -> rta_port = is -> is_port;           /* yikes! */
                    106:     if ((is = getisoserventbyname ("rts", "ssap")) == NULL)
                    107:        adios (NULLCP, "ssap/rts: unknown entity");
                    108:     if ((sa = is2saddr (host, NULLCP, is)) == NULLSA)
                    109:        adios (NULLCP, "address translation failed");
                    110:     rtz -> rta_addr = *sa;     /* struct copy */
                    111: 
                    112:     fprintf (stderr, "%s...", host);
                    113:     (void) fflush (stderr);
                    114:     if (RtBeginRequest (rtz, RTS_TWA, turn, pe, rtc, rti) == NOTOK) {
                    115:        fprintf (stderr, "failed\n");
                    116:        rts_adios (rta, "RT-BEGIN.REQUEST");
                    117:     }
                    118: 
                    119:     pe_free (pe);
                    120:     qb_free (req -> user);
                    121:     qb_free (req -> password);
                    122:     qb_free (req -> file);
                    123: 
                    124:     if (rtc -> rtc_result != RTS_ACCEPT) {
                    125:        fprintf (stderr, "failed\n");
                    126:        adios (NULLCP, "association rejected: [%s]",
                    127:               RtErrString (rtc -> rtc_result));
                    128:     }
                    129:     fprintf (stderr, "connected\n");
                    130: 
                    131:     sd = rtc -> rtc_sd;
                    132: 
                    133:     RTCFREE (rtc);
                    134: 
                    135:     if (turn == RTS_INITIATOR) {
                    136:        if (RtSetDownTrans (sd, downtrans, rti) == NOTOK)
                    137:            rts_adios (rta, "set DownTrans upcall");
                    138: 
                    139:        if (RtTransferRequest (sd, NULLPE, NOTOK, rti) == NOTOK)
                    140:            rts_adios (rta, "RT-TRANSFER.REQUEST");
                    141: 
                    142:        if (nbytes == 0)
                    143:            advise (LLOG_NOTICE, NULLCP, "transfer complete");
                    144:        else
                    145:            timer (nbytes);
                    146: 
                    147:        (void) close (fd);
                    148:     }
                    149:     else {
                    150:        if (RtSetUpTrans (sd, uptrans, rti) == NOTOK)
                    151:            rts_adios (rta, "set UpTrans upcall");
                    152: 
                    153:        for (;;) {
                    154:            switch (result = RtWaitRequest (sd, NOTOK, rti)) {
                    155:                case NOTOK:
                    156:                case OK:
                    157:                case DONE:
                    158:                    break;
                    159: 
                    160:                default:
                    161:                    adios (NULLCP, "unknown return from RtWaitRequest=%d",
                    162:                           result);
                    163:            }
                    164: 
                    165:            switch (rti -> rti_type) {
                    166:                case RTI_TURN:
                    167:                    {
                    168:                        register struct RtSAPturn *rtu = &rti -> rti_turn;
                    169: 
                    170:                        if (rtu -> rtu_please) {
                    171:                            if (RtGTurnRequest (sd, rti) == NOTOK)
                    172:                                rts_adios (rta, "RT-TURN-GIVE.REQUEST");
                    173:                        }
                    174:                        else
                    175:                            break;
                    176:                    }
                    177:                    continue;
                    178:                    
                    179:                case RTI_TRANSFER:
                    180:                    {
                    181: #ifndef        lint
                    182:                        register struct RtSAPtransfer *rtt =
                    183:                                                        &rti -> rti_transfer;
                    184: #endif
                    185: 
                    186:                        if (nbytes == 0)
                    187:                            advise (LLOG_NOTICE, NULLCP, "transfer complete");
                    188:                        else
                    189:                            timer (nbytes);
                    190:                        if (RtPTurnRequest (sd, 1, rti) == NOTOK)
                    191:                            rts_adios (rta, "RT-TURN-PLEASE.REQUEST");
                    192:                    }
                    193:                    continue;
                    194: 
                    195:                case RTI_ABORT:
                    196:                    {
                    197:                        register struct RtSAPabort *rtb = &rti -> rti_abort;
                    198: 
                    199:                        if (rtb -> rta_peer)
                    200:                            rts_adios (rtb, "RT-U-ABORT.INDICATION");
                    201:                        if (RTS_FATAL (rtb -> rta_reason))
                    202:                            rts_adios (rtb, "RT-P-ABORT.INDICATION");
                    203:                        rts_advise (rtb, "RT-P-ABORT.INDICATION");
                    204:                    }
                    205:                    break;
                    206: 
                    207:                case RTI_CLOSE:
                    208:                case RTI_FINISH:
                    209:                    adios (NULLCP, "unexpected indication type=%d",
                    210:                           rti -> rti_type);
                    211: 
                    212:                default:
                    213:                    adios (NULLCP, "unknown indication type=%d",
                    214:                           rti -> rti_type);
                    215:            }
                    216:            break;
                    217:        }
                    218:     }
                    219: 
                    220:     if (RtEndRequest (sd, rti) == NOTOK)
                    221:        rts_adios (rta, "RT-END.REQUEST");
                    222: 
                    223:     exit (0);
                    224: }
                    225:  
                    226: /*     TRANSFER */
                    227: 
                    228: /* ARGSUSED */
                    229: 
                    230: static int  downtrans (sd, base, len, size, ssn, ack, rti)
                    231: int    sd;
                    232: char  **base;
                    233: int    *len,
                    234:        size;
                    235: long   ssn,
                    236:        ack;
                    237: struct RtSAPindication *rti;
                    238: {
                    239:     register int    cc;
                    240:     int            n;
                    241:     register char *dp,
                    242:                  *ep;
                    243:     static int bsize;
                    244:     static char *bp = NULL;
                    245: 
                    246:     if (base == NULLVP) {
                    247: #ifdef DEBUG
                    248:        advise (LLOG_DEBUG, NULLCP, "RT-PLEASE.INDICATION: %d", size);
                    249: #endif
                    250:        return OK;
                    251:     }
                    252: 
                    253:     if (bp == NULL) {
                    254:        struct stat st;
                    255: 
                    256:        if (fstat (fd, &st) == NOTOK)
                    257:            return rtsaplose (rti, RTS_TRANSFER, source, "unable to fstat");
                    258: #ifdef MAXBSIZE
                    259:        bsize = st.st_blksize > 0 ? st.st_blksize : BUFSIZ;
                    260: #else
                    261:        bsize = BUFSIZ;
                    262: #endif
                    263:        if (size == 0)  /* no checkpointing... */
                    264:            n = st.st_size;
                    265:        else
                    266:            if ((n = bsize) > size)
                    267:                n = size;
                    268:        if ((bp = malloc ((unsigned) n)) == NULL)
                    269:            return rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
                    270: #ifdef DEBUG
                    271:        advise (LLOG_DEBUG, NULLCP, "Selecting block size of %d", n);
                    272:        advise (LLOG_DEBUG, NULLCP,
                    273:                "  based on blksize of %d and RTTR size of %d",
                    274:                bsize, size);
                    275: #endif
                    276:        bsize = n;
                    277:        timer (nbytes = 0);
                    278:     }
                    279: 
                    280:     *base = NULLCP, *len = 0;
                    281:     for (ep = (dp = bp) + (cc = bsize); dp < ep; dp += n, cc -= n) {
                    282:        switch (n = read (fd, dp, cc)) {
                    283:            case NOTOK:
                    284:                return rtsaplose (rti, RTS_TRANSFER, "failed", "read");
                    285: 
                    286:            default:
                    287:                continue;
                    288: 
                    289:            case OK:
                    290:                break;
                    291:        }
                    292:        break;
                    293:     }
                    294:     if ((cc = dp - bp) > 0) {
                    295:        *base = bp, *len = cc;
                    296:        nbytes += cc;
                    297:     }
                    298: 
                    299:     return OK;
                    300: }
                    301: 
                    302: /*  */
                    303: 
                    304: /* ARGSUSED */
                    305: 
                    306: static int  uptrans (sd, type, addr, rti)
                    307: int    sd;
                    308: int    type;
                    309: caddr_t        addr;
                    310: struct RtSAPindication *rti;
                    311: {
                    312:     switch (type) {
                    313:        case SI_DATA:
                    314:            {
                    315:                register struct qbuf *qb = (struct qbuf *) addr;
                    316:                register struct qbuf *qp;
                    317: 
                    318:                for (qp = qb -> qb_forw; qp != qb; qp = qp -> qb_forw)
                    319:                    if (write (fd, qp -> qb_data, qp -> qb_len) !=qp -> qb_len)
                    320:                        return rtsaplose (rti, RTS_TRANSFER, "failed","write");
                    321:                    else
                    322:                        nbytes += qp -> qb_len;
                    323:            }
                    324:            break;
                    325: 
                    326:        case SI_SYNC:
                    327:            {
                    328: #ifdef DEBUG
                    329:                register struct SSAPsync *sn = (struct SSAPsync *) addr;
                    330: 
                    331:                advise (LLOG_DEBUG, NULLCP, "S-MINOR-SYNC.INDICATION: %ld",
                    332:                        sn -> sn_ssn);
                    333: #endif
                    334:            }
                    335:            break;
                    336: 
                    337:        case SI_ACTIVITY:
                    338:            {
                    339:                register struct SSAPactivity *sv = (struct SSAPactivity *)addr;
                    340: 
                    341:                switch (sv -> sv_type) {
                    342:                    case SV_START:
                    343: #ifdef DEBUG
                    344:                        advise (LLOG_DEBUG, NULLCP,
                    345:                                "S-ACTIVITY-START.INDICATION");
                    346: #endif
                    347:                        if ((fd = creat (destination, 0666)) == NOTOK) {
                    348:                            advise (LLOG_EXCEPTIONS, destination,
                    349:                                    "unable to create");
                    350:                            return rtsaplose (rti, RTS_TRANSFER, destination,
                    351:                                              "unable to create");
                    352:                        }
                    353:                        timer (nbytes = 0);
                    354:                        break;
                    355: 
                    356:                    case SV_INTRIND:
                    357:                    case SV_DISCIND:
                    358:                        advise (LLOG_EXCEPTIONS, NULLCP,
                    359:                                "activity %s: %s",
                    360:                                sv -> sv_type == SV_INTRIND ? "interrupted"
                    361:                                                            : "discarded",
                    362:                                SReportString (sv -> sv_reason));
                    363:                        if (unlink (destination) == NOTOK)
                    364:                            advise (LLOG_EXCEPTIONS, destination,
                    365:                                    "unable to unlink");
                    366:                        break;
                    367: 
                    368:                    case SV_ENDIND:
                    369: #ifdef DEBUG
                    370:                        advise (LLOG_DEBUG, NULLCP,
                    371:                                "S-ACTIVITY-END.INDICATION");
                    372: #endif
                    373:                        if (close (fd) == NOTOK)
                    374:                            return rtsaplose (rti, RTS_TRANSFER, destination,
                    375:                                              "close failed on");
                    376:                        break;
                    377: 
                    378:                    default:
                    379:                        return rtsaplose (rti, RTS_TRANSFER, NULLCP,
                    380:                                       "unexpected activity indication=0x%x",
                    381:                                       sv -> sv_type);
                    382:                }
                    383:            }
                    384:            break;
                    385: 
                    386:        case SI_REPORT:
                    387:            {
                    388:                register struct SSAPreport *sp = (struct SSAPreport *) addr;
                    389: 
                    390:                if (!sp -> sp_peer)
                    391:                    return rtsaplose (rti, RTS_TRANSFER, NULLCP,
                    392:                             "unexpected provider-initiated exception report");
                    393:                advise (LLOG_EXCEPTIONS, NULLCP,
                    394:                        "exception: %s", SReportString (sp -> sp_reason));
                    395:                if (unlink (destination) == NOTOK)
                    396:                    advise (LLOG_EXCEPTIONS, destination, "unable to unlink");
                    397:            }
                    398:            break;
                    399: 
                    400:        default:
                    401:            return rtsaplose (rti, RTS_TRANSFER, NULLCP,
                    402:                              "unknown uptrans type=0x%x", type);
                    403:     }
                    404: 
                    405:     return OK;
                    406: }
                    407: 
                    408: /*  */
                    409: 
                    410: static arginit (vec)
                    411: char  **vec;
                    412: {
                    413:     register char *ap;
                    414:     char    prompt[BUFSIZ];
                    415: 
                    416:     if (myname = rindex (*vec, '/'))
                    417:        myname++;
                    418:     if (myname == NULL || *myname == NULL)
                    419:        myname = *vec;
                    420:     if (strcmp (myname, "rtf") && strcmp (myname, "xrtf"))
                    421:        host = myname, myname = "rtf";
                    422: 
                    423:     isodetailor (myname, 1);
                    424: 
                    425:     ll_hdinit (pgm_log, myname);
                    426:     pgm_log -> ll_stat |= LLOGTTY;
                    427: 
                    428:     for (vec++; ap = *vec; vec++) {
                    429:        if (*ap == '-')
                    430:            switch (*++ap) {
                    431:                case 'l':
                    432:                    if ((user = *++vec) == NULL || *user == '-')
                    433:                        adios (NULLCP, "usage: %s -l username", myname);
                    434:                    continue;
                    435: 
                    436:                default:
                    437:                    adios (NULLCP, "-%s: unknown switch", ap);
                    438:            }
                    439: 
                    440:        if (host == NULL)
                    441:            host = ap;
                    442:        else
                    443:            if (turn == NOTOK) {
                    444:                if (strcmp (ap, "get") == 0)
                    445:                    turn = RTS_RESPONDER;
                    446:                else
                    447:                    if (strcmp (ap, "put") == 0)
                    448:                        turn = RTS_INITIATOR;
                    449:                    else
                    450:                        goto usage;
                    451:            }
                    452:            else
                    453:                if (source == NULL)
                    454:                    source = ap;
                    455:                else
                    456:                    if (destination == NULL)
                    457:                        destination = ap;
                    458:                else {
                    459: usage: ;
                    460:                    adios (NULLCP,
                    461:                           "usage: %s host [get|put] source destination",
                    462:                           myname);
                    463:                }
                    464:     }
                    465: 
                    466:     if (destination == NULL)
                    467:        goto usage;
                    468: 
                    469:     if (user == NULL && (user = getenv ("USER")) == NULL)
                    470:        user = getenv ("LOGNAME");
                    471:     if (strcmp (user, "anon") == 0)
                    472:        user = "ANON";
                    473:        
                    474:     if (password == NULL) {
                    475:        if (strcmp (user, "ANON")) {
                    476:            (void) sprintf (prompt, "password (%s:%s): ", host, user);
                    477:            password = getpassword (prompt);
                    478:        }
                    479:        else
                    480:            password = user ? user : "";
                    481:     }
                    482: }

unix.superglobalmegacorp.com

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