Home | History | Annotate | Download | only in shmt
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2002
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /* 12/20/2002   Port to LTP     robbiew (at) us.ibm.com */
     21 /* 06/30/2001	Port to Linux	nsharoff (at) us.ibm.com */
     22 
     23 /*
     24  * NAME
     25  *	shmt3
     26  *
     27  * CALLS
     28  *	shmctl(2) shmget(2) shmat(2)
     29  *
     30  * ALGORITHM
     31  * Create one shared memory segment and attach it twice to the same process,
     32  * at an address that is chosen by the system. After the first attach has
     33  * completed, write to it and then do the second attach.
     34  * Verify that the doubly attached segment contains the same data.
     35  *
     36  */
     37 
     38 #include <stdio.h>
     39 #include <sys/types.h>
     40 #include <sys/ipc.h>
     41 #include <sys/shm.h>
     42 #include <errno.h>
     43 
     44 /** LTP Port **/
     45 #include "test.h"
     46 
     47 char *TCID = "shmt03";		/* Test program identifier.    */
     48 int TST_TOTAL = 4;		/* Total number of test cases. */
     49 /**************/
     50 
     51 #define		K_1 		1024
     52 #define 	SUCCESSFUL	 1
     53 
     54 int first_attach, second_attach;
     55 static int rm_shm(int);
     56 
     57 int main(void)
     58 {
     59 	char *cp1, *cp2;
     60 	int shmid;
     61 	key_t key;
     62 
     63 	key = (key_t) getpid();
     64 	errno = 0;
     65 
     66 /*------------------------------------------------------------*/
     67 
     68 	if ((shmid = shmget(key, 16 * K_1, IPC_CREAT | 0666)) < 0) {
     69 		perror("shmget");
     70 		tst_brkm(TFAIL, NULL,
     71 			 "shmget Failed: shmid = %d, errno = %d\n",
     72 			 shmid, errno);
     73 	}
     74 
     75 	tst_resm(TPASS, "shmget");
     76 
     77 /*------------------------------------------------------------*/
     78 
     79 	if ((cp1 = shmat(shmid, NULL, 0)) == (char *)-1) {
     80 		perror("shmat");
     81 		tst_resm(TFAIL, "shmat Failed: shmid = %d, errno = %d\n",
     82 			 shmid, errno);
     83 	} else {
     84 		*cp1 = '1';
     85 		*(cp1 + 5 * K_1) = '2';
     86 		first_attach = SUCCESSFUL;
     87 	}
     88 
     89 	tst_resm(TPASS, "1st shmat");
     90 
     91 /*------------------------------------------------------------*/
     92 
     93 	if ((cp2 = shmat(shmid, NULL, 0)) == (char *)-1) {
     94 		perror("shmat");
     95 		tst_resm(TFAIL, "shmat Failed: shmid = %d, errno = %d\n",
     96 			 shmid, errno);
     97 	} else {
     98 		second_attach = SUCCESSFUL;
     99 		if ((*cp2 != '1' || *(cp2 + 5 * K_1) != '2') &&
    100 		    first_attach == SUCCESSFUL) {
    101 			tst_resm(TFAIL, "Error: Shared memory contents\n");
    102 		}
    103 	}
    104 
    105 	tst_resm(TPASS, "2nd shmat");
    106 
    107 /*---------------------------------------------------------------*/
    108 
    109 	rm_shm(shmid);
    110 
    111 	if (first_attach && second_attach) {
    112 		if (*cp2 != '1' || *(cp2 + 5 * K_1) != '2' ||
    113 		    *cp1 != '1' || *(cp1 + 5 * K_1) != '2') {
    114 			tst_resm(TFAIL, "Error: Shared memory contents\n");
    115 		}
    116 	}
    117 
    118 	tst_resm(TPASS, "Correct shared memory contents");
    119 /*-----------------------------------------------------------------*/
    120 	tst_exit();
    121 }
    122 
    123 static int rm_shm(int shmid)
    124 {
    125 	if (shmctl(shmid, IPC_RMID, NULL) == -1) {
    126 		perror("shmctl");
    127 		tst_brkm(TFAIL,
    128 			 NULL,
    129 			 "shmctl Failed to remove: shmid = %d, errno = %d\n",
    130 			 shmid, errno);
    131 	}
    132 	return (0);
    133 }
    134