int shmdt(const void *shmaddr){ pte_t *pte; uint numOfPages; pte = walkpgdir(proc->pgdir, (char*)shmaddr, 0); acquire(&shmtable.lock); int shmid = find_key(shmaddr); shmtable.shmarray[shmid].linkcounter--; numOfPages = shmtable.shmarray[shmid].pages_amount; void *shmaddr2 = (void*)shmaddr; for(; shmaddr2 < shmaddr + numOfPages*PGSIZE; shmaddr2 += PGSIZE) { pte = walkpgdir(proc->pgdir, (char*)shmaddr2, 0); if(!pte) shmaddr2 += (NPTENTRIES - 1) * PGSIZE; *pte = 0; } if(!shmtable.shmarray[shmid].linkcounter){ shmtable.shmarray[shmid].shmstate = UNLINKED; cprintf("freeing all the memory\n"); shmdel(shmid); } release(&shmtable.lock); return 0; }
void sig_term ( int sno ) { printf ( "Removing Public Shared memory\n" ) ; semdel ( p_semid ) ; shmdel ( p_shmid ) ; delc__semshm ( ) ; exit ( errno ) ; }
void delc__semshm( ) { Position Pos, TmpPos ; Pos = L_Client->Next ; while ( Pos != NULL ) { semdel ( Pos->Element->c_semid ) ; shmdel ( Pos->Element->c_shmid ) ; Pos = Pos->Next ; } DeleteList ( L_Client ) ; }
main ( int argc, char **argv) { struct sockaddr_in sa; struct sockaddr_in caller; int ssd, csd, length, flag = 1 ; char cnt_name[ 20 ] ; int i, n, key, savesig ; pid_t pid, loop_pid ; struct client_ds *c_data ; struct sigaction usr2act ; sigset_t usr2mask, savemask, zeromask ; if ( argc != 2 ) err_quit ( "Usage: %s <port>", argv[0] ) ; if ( signal ( SIGUSR1, SIG_IGN ) == SIG_ERR ) err_sys ( "signal error" ) ; if ( signal ( SIGINT, sig_term ) == SIG_ERR ) err_sys ( "signal error" ) ; usr2act.sa_handler = sigusr2 ; usr2act.sa_flags = SA_NOMASK ; if ( sigaction ( SIGUSR2, &usr2act, NULL ) == -1 ) err_sys ( "sigaction error" ) ; sigemptyset ( &zeromask ) ; sigemptyset ( &usr2mask ) ; sigaddset ( &usr2mask, SIGUSR2 ) ; atexit ( end_func ) ; key = p_key = atoi(argv[1]) ; sa.sin_family= AF_INET; sa.sin_addr.s_addr = INADDR_ANY; sa.sin_port= htons((u_short)atoi(argv[1])) ; if ((ssd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_sys ("socket error"); if (bind(ssd, (struct sockaddr *)&sa, sizeof sa) < 0) err_sys ("bind error"); if ( ( p_semid = semget ( p_key, 1, IPC_CREAT | 0700 ) ) == -1 ) err_sys ( "semget error" ) ; init ( p_semid, 0 ) ; if ( ( p_shmid = shmget ( p_key, 8192, IPC_CREAT | 0700 ) ) == -1 ) err_sys ( "shmget" ) ; write_shm ( p_semid, p_shmid, "No Data" ) ; if ( listen (ssd, MAXCLIENT) ) err_quit ( "listen error" ) ; length = sizeof(sa); L_Client = MakeEmpty ( L_Client ) ; i = 0 ; while ( flag ) { sigsetjmp ( s_env, savesig ) ; printf ( "Waiting for Connection...\n" ) ; if ((csd = accept(ssd, (struct sockaddr *)&caller, &length)) < 0) err_sys ( "acccept" ) ; if ( sigprocmask ( SIG_BLOCK, &usr2mask, &savemask ) < 0 ) err_quit ( "sigprocmask error" ) ; if ( c_count == MAXCLIENT ) { send ( csd, "server is too busy!!!\n", 23, MSG_DONTWAIT ) ; if ( sigprocmask ( SIG_SETMASK, &savemask, NULL ) < 0 ) err_quit ( "sigprocmask error" ) ; close( csd ) ; siglongjmp ( s_env, 0 ) ; } c_data = malloc ( sizeof ( struct client_ds ) ) ; if ( ( n = recv ( csd, cnt_name, sizeof(cnt_name), 0 ) ) < 0 ) err_sys ( "read error" ) ; if ( cnt_name[ n-1 ] == '\n' ) cnt_name[ n-1 ] = 0 ; cnt_name[ n ] = 0 ; strcpy ( c_data->c_name, cnt_name ) ; if ( ( c_data->c_semid = semget ( ++key, 1, IPC_CREAT | 0700 ) ) == -1 ) err_sys ( "semget error" ) ; init ( c_data->c_semid, 0 ) ; if ( ( c_data->c_shmid = shmget ( key, 8192, IPC_CREAT | 0700 ) ) == -1 ) err_sys ( "shmget" ) ; write_shm ( c_data->c_semid, c_data->c_shmid, "No Data" ) ; c_data->c_fd = csd ; c_data->c_pid = 0 ; printf ( "Client is connected %d\n", csd ) ; if ( ( pid = fork ( ) ) == -1 ) err_sys ( "fork error" ) ; else if ( pid == 0 ) { close( ssd ) ; if ( handle_client ( c_data ) != 0 ) err_sys ( "error handling client" ) ; printf ( "Exiting\n" ) ; exit ( 0 ) ; } c_data->c_pid = pid ; if ( waitpid ( pid, NULL, WNOHANG ) == -1 ) err_sys ( "waitpid error" ); Insert ( c_data, L_Client, L_Client ) ; c_count++ ; if ( sigprocmask ( SIG_SETMASK, &savemask, NULL ) < 0 ) err_quit ( "sigprocmask error" ) ; } close(ssd); printf ( "Removing Public Shared memory\n" ) ; semdel ( p_semid ) ; shmdel ( p_shmid ) ; exit(0); }
void send_private( int sno ) { int i ; Position Pos, TmpPos; char touser[ NAMSIZ ], Buf[ MAXBUF ], Tmp[ MAXBUF ] ; Pos = L_Client->Next ; while ( Pos != NULL ) { if (sempid(Pos->Element->c_semid, 0)==Pos->Element->c_pid) { read_shm ( Pos->Element->c_semid, Pos->Element->c_shmid, Buf ) ; printf ( "Message Got :%s:\n", Buf ) ; if ( strcmp ( Buf, "Quit" ) == 0 ) { write_shm ( Pos->Element->c_semid, Pos->Element->c_shmid, "Finished" ) ; if ( waitpid ( Pos->Element->c_pid, NULL, 0 ) == -1 ) err_sys ( "waitpid error" ) ; semdel ( Pos->Element->c_semid ) ; shmdel ( Pos->Element->c_shmid ) ; close ( Pos->Element->c_fd ) ; printf ( "Removing the user from List >>%s<<\n", Pos->Element->c_name ) ; Delete ( Pos->Element->c_name, L_Client ) ; c_count-- ; printf ( "Client Process Removed\n" ) ; return ; } else if ( strcmp ( Buf, "list" ) == 0 ) { printf ( "Got Message from %s To List Users\n", Pos->Element->c_name ) ; TmpPos = L_Client->Next ; while ( TmpPos != NULL ) { sprintf ( Tmp, "%s\n", TmpPos->Element->c_name ) ; send ( Pos->Element->c_fd, Tmp, strlen ( Tmp ), MSG_DONTWAIT ) ; TmpPos = TmpPos->Next ; } send( Pos->Element->c_fd, prompt[0], strlen(prompt[0]), MSG_DONTWAIT); write_shm ( Pos->Element->c_semid, Pos->Element->c_shmid, "No Data" ) ; return ; } else { touser[ 0 ] = '\0' ; for ( i = 1; Buf[ i ] != '>'; i++ ) touser[ i-1 ] = Buf[ i ]; touser[ i-1 ] = '\0' ; printf ( "Searching For User %s\n", touser ) ; TmpPos = Find ( touser, L_Client ) ; if ( TmpPos == NULL ) { printf ( "%s: User Not Available\n", touser ) ; sprintf ( Tmp, "%s: User Not Available\n>>", touser ) ; send ( Pos->Element->c_fd, Tmp, strlen ( Tmp ), MSG_DONTWAIT ) ; write_shm ( Pos->Element->c_semid, Pos->Element->c_shmid, "No Data" ) ; return ; } printf ( "%s: User Available\n", touser ) ; sprintf ( Tmp, "PRIVATE Message From %s: %s\n>>", Pos->Element->c_name, &Buf[ i+1 ] ) ; printf ( "PRIVATE Message From %s: %s\n", Pos->Element->c_name, &Buf[ i+1 ] ) ; send ( TmpPos->Element->c_fd, Tmp, strlen ( Tmp ), MSG_DONTWAIT ) ; sprintf ( Tmp, "Message Has been recevied by %s\n>>", touser ) ; printf ( "Message Has been recevied by %s\n", touser ) ; send ( Pos->Element->c_fd, Tmp, strlen ( Tmp ), MSG_DONTWAIT ) ; write_shm ( Pos->Element->c_semid, Pos->Element->c_shmid, "No Data" ) ; } } Pos = Pos->Next ; } }