Annotation of researchv9/jerq/sgs/libsdp/disconnect.c, revision 1.1.1.1

1.1       root        1: static char ID[] = "@(#) disconnect.c: 1.2 12/8/82";
                      2: #include <stdio.h>
                      3: #include "sdp.h"
                      4: #include "define3.h"
                      5: 
                      6: #ifdef SHORT
                      7: #define DI01   "DI01 "
                      8: #define DI02   "DI02 "
                      9: #define DI03   "DI03 "
                     10: #define DI04   "DI04 "
                     11: #define DI05   "DI05 "
                     12: #define DI06   "DI06 "
                     13: #define DIAU   "DIAU "
                     14: #else
                     15: #define DI01   "DI01 -- space to be disconnected has item in use\n%o\n",sp
                     16: #define DI02   "DI02 -- permission conflict\n%d\t%d\t%d\n",sp->perms,j,manager[j].ref_chng
                     17: #define DI03   "DI03 -- error return from writeframe\n%o\n",sp
                     18: #define DI04   "DI04 -- fail to close open file\n%o\n",sp
                     19: #define DI05   "DI05 -- error return from wrtSPACE\n%o\n",sp
                     20: #define DI06   "DI06 -- space not connected\n%o\n",sp
                     21: #define DIAU   "%s","DIAU -- audit failed in sdp_disconnect\n"
                     22: #endif
                     23: 
                     24: #ifdef SWEET
                     25: #define PROLOG
                     26: #define EPILOG
                     27: #else
                     28: #define PROLOG         if( (aud_flag == AUDITON) && (aud_check() == ERROR) )\
                     29:                                ERR_RET(DIAU,ERROR)
                     30: #define EPILOG         if(aud_flag == AUDITON)\
                     31:                                aud_set() ;\
                     32:                        if(hist_fp != NULL)\
                     33:                                fprintf(hist_fp,"DI\t%o\n",sp) ;
                     34: #endif
                     35: 
                     36: extern int aud_flag ;
                     37: extern struct LIBFILE *Glib_file ;
                     38: extern FILE *hist_fp ;
                     39: extern struct SPACE *first_space ;
                     40: 
                     41: extern aud_set() ;
                     42: extern int aud_check() ;
                     43: extern FATAL() ;
                     44: extern rem_frame() ;
                     45: extern writeframe() ;
                     46: extern int     wtSPACE() ;
                     47: extern         freeSPACE() ;
                     48: 
                     49: int                                    /* SUCCESS or ERROR */
                     50: sdp_disconnect(sp)
                     51: struct SPACE   *sp ;
                     52: {
                     53:        register int            j ;
                     54:        register int            k ;
                     55:        register struct MANAGER *manager ;
                     56:        register struct SPACE   *curr ;
                     57:        register struct SPACE   *next ;
                     58:        register struct SPACE   *prev ;
                     59: 
                     60:        PROLOG
                     61:        prev = NULL ;
                     62:        for(curr=first_space; curr!=NULL; curr=next)
                     63:        {
                     64:                next = curr->next_space ;
                     65: 
                     66:                if( (sp==curr) || (sp==NULL) )
                     67:                {
                     68:                        Glib_file = curr->lib_file ;
                     69: 
                     70:                        manager = (curr->environ)->manp ;
                     71:                        for(j=0; j<(curr->environ)->num_frames; j++)
                     72:                                if(manager[j].space == curr)
                     73:                                {
                     74:                                        if(manager[j].usecount != 0)
                     75:                                                ERR_RET(DI01,ERROR)
                     76: 
                     77:                                        if(manager[j].ref_chng == WRTN)
                     78:                                                if(curr->perms != WRTN)
                     79:                                                        ERR_RET(DI02,ERROR)
                     80:                                                else
                     81:                                                        if(writeframe(curr,j) == ERROR)
                     82:                                                                ERR_RET(DI03,ERROR)
                     83:                                        manager[j].space    = NULL ;
                     84:                                        manager[j].page_id  = IDNULL ;
                     85:                                        manager[j].ref_chng = RCNULL ;
                     86:                                        rem_frame(curr->environ,j) ;
                     87:                                        manager[j].forward = (curr->environ)->empties ;
                     88:                                        (curr->environ)->empties = j ;
                     89:                                }
                     90: 
                     91:                        for(k=0; k<curr->numbfile; k++)
                     92:                                switch(curr->fileinfo[k].desc)
                     93:                                {
                     94:                                        case CLOSED:
                     95:                                        case NOTMADE:
                     96:                                                break ;
                     97: 
                     98:                                        default:
                     99:                                                if(MCLOSE(curr->fileinfo[k].desc) == ERROR)
                    100:                                                        ERR_RET(DI04,ERROR)
                    101:                                                curr->fileinfo[k].desc = CLOSED ;
                    102:                                }
                    103: 
                    104:                        (curr->environ)->cnct_count-- ;
                    105:                        if( (curr->perms == WRTN)  &&  (wtSPACE(curr) == ERROR) )
                    106:                                ERR_RET(DI05,ERROR)
                    107: 
                    108:                        freeSPACE(curr) ;
                    109: 
                    110:                        if(prev == NULL)
                    111:                                first_space = next ;
                    112:                        else
                    113:                                prev->next_space = next ;
                    114:                        if(sp == curr)
                    115:                                break ;
                    116:                }
                    117:                else
                    118:                        prev = curr ;
                    119: 
                    120:        }
                    121: 
                    122:        if( (curr==NULL) && (sp!=NULL) )
                    123:                ERR_RET(DI06,ERROR)
                    124: 
                    125:        EPILOG
                    126:        return(SUCCESS) ;
                    127: }

unix.superglobalmegacorp.com

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