Annotation of 43BSDReno/contrib/isode-beta/others/pingpong/pingpong.c, revision 1.1

1.1     ! root        1: /* pingpong.c - listen and call out at the same time */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/others/pingpong/RCS/pingpong.c,v 7.0 89/11/23 22:01:11 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/others/pingpong/RCS/pingpong.c,v 7.0 89/11/23 22:01:11 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       pingpong.c,v $
        !            12:  * Revision 7.0  89/11/23  22:01:11  mrose
        !            13:  * Release 6.0
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *                               NOTICE
        !            19:  *
        !            20:  *    Acquisition, use, and distribution of this module and related
        !            21:  *    materials are subject to the restrictions of a license agreement.
        !            22:  *    Consult the Preface in the User's Manual for the full terms of
        !            23:  *    this agreement.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: #include <stdio.h>
        !            28: #include <isode/isoaddrs.h>
        !            29: #include <isode/tsap.h>
        !            30: 
        !            31: struct PSAPaddr * pingaddr;
        !            32: struct PSAPaddr * pongaddr;
        !            33: int cn_state = NOTOK;
        !            34: int cn_sd = NOTOK;
        !            35: 
        !            36: fd_set wfds, rfds;
        !            37: int    nfds = 0;
        !            38: int    doneit = 0;
        !            39: int    retry = 1;
        !            40: 
        !            41: main (argc,argv)
        !            42: int argc;
        !            43: char ** argv;
        !            44: {
        !            45: 
        !            46:        do_args (argc,argv);
        !            47: 
        !            48:        start_listener ();
        !            49: 
        !            50:        printf ("Started to listen\n");
        !            51: 
        !            52:        ping_address ();
        !            53: 
        !            54:        wait_for_result ();
        !            55: 
        !            56:        printf ("Got Result\n");
        !            57: 
        !            58:        stop_nicely ();
        !            59: }
        !            60: 
        !            61: do_args (argc,argv)
        !            62: int argc;
        !            63: char ** argv;
        !            64: {
        !            65:        char * myname;
        !            66: 
        !            67:        if (myname = rindex (argv[0], '/'))
        !            68:                myname++;
        !            69:        if (myname == NULL || *myname == NULL)
        !            70:                myname = argv[0];
        !            71: 
        !            72:        if (argc != 3) {
        !            73:                (void) fprintf (stderr,"Usage pingpong listen_address call_address\n");
        !            74:                exit (-1);
        !            75:        }
        !            76: 
        !            77:        isodetailor (myname, 0);
        !            78: 
        !            79:        if ((pongaddr = str2paddr (argv[1])) == NULLPA) {
        !            80:                (void) fprintf (stderr,"Invalid listen address %s\n", argv[1]);
        !            81:                exit (-1);
        !            82:        }
        !            83: 
        !            84:        if ((pingaddr = str2paddr (argv[2])) == NULLPA) {
        !            85:                (void) fprintf (stderr,"Invalid call address %s\n", argv[2]);
        !            86:                exit (-1);
        !            87:        }
        !            88: }
        !            89: 
        !            90: 
        !            91: start_listener ()
        !            92: {
        !            93:        struct TSAPdisconnect     td_s;
        !            94:        struct TSAPdisconnect   * td = &(td_s);
        !            95: 
        !            96:        if(TNetListen(&pongaddr->pa_addr.sa_addr, td) == NOTOK) {
        !            97:                ts_advise ("TNetListen", td);
        !            98:                exit (-2);
        !            99:        }
        !           100: }
        !           101: 
        !           102: ping_address ()
        !           103: {
        !           104:        struct TSAPstart tss;
        !           105:        register struct TSAPstart *ts = &tss;
        !           106:        struct TSAPdisconnect   tds;
        !           107:        register struct TSAPdisconnect  *td = &tds;
        !           108:        struct TSAPconnect tcs;
        !           109:        struct TSAPconnect *tc = &tcs;
        !           110: 
        !           111:        cn_state = TAsynConnRequest (NULLTA, &pingaddr->pa_addr.sa_addr, 0,
        !           112:                                     NULLCP, ts -> ts_cc, &ts -> ts_qos,
        !           113:                                     tc, td, 1);
        !           114: 
        !           115:        cn_sd = tc -> tc_sd;
        !           116:        printf ("Starting ping on %d state ", cn_sd);
        !           117:        updatemask ();
        !           118:        if (cn_state == NOTOK)
        !           119:                ts_advise ("TAsynConnRequest", td);
        !           120:        else
        !           121:                retry = 0;
        !           122: }
        !           123: 
        !           124: 
        !           125: wait_for_result ()
        !           126: {
        !           127:        int     vecp = 0;
        !           128:        char    *vec[4];
        !           129:        int     i;
        !           130:        struct TSAPdisconnect   td_s;
        !           131:        struct TSAPdisconnect   *td = &td_s;
        !           132:        struct TSAPconnect tcs;
        !           133:        struct TSAPconnect *tc = &tcs;
        !           134:        struct TSAPstart tss;
        !           135:        struct TSAPstart *ts = &tss;
        !           136:        fd_set ifds, ofds;
        !           137: 
        !           138:        for (;;) {
        !           139: 
        !           140:                ifds = rfds;
        !           141:                ofds = wfds;
        !           142:                printf ("TNetAccept nfds=%d rfds=0x%x wfds=0x%x\n", nfds,
        !           143:                        rfds.fds_bits[0], wfds.fds_bits[0]);
        !           144:                if(TNetAccept(&vecp, vec, nfds, &ifds, &ofds, NULLFD,
        !           145:                              NOTOK, td) == NOTOK)
        !           146:                {
        !           147:                        ts_advise ("TNetAccept failed", td);
        !           148:                        exit (-3);
        !           149:                }
        !           150:                if (retry)
        !           151:                        ping_address ();
        !           152: 
        !           153:                if (vecp > 0) {
        !           154:                        if (TInit (vecp, vec, ts, td) == NOTOK) {
        !           155:                                ts_advise ("TInit failed failed", td);
        !           156:                                exit (-1);
        !           157:                        }
        !           158:                        if (TConnResponse (ts->ts_sd, NULLTA, 0, NULLCP, 0,
        !           159:                                           &tc -> tc_qos, td) == NOTOK) {
        !           160:                                ts_advise ("TConnResponse", td);
        !           161:                                exit (-1);
        !           162:                        }
        !           163:                        printf ("Connection accepted on %d\n", ts -> ts_sd);
        !           164:                        FD_SET (ts -> ts_sd, &rfds);
        !           165:                        if (ts -> ts_sd >= nfds)
        !           166:                                nfds = ts -> ts_sd + 1;
        !           167:                }
        !           168: 
        !           169:                for (i = 0; i < nfds; i++) {
        !           170:                        if (FD_ISSET (i, &ofds) || FD_ISSET (i, &ifds)) {
        !           171:                                if (i == cn_sd)
        !           172:                                        progress_connection ();
        !           173:                                else {
        !           174:                                        if (sink_data (i) != OK) {
        !           175:                                                FD_CLR (i, &rfds);
        !           176:                                                if (doneit ++ > 0)
        !           177:                                                        return;
        !           178:                                        }
        !           179:                                        
        !           180:                                }
        !           181:                        }
        !           182:                }
        !           183:                if (cn_state == DONE) {
        !           184:                        if (doneit ++ > 0)
        !           185:                                return;
        !           186:                        cn_state = NOTOK;
        !           187:                }
        !           188:        }
        !           189: }
        !           190: 
        !           191: sink_data (sd)
        !           192: int    sd;
        !           193: {
        !           194:        struct TSAPdisconnect tds;
        !           195:        struct TSAPdisconnect *td = &tds;
        !           196:        struct TSAPdata txs, *tx = &txs;
        !           197:        
        !           198:        if (TReadRequest (sd, tx, OK, td) == NOTOK) {
        !           199:                if (td -> td_reason = DR_NORMAL)
        !           200:                        ts_advise ("Normal disconnection", td);
        !           201:                else    ts_advise ("TReadRequest", td);
        !           202:                return NOTOK;
        !           203:        }
        !           204:        TXFREE (tx);
        !           205:        return OK;
        !           206: }
        !           207: 
        !           208: progress_connection ()
        !           209: {                      
        !           210:        struct TSAPdisconnect   td_s;
        !           211:        struct TSAPdisconnect   *td = &td_s;
        !           212:        struct TSAPconnect tcs;
        !           213:        struct TSAPconnect *tc = &tcs;
        !           214: 
        !           215:        switch(cn_state)
        !           216:        {
        !           217:            case CONNECTING_1:
        !           218:                printf ("CONNECTING_1 -> ");
        !           219:                cn_state = TAsynRetryRequest(cn_sd,tc,td);
        !           220:                if (cn_state == NOTOK)
        !           221:                        ts_advise ("\nTAsynRetryRequest", td);
        !           222:                updatemask ();
        !           223:                break;
        !           224:            case CONNECTING_2:
        !           225:                printf ("CONNECTING_2 -> ");
        !           226:                cn_state = TAsynRetryRequest(cn_sd,tc,td);
        !           227:                if (cn_state == NOTOK)
        !           228:                        ts_advise ("\nTAsynRetryRequest", td);
        !           229:                updatemask();
        !           230:                break;
        !           231:            case NOTOK:
        !           232:                printf ("NOTOK\n");
        !           233:                updatemask ();
        !           234:                break;
        !           235:            case DONE:
        !           236:                printf ("DONE->");
        !           237:                updatemask ();
        !           238:                break;
        !           239:            default:
        !           240:                printf ("cn_state weird\n");
        !           241:                exit (-4);
        !           242:        }
        !           243: }
        !           244: 
        !           245: stop_nicely ()
        !           246: {
        !           247:        struct TSAPdisconnect     td_s;
        !           248:        struct TSAPdisconnect   * td = &(td_s);
        !           249: 
        !           250:        (void) TNetClose (&pongaddr->pa_addr.sa_addr, td);
        !           251: }
        !           252: 
        !           253: 
        !           254: updatemask ()
        !           255: {
        !           256:        struct TSAPdisconnect     td_s;
        !           257:        struct TSAPdisconnect   * td = &(td_s);
        !           258: 
        !           259:        if (cn_sd != NOTOK) {
        !           260:                FD_CLR (cn_sd, &rfds);
        !           261:                FD_CLR (cn_sd, &wfds);
        !           262:                if (cn_sd >= nfds)
        !           263:                        nfds = cn_sd + 1;
        !           264:        }
        !           265:        switch (cn_state) {
        !           266:            case NOTOK:
        !           267:                printf ("NOTOK\n");
        !           268:                break;
        !           269: 
        !           270:            default:
        !           271:                printf ("weird!\n");
        !           272:                break;
        !           273: 
        !           274:            case CONNECTING_1:
        !           275:                printf ("CONNECTING_1\n");
        !           276:                FD_SET (cn_sd, &wfds);
        !           277:                break;
        !           278: 
        !           279:            case CONNECTING_2:
        !           280:                printf ("CONNECTING_2\n");
        !           281:                FD_SET (cn_sd, &rfds);
        !           282:                break;
        !           283:            case DONE:
        !           284:                printf ("DONE\n");
        !           285:                (void) TDiscRequest (cn_sd, NULLCP, 0, td);
        !           286:                cn_sd = NOTOK;
        !           287:                printf ("Disconnect sent\n");
        !           288:                break;
        !           289:        }
        !           290: }
        !           291: 
        !           292: ts_advise (str, td)
        !           293: char   *str;
        !           294: struct TSAPdisconnect *td;
        !           295: {
        !           296:        if (td -> td_cc > 0)
        !           297:                printf ("%s : %s [%*.*s]\n", str, TErrString (td -> td_reason),
        !           298:                        td -> td_cc, td -> td_cc, td -> td_data);
        !           299:        else    printf ("%s : %s\n", str, TErrString (td -> td_reason));
        !           300: }
        !           301: 

unix.superglobalmegacorp.com

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