Annotation of 43BSD/contrib/xns/xnslib/sppclose.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Routines for closing an SPP connection
                      3:  */
                      4: 
                      5: /*
                      6:  $Log: sppclose.c,v $
                      7:  * Revision 2.0  85/11/21  07:22:21  jqj
                      8:  * 4.3BSD standard release
                      9:  * 
                     10:  * Revision 1.3  85/03/11  16:37:50  jqj
                     11:  * *** empty log message ***
                     12:  * 
                     13:  * Revision 1.3  85/03/11  16:37:50  jqj
                     14:  * Public alpha-test version, released 11 March 1985
                     15:  * 
                     16:  * Revision 1.2  85/01/27  07:37:52  jqj
                     17:  * finished but undebugged version
                     18:  * 
                     19:  */
                     20: 
                     21: #ifndef lint
                     22: static char rcsid[] = "$Header: sppclose.c,v 2.0 85/11/21 07:22:21 jqj Exp $";
                     23: #endif
                     24: 
                     25: /* #include <stdio.h> */
                     26: #include <sys/types.h>         /* for ns.h */
                     27: #include <sys/socket.h>
                     28: #include <sys/time.h>
                     29: #include <netns/ns.h>          /* for misc. constants */
                     30: #include <netns/sp.h>          /* for spphdr */
                     31: #include "courier.h"
                     32: 
                     33: #ifndef SPPMAXDATA
                     34: #define SPPMAXDATA 534
                     35: #endif
                     36: 
                     37: #ifndef TRUE
                     38: #define TRUE (1)
                     39: #define FALSE (0)
                     40: #define NULL ((char*)0)
                     41: #endif
                     42: 
                     43: int
                     44: sppclose(s)
                     45: /* try to close an SPP connection by sending an END packet. */
                     46: /* return TRUE on normal close, FALSE on abnormal close */
                     47:        int s;
                     48: {
                     49:        int fdmask;
                     50:        static struct timeval timeout = {15,0};
                     51:        struct {
                     52:                struct sphdr hdr;
                     53:                char data[SPPMAXDATA];
                     54:        } packbuf;
                     55: 
                     56:                /* streamtype=254, EOM=FALSE, Attn=FALSE */
                     57:        packbuf.hdr.sp_dt = SPPSST_END;
                     58:        packbuf.hdr.sp_cc = 0;
                     59:        fdmask = 1<<s;
                     60:        if (write(s, &packbuf, sizeof(packbuf.hdr)) >= 0
                     61:            && select(s+1,&fdmask,(int*)NULL,(int*)NULL,&timeout) > 0
                     62:            && read(s,(char*)&packbuf,sizeof(packbuf)) > 0) {
                     63:                if (packbuf.hdr.sp_dt == SPPSST_ENDREPLY) {
                     64:                        /* normal close */
                     65:                        /* SetSPPoptions(s, SPPSST_ENDREPLY, 0, 0);
                     66:                                /* streamtype=255, EOM=FALSE, Attn=FALSE */
                     67:                        packbuf.hdr.sp_dt = SPPSST_ENDREPLY;
                     68:                        packbuf.hdr.sp_cc = 0;
                     69:                        if (write(s, &packbuf, sizeof(packbuf.hdr)) >= 0
                     70:                            && shutdown(s,0) >= 0) {
                     71:                                /* don't read any more, but */
                     72:                                /*  try to get ENDREPLY out */
                     73:                                (void) close(s);
                     74:                                return(TRUE);
                     75:                        }
                     76:                        /* fall out of if to abnormal close */
                     77:                }
                     78:                else if (packbuf.hdr.sp_dt == SPPSST_END) {
                     79:                        /* simultaneous close */
                     80:                        return(sppclosereply(s));
                     81:                }
                     82:                /* else must have been a data packet -- abnormal close */
                     83:                /* fall through */
                     84:        }
                     85:        /* timer expired, data packet arrived, or write failed */
                     86:        (void) shutdown(s,2);           /* throw away all data */
                     87:        (void) close(s);
                     88:        return(FALSE);
                     89: }
                     90: 
                     91: int
                     92: sppclosereply(s)
                     93: /* handle receipt of a packet of type END, by closing down the SPP
                     94:  * connection.  Returns TRUE on normal close, FALSE otherwise.
                     95:  */
                     96:        int s;          /* spp socket */
                     97: {
                     98:        int fdmask;
                     99:        static struct timeval timeout = {10,0};
                    100:        struct {
                    101:                struct sphdr hdr;
                    102:                char data[SPPMAXDATA];
                    103:        } packbuf;
                    104: 
                    105:        fdmask = 1<<s;
                    106:        /* SetSPPoptions(s, SPPSST_ENDREPLY, 0, 0);
                    107:                /* streamtype=255, EOM=FALSE, Attn=FALSE */
                    108:        packbuf.hdr.sp_dt = SPPSST_ENDREPLY;
                    109:        packbuf.hdr.sp_cc = 0;
                    110:        if (write(s, &packbuf, sizeof(packbuf.hdr))
                    111:            && select(s+1, &fdmask, (int*)NULL, (int*)NULL, &timeout) > 0
                    112:            && read(s, (char*)&packbuf, sizeof(packbuf)) > 0
                    113:            && shutdown(s,2) == 0) {
                    114:                close(s);
                    115:                return(packbuf.hdr.sp_dt == SPPSST_ENDREPLY);
                    116:        }
                    117:        /* write failed, timeout expired, or error occured */
                    118:        (void) shutdown(s,2);   /* throw away any data */
                    119:        (void) close(s);
                    120:        return(FALSE);
                    121: }

unix.superglobalmegacorp.com

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