Add safe connect, fix possible seg fault in RTC
[ric-plt/lib/rmr.git] / src / rmr / si / src / si95 / sishutdown.c
index c76bc94..4ff1e8f 100644 (file)
 ******************************************************************************
 *
 *  Mnemonic: SIshutdown
-*  Abstract: This routine will ensure that all tp blocks have been closed
-*            with the transport provider and removed from the list. The
-*            shutdown flag is set in addition.
-*  Parms:    gptr - pointer to the ginfo structure (SIHANDLE)
-*  Retrns:   Nothing.
+*  Abstract: Shutdown and abort functions.
+*
 *  Date:     23 March 1995
 *  Author:   E. Scott Daniels
 *
 *****************************************************************************
 */
-#include "sisetup.h"                   //  get includes and defines 
+#include "sisetup.h"                   //  get includes and defines
+
+/*
+*/
+static void sishutdown( struct ginfo_blk *gptr, int flags ) {
+       struct tp_blk*  tpb;
 
-extern void SIshutdown( struct ginfo_blk *gptr ) {
        if( gptr != NULL && gptr->magicnum == MAGICNUM )
        {
-               gptr->flags |=  GIF_SHUTDOWN;    //  signal shutdown 
-               while( gptr->tplist != NULL )
+               gptr->flags |=  GIF_SHUTDOWN;    //  signal shutdown
+               for( tpb = gptr->tplist; tpb != NULL; tpb = tpb->next )
                {
-                       gptr->tplist->flags |= TPF_UNBIND;    //  force unbind on session 
-                       SIterm( gptr, gptr->tplist );         //  and drop the session 
+                       tpb->flags |= (TPF_UNBIND | flags);    //  force unbind on session  and set caller flags
+                       SIterm( gptr, tpb );                                    // term marks ok to delete but does NOT remove it
                }
        }
-}            
+}
+
+/*
+       Run the list of known transport sessions and close them gracefully. This
+       will result in time-waits which might prevent the application from
+       restarting immediately as the listen port(s) might not be usable.
+*/
+extern void SIshutdown( struct ginfo_blk *gptr ) {
+       sishutdown( gptr, 0 );
+}
+
+/*
+       Run the list of known transport sessions and close them by aborting
+       (resetting the connection). This can result in buffered, but untransmitted,
+       data from being lost; the risk should be known by the caller.
+*/
+extern void SIabort( struct ginfo_blk *gptr ) {
+       sishutdown( gptr, TPF_ABORT );
+}