robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 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 |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 18 | */ |
| 19 | |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 20 | /* 12/20/2002 Port to LTP robbiew@us.ibm.com */ |
| 21 | /* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 22 | |
| 23 | /* |
| 24 | * NAME |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 25 | * shmt02 |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 26 | * |
| 27 | * CALLS |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 28 | * shmctl(2) shmget(2) |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 29 | * |
| 30 | * ALGORITHM |
| 31 | * Create and attach a shared memory segment, write to it |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 32 | * and then remove it. Verify that the shared memory segment |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 33 | * is accessible as long as the process is still alive. |
| 34 | * |
| 35 | */ |
| 36 | |
| 37 | #include <stdio.h> |
| 38 | #include <sys/types.h> |
| 39 | #include <sys/ipc.h> |
| 40 | #include <sys/shm.h> |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 41 | #include <sys/utsname.h> |
robbiew | c0325f7 | 2003-02-10 18:46:26 +0000 | [diff] [blame] | 42 | #include <errno.h> |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 43 | |
| 44 | /** LTP Port **/ |
| 45 | #include "test.h" |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 46 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 47 | char *TCID = "shmt02"; /* Test program identifier. */ |
| 48 | int TST_TOTAL = 3; /* Total number of test cases. */ |
robbiew | 1b8d8e6 | 2003-03-20 15:21:48 +0000 | [diff] [blame] | 49 | |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 50 | /**************/ |
| 51 | |
| 52 | #define K_1 1024 |
| 53 | |
| 54 | int rm_shm(int); |
| 55 | |
| 56 | int main() |
| 57 | { |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 58 | register int shmid; |
| 59 | char *cp; |
| 60 | key_t key; |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 61 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 62 | errno = 0; |
| 63 | key = (key_t) getpid(); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 64 | |
| 65 | /*----------------------------------------------------------------*/ |
| 66 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 67 | if ((shmid = shmget(key, 16 * K_1, IPC_CREAT | 0666)) < 0) { |
| 68 | perror("shmget"); |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 69 | tst_brkm(TFAIL, NULL, |
| 70 | "shmget Failed: shmid = %d, errno = %d\n", |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 71 | shmid, errno); |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 72 | } |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 73 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 74 | tst_resm(TPASS, "shmget"); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 75 | |
| 76 | /*----------------------------------------------------------------*/ |
| 77 | |
Cyril Hrubis | d2db480 | 2014-09-24 17:08:17 +0200 | [diff] [blame] | 78 | cp = shmat(shmid, NULL, 0); |
subrata_modak | 78b1912 | 2008-05-15 06:54:17 +0000 | [diff] [blame] | 79 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 80 | if (cp == (char *)-1) { |
| 81 | perror("shmat"); |
| 82 | tst_resm(TFAIL, "shmat Failed: shmid = %d, errno = %d\n", |
| 83 | shmid, errno); |
| 84 | rm_shm(shmid); |
| 85 | tst_exit(); |
| 86 | } |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 87 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 88 | *cp = '1'; |
| 89 | *(cp + 1) = '2'; |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 90 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 91 | tst_resm(TPASS, "shmat"); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 92 | |
| 93 | /*----------------------------------------------------------------*/ |
| 94 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 95 | rm_shm(shmid); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 96 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 97 | if (*cp != '1' || *(cp + 1) != '2') { |
| 98 | tst_resm(TFAIL, |
| 99 | "Error in shared memory contents: shmid = %d\n", |
| 100 | shmid); |
| 101 | } |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 102 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 103 | tst_resm(TPASS, "Correct shared memory contents"); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 104 | |
| 105 | /*------------------------------------------------------------------*/ |
| 106 | |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 107 | tst_exit(); |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | int rm_shm(shmid) |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 111 | int shmid; |
robbiew | 38f7911 | 2002-12-23 17:01:49 +0000 | [diff] [blame] | 112 | { |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 113 | if (shmctl(shmid, IPC_RMID, NULL) == -1) { |
| 114 | perror("shmctl"); |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 115 | tst_brkm(TFAIL, |
| 116 | NULL, |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 117 | "shmctl Failed to remove: shmid = %d, errno = %d\n", |
| 118 | shmid, errno); |
vapier | 2e2af47 | 2007-03-13 20:15:16 +0000 | [diff] [blame] | 119 | } |
| 120 | return (0); |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 121 | } |