• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 /* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
21 /* 10/30/2002	Port to LTP	dbarrera@us.ibm.com */
22 
23 /*
24  * NAME
25  *	semctl07
26  *
27  * CALLS
28  *	semctl(2) semget(2)
29  *
30  * ALGORITHM
31  *	Get and manipulate a set of semaphores.
32  *
33  * RESTRICTIONS
34  *
35  * HISTORY
36  *      10/03/2008 Renaud Lottiaux (Renaud.Lottiaux@kerlabs.com)
37  *      - Fix concurrency issue. A statically defined key was used. Leading
38  *        to conflict with other instances of the same test.
39  */
40 
41 #include <sys/types.h>
42 #include <sys/ipc.h>
43 #include <sys/sem.h>
44 #include <signal.h>
45 #include <errno.h>
46 #include <stdio.h>
47 #include <wait.h>
48 #include "ipcsem.h"
49 #include "test.h"
50 
51 void setup(void);
52 void cleanup(void);
53 
54 char *TCID = "semctl07";
55 int TST_TOTAL = 1;
56 
57 key_t key;
58 int semid = -1, nsems;
59 
main(int argc,char * argv[])60 int main(int argc, char *argv[])
61 {
62 	int status;
63 	struct semid_ds buf_ds;
64 
65 	union semun arg;
66 
67 	setup();
68 
69 	arg.buf = &buf_ds;
70 	if ((status = semctl(semid, 0, IPC_STAT, arg)) == -1) {
71 		tst_resm(TFAIL, "semctl() failed errno = %d", errno);
72 		semctl(semid, 1, IPC_RMID, arg);
73 
74 	}
75 
76 	/*
77 	 * Check contents of semid_ds structure.
78 	 */
79 
80 	if (arg.buf->sem_nsems != nsems) {
81 		tst_resm(TFAIL, "error: unexpected number of sems %lu",
82 			 arg.buf->sem_nsems);
83 
84 	}
85 	if (arg.buf->sem_perm.uid != getuid()) {
86 		tst_resm(TFAIL, "error: unexpected uid %d",
87 			 arg.buf->sem_perm.uid);
88 
89 	}
90 	if (arg.buf->sem_perm.gid != getgid()) {
91 		tst_resm(TFAIL, "error: unexpected gid %d",
92 			 arg.buf->sem_perm.gid);
93 
94 	}
95 	if (arg.buf->sem_perm.cuid != getuid()) {
96 		tst_resm(TFAIL, "error: unexpected cuid %d",
97 			 arg.buf->sem_perm.cuid);
98 
99 	}
100 	if (arg.buf->sem_perm.cgid != getgid()) {
101 		tst_resm(TFAIL, "error: unexpected cgid %d",
102 			 arg.buf->sem_perm.cgid);
103 
104 	}
105 	if ((status = semctl(semid, 0, GETVAL, arg)) == -1) {
106 		tst_resm(TFAIL, "semctl(GETVAL) failed errno = %d", errno);
107 
108 	}
109 	arg.val = 1;
110 	if ((status = semctl(semid, 0, SETVAL, arg)) == -1) {
111 		tst_resm(TFAIL, "SEMCTL(SETVAL) failed errno = %d", errno);
112 
113 	}
114 	if ((status = semctl(semid, 0, GETVAL, arg)) == -1) {
115 		tst_resm(TFAIL, "semctl(GETVAL) failed errno = %d", errno);
116 
117 	}
118 	if (status != arg.val) {
119 		tst_resm(TFAIL, "error: unexpected value %d", status);
120 
121 	}
122 	if ((status = semctl(semid, 0, GETPID, arg)) == -1) {
123 		tst_resm(TFAIL, "semctl(GETPID) failed errno = %d", errno);
124 
125 	}
126 	status = getpid();
127 	if (status == 0) {
128 		tst_resm(TFAIL, "error: unexpected pid %d", status);
129 
130 	}
131 	if ((status = semctl(semid, 0, GETNCNT, arg)) == -1) {
132 		tst_resm(TFAIL, "semctl(GETNCNT) failed errno = %d", errno);
133 
134 	}
135 	if (status != 0) {
136 		tst_resm(TFAIL, "error: unexpected semncnt %d", status);
137 
138 	}
139 	if ((status = semctl(semid, 0, GETZCNT, arg)) == -1) {
140 		tst_resm(TFAIL, "semctl(GETZCNT) failed errno = %d", errno);
141 
142 	}
143 	if (status != 0) {
144 		tst_resm(TFAIL, "error: unexpected semzcnt %d", status);
145 
146 	}
147 
148 	tst_resm(TPASS, "semctl07 ran successfully!");
149 
150 	cleanup();
151 	tst_exit();
152 }
153 
setup(void)154 void setup(void)
155 {
156 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
157 
158 	TEST_PAUSE;
159 
160 	tst_tmpdir();
161 
162 	/* get an IPC resource key */
163 	key = getipckey();
164 	nsems = 1;
165 
166 	if ((semid = semget(key, nsems, SEM_RA | IPC_CREAT)) == -1) {
167 		tst_brkm(TFAIL, NULL, "semget() failed errno = %d", errno);
168 	}
169 }
170 
cleanup(void)171 void cleanup(void)
172 {
173 	rm_sema(semid);
174 	tst_rmdir();
175 }
176