Ejemplo n.º 1
0
Archivo: proc.c Proyecto: yonatana/OS
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; 
}
Ejemplo n.º 2
0
void sig_term ( int sno ) 
{
   printf ( "Removing Public Shared memory\n" ) ;
   semdel ( p_semid )  ;
   shmdel ( p_shmid ) ;
   delc__semshm ( ) ;

   exit ( errno ) ;
}
Ejemplo n.º 3
0
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 ) ;
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
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 ;
  }
}