testipc.c (3721B)
1 // $Id$ 2 3 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // based on tests/testipc.cc by Jacques Gelinas 5 // 6 // This program is free software; you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation; either version 2, or (at your option) 9 // any later version. 10 // 11 // This program is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License 17 // along with this program; if not, write to the Free Software 18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 20 /* 21 Test to see isolation of the various IPC resources 22 between security context 23 */ 24 #include <stdio.h> 25 #include <string.h> 26 #include <errno.h> 27 #include <stdlib.h> 28 #include <sys/ipc.h> 29 #include <sys/shm.h> 30 #include <sys/sem.h> 31 32 int main (int argc, char *argv[]) 33 { 34 int ret = -1; 35 if (argc < 2){ 36 fprintf (stderr, 37 "testipc createshm\n" 38 ); 39 }else if(strcmp(argv[1],"createshm")==0){ 40 int id = shmget (1,1024,IPC_CREAT|0666); 41 if (id == -1){ 42 fprintf (stderr,"shmget failed (%s)\n",strerror(errno)); 43 }else{ 44 void *pt = shmat (id,NULL,0); 45 printf ("shmget id %d\n",id); 46 if (pt == NULL){ 47 fprintf (stderr,"can't shmat to id %d (%s)\n",id,strerror(errno)); 48 }else{ 49 char tmp[100]; 50 int ok; 51 strcpy ((char*)pt,"original string"); 52 53 printf ("Letting a sub-program attach to this memory\n"); 54 sprintf (tmp,"./testipc accessshm %d",id); 55 ok = system (tmp); 56 printf ("\tSub-program returned %d\n",ok); 57 58 printf ("\tThe segment now hold :%s:\n",(char*)pt); 59 shmdt (pt); 60 61 printf ("A sub-program in another context can't attach\n"); 62 sprintf (tmp,"/usr/sbin/chcontext ./testipc accessshm %d",id); 63 ok = system (tmp); 64 printf ("\tSub-program returned %d\n",ok); 65 66 printf ("Executing a sub-shell\n"); 67 system ("/bin/sh"); 68 } 69 printf ("Delete the share memory segment\n"); 70 if (shmctl (id,IPC_RMID,NULL)==-1){ 71 fprintf (stderr,"shmctl failed (%s)\n",strerror(errno)); 72 }else{ 73 ret = 0; 74 } 75 } 76 }else if(strcmp(argv[1],"accessshm")==0){ 77 int id = atoi(argv[2]); 78 void *pt = shmat (id,NULL,0); 79 if (pt == (void*)-1){ 80 fprintf (stderr,"can't shmat to id %d (%s)\n",id,strerror(errno)); 81 }else{ 82 printf ("\tWriting hello in share memory\n"); 83 strcpy ((char*)pt,"hello"); 84 ret = 0; 85 } 86 }else if(strcmp(argv[1],"createsem")==0){ 87 int id = semget (1,1,IPC_CREAT|0666); 88 if (id == -1){ 89 fprintf (stderr,"semget failed (%s)\n",strerror(errno)); 90 }else{ 91 char tmp[100]; 92 int ok; 93 printf ("semget id %d\n",id); 94 95 printf ("Letting a sub-program play with this semaphore\n"); 96 sprintf (tmp,"./testipc accesssem %d",id); 97 ok = system (tmp); 98 printf ("\tSub-program returned %d\n",ok); 99 100 printf ("A sub-program in another context can't use the semaphore\n"); 101 sprintf (tmp,"/usr/sbin/chcontext ./testipc accesssem %d",id); 102 ok = system (tmp); 103 printf ("\tSub-program returned %d\n",ok); 104 105 printf ("Executing a sub-shell\n"); 106 system ("/bin/sh"); 107 108 printf ("Delete the semaphore\n"); 109 if (semctl (id,0,IPC_RMID,NULL)==-1){ 110 fprintf (stderr,"semctl failed (%s)\n",strerror(errno)); 111 }else{ 112 ret = 0; 113 } 114 } 115 }else if(strcmp(argv[1],"accesssem")==0){ 116 int id = atoi(argv[2]); 117 struct sembuf ops[]={ 118 {0,0,0} 119 }; 120 if (semop (id,ops,1) == -1){ 121 fprintf (stderr,"can't semop with id %d (%s)\n",id,strerror(errno)); 122 }else{ 123 ret = 0; 124 } 125 } 126 return ret; 127 } 128 129