xref: /aosp_15_r20/external/ltp/lib/tst_safe_sysv_ipc.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2017 Xiao yang <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  */
5*49cdfc7eSAndroid Build Coastguard Worker 
6*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
7*49cdfc7eSAndroid Build Coastguard Worker #include <sys/msg.h>
8*49cdfc7eSAndroid Build Coastguard Worker #include <sys/shm.h>
9*49cdfc7eSAndroid Build Coastguard Worker #define TST_NO_DEFAULT_MAIN
10*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
11*49cdfc7eSAndroid Build Coastguard Worker #include "tst_safe_sysv_ipc.h"
12*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/ipc.h"
13*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/sem.h"
14*49cdfc7eSAndroid Build Coastguard Worker 
15*49cdfc7eSAndroid Build Coastguard Worker /*
16*49cdfc7eSAndroid Build Coastguard Worker  * The IPC_STAT, IPC_SET, IPC_RMID can return either 0 or -1.
17*49cdfc7eSAndroid Build Coastguard Worker  */
msg_ret_check(int cmd,int ret)18*49cdfc7eSAndroid Build Coastguard Worker static int msg_ret_check(int cmd, int ret)
19*49cdfc7eSAndroid Build Coastguard Worker {
20*49cdfc7eSAndroid Build Coastguard Worker 	switch (cmd) {
21*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_STAT:
22*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_SET:
23*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_RMID:
24*49cdfc7eSAndroid Build Coastguard Worker 		return ret != 0;
25*49cdfc7eSAndroid Build Coastguard Worker 	default:
26*49cdfc7eSAndroid Build Coastguard Worker 		return ret < 0;
27*49cdfc7eSAndroid Build Coastguard Worker 	}
28*49cdfc7eSAndroid Build Coastguard Worker }
29*49cdfc7eSAndroid Build Coastguard Worker 
30*49cdfc7eSAndroid Build Coastguard Worker /*
31*49cdfc7eSAndroid Build Coastguard Worker  * The IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK can return either 0 or -1.
32*49cdfc7eSAndroid Build Coastguard Worker  */
shm_ret_check(int cmd,int ret)33*49cdfc7eSAndroid Build Coastguard Worker static int shm_ret_check(int cmd, int ret)
34*49cdfc7eSAndroid Build Coastguard Worker {
35*49cdfc7eSAndroid Build Coastguard Worker 	switch (cmd) {
36*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_STAT:
37*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_SET:
38*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_RMID:
39*49cdfc7eSAndroid Build Coastguard Worker 	case SHM_LOCK:
40*49cdfc7eSAndroid Build Coastguard Worker 	case SHM_UNLOCK:
41*49cdfc7eSAndroid Build Coastguard Worker 		return ret != 0;
42*49cdfc7eSAndroid Build Coastguard Worker 	default:
43*49cdfc7eSAndroid Build Coastguard Worker 		return ret < 0;
44*49cdfc7eSAndroid Build Coastguard Worker 	}
45*49cdfc7eSAndroid Build Coastguard Worker }
46*49cdfc7eSAndroid Build Coastguard Worker 
47*49cdfc7eSAndroid Build Coastguard Worker /*
48*49cdfc7eSAndroid Build Coastguard Worker  * The IPC_STAT, IPC_SET, IPC_RMID, SETALL, SETVAL can return either 0 or -1.
49*49cdfc7eSAndroid Build Coastguard Worker  */
sem_ret_check(int cmd,int ret)50*49cdfc7eSAndroid Build Coastguard Worker static int sem_ret_check(int cmd, int ret)
51*49cdfc7eSAndroid Build Coastguard Worker {
52*49cdfc7eSAndroid Build Coastguard Worker 	switch (cmd) {
53*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_STAT:
54*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_SET:
55*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_RMID:
56*49cdfc7eSAndroid Build Coastguard Worker 	case SETALL:
57*49cdfc7eSAndroid Build Coastguard Worker 	case SETVAL:
58*49cdfc7eSAndroid Build Coastguard Worker 		return ret != 0;
59*49cdfc7eSAndroid Build Coastguard Worker 	default:
60*49cdfc7eSAndroid Build Coastguard Worker 		return ret < 0;
61*49cdfc7eSAndroid Build Coastguard Worker 	}
62*49cdfc7eSAndroid Build Coastguard Worker }
63*49cdfc7eSAndroid Build Coastguard Worker 
safe_msgget(const char * file,const int lineno,key_t key,int msgflg)64*49cdfc7eSAndroid Build Coastguard Worker int safe_msgget(const char *file, const int lineno, key_t key, int msgflg)
65*49cdfc7eSAndroid Build Coastguard Worker {
66*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
67*49cdfc7eSAndroid Build Coastguard Worker 
68*49cdfc7eSAndroid Build Coastguard Worker 	rval = msgget(key, msgflg);
69*49cdfc7eSAndroid Build Coastguard Worker 
70*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
71*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "msgget(%i, %x) failed",
72*49cdfc7eSAndroid Build Coastguard Worker 			(int)key, msgflg);
73*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
74*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
75*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid msgget(%i, %x) return value %d", (int)key,
76*49cdfc7eSAndroid Build Coastguard Worker 			msgflg, rval);
77*49cdfc7eSAndroid Build Coastguard Worker 	}
78*49cdfc7eSAndroid Build Coastguard Worker 
79*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
80*49cdfc7eSAndroid Build Coastguard Worker }
81*49cdfc7eSAndroid Build Coastguard Worker 
safe_msgsnd(const char * file,const int lineno,int msqid,const void * msgp,size_t msgsz,int msgflg)82*49cdfc7eSAndroid Build Coastguard Worker int safe_msgsnd(const char *file, const int lineno, int msqid, const void *msgp,
83*49cdfc7eSAndroid Build Coastguard Worker 		size_t msgsz, int msgflg)
84*49cdfc7eSAndroid Build Coastguard Worker {
85*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
86*49cdfc7eSAndroid Build Coastguard Worker 
87*49cdfc7eSAndroid Build Coastguard Worker 	rval = msgsnd(msqid, msgp, msgsz, msgflg);
88*49cdfc7eSAndroid Build Coastguard Worker 
89*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
90*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
91*49cdfc7eSAndroid Build Coastguard Worker 			"msgsnd(%i, %p, %zu, %x) failed", msqid, msgp, msgsz,
92*49cdfc7eSAndroid Build Coastguard Worker 			msgflg);
93*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
94*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
95*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid msgsnd(%i, %p, %zu, %x) return value %d",
96*49cdfc7eSAndroid Build Coastguard Worker 			msqid, msgp, msgsz, msgflg, rval);
97*49cdfc7eSAndroid Build Coastguard Worker 	}
98*49cdfc7eSAndroid Build Coastguard Worker 
99*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
100*49cdfc7eSAndroid Build Coastguard Worker }
101*49cdfc7eSAndroid Build Coastguard Worker 
safe_msgrcv(const char * file,const int lineno,int msqid,void * msgp,size_t msgsz,long msgtyp,int msgflg)102*49cdfc7eSAndroid Build Coastguard Worker ssize_t safe_msgrcv(const char *file, const int lineno, int msqid, void *msgp,
103*49cdfc7eSAndroid Build Coastguard Worker 		size_t msgsz, long msgtyp, int msgflg)
104*49cdfc7eSAndroid Build Coastguard Worker {
105*49cdfc7eSAndroid Build Coastguard Worker 	ssize_t rval;
106*49cdfc7eSAndroid Build Coastguard Worker 
107*49cdfc7eSAndroid Build Coastguard Worker 	rval = msgrcv(msqid, msgp, msgsz, msgtyp, msgflg);
108*49cdfc7eSAndroid Build Coastguard Worker 
109*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
110*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
111*49cdfc7eSAndroid Build Coastguard Worker 			"msgrcv(%i, %p, %zu, %li, %x) failed",
112*49cdfc7eSAndroid Build Coastguard Worker 			msqid, msgp, msgsz, msgtyp, msgflg);
113*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
114*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
115*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid msgrcv(%i, %p, %zu, %li, %x) return value %ld",
116*49cdfc7eSAndroid Build Coastguard Worker 			msqid, msgp, msgsz, msgtyp, msgflg, rval);
117*49cdfc7eSAndroid Build Coastguard Worker 	}
118*49cdfc7eSAndroid Build Coastguard Worker 
119*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
120*49cdfc7eSAndroid Build Coastguard Worker }
121*49cdfc7eSAndroid Build Coastguard Worker 
safe_msgctl(const char * file,const int lineno,int msqid,int cmd,struct msqid_ds * buf)122*49cdfc7eSAndroid Build Coastguard Worker int safe_msgctl(const char *file, const int lineno, int msqid, int cmd,
123*49cdfc7eSAndroid Build Coastguard Worker 		struct msqid_ds *buf)
124*49cdfc7eSAndroid Build Coastguard Worker {
125*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
126*49cdfc7eSAndroid Build Coastguard Worker 
127*49cdfc7eSAndroid Build Coastguard Worker 	rval = msgctl(msqid, cmd, buf);
128*49cdfc7eSAndroid Build Coastguard Worker 
129*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
130*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
131*49cdfc7eSAndroid Build Coastguard Worker 			"msgctl(%i, %i, %p) failed", msqid, cmd, buf);
132*49cdfc7eSAndroid Build Coastguard Worker 	} else if (msg_ret_check(cmd, rval)) {
133*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
134*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid msgctl(%i, %i, %p) return value %d", msqid,
135*49cdfc7eSAndroid Build Coastguard Worker 			cmd, buf, rval);
136*49cdfc7eSAndroid Build Coastguard Worker 	}
137*49cdfc7eSAndroid Build Coastguard Worker 
138*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
139*49cdfc7eSAndroid Build Coastguard Worker }
140*49cdfc7eSAndroid Build Coastguard Worker 
safe_shmget(const char * file,const int lineno,key_t key,size_t size,int shmflg)141*49cdfc7eSAndroid Build Coastguard Worker int safe_shmget(const char *file, const int lineno, key_t key, size_t size,
142*49cdfc7eSAndroid Build Coastguard Worker 		int shmflg)
143*49cdfc7eSAndroid Build Coastguard Worker {
144*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
145*49cdfc7eSAndroid Build Coastguard Worker 
146*49cdfc7eSAndroid Build Coastguard Worker 	rval = shmget(key, size, shmflg);
147*49cdfc7eSAndroid Build Coastguard Worker 
148*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
149*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
150*49cdfc7eSAndroid Build Coastguard Worker 			"shmget(%i, %zu, %x) failed", (int)key, size, shmflg);
151*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
152*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
153*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid shmget(%i, %zu, %x) return value %d",
154*49cdfc7eSAndroid Build Coastguard Worker 			(int)key, size, shmflg, rval);
155*49cdfc7eSAndroid Build Coastguard Worker 	}
156*49cdfc7eSAndroid Build Coastguard Worker 
157*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
158*49cdfc7eSAndroid Build Coastguard Worker }
159*49cdfc7eSAndroid Build Coastguard Worker 
safe_shmat(const char * file,const int lineno,int shmid,const void * shmaddr,int shmflg)160*49cdfc7eSAndroid Build Coastguard Worker void *safe_shmat(const char *file, const int lineno, int shmid,
161*49cdfc7eSAndroid Build Coastguard Worker 		const void *shmaddr, int shmflg)
162*49cdfc7eSAndroid Build Coastguard Worker {
163*49cdfc7eSAndroid Build Coastguard Worker 	void *rval;
164*49cdfc7eSAndroid Build Coastguard Worker 
165*49cdfc7eSAndroid Build Coastguard Worker 	rval = shmat(shmid, shmaddr, shmflg);
166*49cdfc7eSAndroid Build Coastguard Worker 
167*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == (void *)-1) {
168*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
169*49cdfc7eSAndroid Build Coastguard Worker 			"shmat(%i, %p, %x) failed", shmid, shmaddr, shmflg);
170*49cdfc7eSAndroid Build Coastguard Worker 	}
171*49cdfc7eSAndroid Build Coastguard Worker 
172*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
173*49cdfc7eSAndroid Build Coastguard Worker }
174*49cdfc7eSAndroid Build Coastguard Worker 
safe_shmdt(const char * file,const int lineno,const void * shmaddr)175*49cdfc7eSAndroid Build Coastguard Worker int safe_shmdt(const char *file, const int lineno, const void *shmaddr)
176*49cdfc7eSAndroid Build Coastguard Worker {
177*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
178*49cdfc7eSAndroid Build Coastguard Worker 
179*49cdfc7eSAndroid Build Coastguard Worker 	rval = shmdt(shmaddr);
180*49cdfc7eSAndroid Build Coastguard Worker 
181*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
182*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "shmdt(%p) failed",
183*49cdfc7eSAndroid Build Coastguard Worker 			shmaddr);
184*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
185*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
186*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid shmdt(%p) return value %d", shmaddr, rval);
187*49cdfc7eSAndroid Build Coastguard Worker 	}
188*49cdfc7eSAndroid Build Coastguard Worker 
189*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
190*49cdfc7eSAndroid Build Coastguard Worker }
191*49cdfc7eSAndroid Build Coastguard Worker 
safe_shmctl(const char * file,const int lineno,int shmid,int cmd,struct shmid_ds * buf)192*49cdfc7eSAndroid Build Coastguard Worker int safe_shmctl(const char *file, const int lineno, int shmid, int cmd,
193*49cdfc7eSAndroid Build Coastguard Worker 		struct shmid_ds *buf)
194*49cdfc7eSAndroid Build Coastguard Worker {
195*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
196*49cdfc7eSAndroid Build Coastguard Worker 
197*49cdfc7eSAndroid Build Coastguard Worker 	rval = shmctl(shmid, cmd, buf);
198*49cdfc7eSAndroid Build Coastguard Worker 
199*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
200*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
201*49cdfc7eSAndroid Build Coastguard Worker 			"shmctl(%i, %i, %p) failed", shmid, cmd, buf);
202*49cdfc7eSAndroid Build Coastguard Worker 	} else if (shm_ret_check(cmd, rval)) {
203*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
204*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid shmctl(%i, %i, %p) return value %d", shmid,
205*49cdfc7eSAndroid Build Coastguard Worker 			cmd, buf, rval);
206*49cdfc7eSAndroid Build Coastguard Worker 	}
207*49cdfc7eSAndroid Build Coastguard Worker 
208*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
209*49cdfc7eSAndroid Build Coastguard Worker }
210*49cdfc7eSAndroid Build Coastguard Worker 
safe_semget(const char * file,const int lineno,key_t key,int nsems,int semflg)211*49cdfc7eSAndroid Build Coastguard Worker int safe_semget(const char *file, const int lineno, key_t key, int nsems,
212*49cdfc7eSAndroid Build Coastguard Worker 		int semflg)
213*49cdfc7eSAndroid Build Coastguard Worker {
214*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
215*49cdfc7eSAndroid Build Coastguard Worker 
216*49cdfc7eSAndroid Build Coastguard Worker 	rval = semget(key, nsems, semflg);
217*49cdfc7eSAndroid Build Coastguard Worker 
218*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
219*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
220*49cdfc7eSAndroid Build Coastguard Worker 			"semget(%i, %i, %x) failed", (int)key, nsems, semflg);
221*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
222*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
223*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid semget(%i, %i, %x) return value %d",
224*49cdfc7eSAndroid Build Coastguard Worker 			(int)key, nsems, semflg, rval);
225*49cdfc7eSAndroid Build Coastguard Worker 	}
226*49cdfc7eSAndroid Build Coastguard Worker 
227*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
228*49cdfc7eSAndroid Build Coastguard Worker }
229*49cdfc7eSAndroid Build Coastguard Worker 
safe_semctl(const char * file,const int lineno,int semid,int semnum,int cmd,...)230*49cdfc7eSAndroid Build Coastguard Worker int safe_semctl(const char *file, const int lineno, int semid, int semnum,
231*49cdfc7eSAndroid Build Coastguard Worker 		int cmd, ...)
232*49cdfc7eSAndroid Build Coastguard Worker {
233*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
234*49cdfc7eSAndroid Build Coastguard Worker 	va_list va;
235*49cdfc7eSAndroid Build Coastguard Worker 	union semun un = {0};
236*49cdfc7eSAndroid Build Coastguard Worker 
237*49cdfc7eSAndroid Build Coastguard Worker 	switch (cmd) {
238*49cdfc7eSAndroid Build Coastguard Worker 	case SETVAL:
239*49cdfc7eSAndroid Build Coastguard Worker 	case GETALL:
240*49cdfc7eSAndroid Build Coastguard Worker 	case SETALL:
241*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_STAT:
242*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_SET:
243*49cdfc7eSAndroid Build Coastguard Worker 	case SEM_STAT:
244*49cdfc7eSAndroid Build Coastguard Worker 	case SEM_STAT_ANY:
245*49cdfc7eSAndroid Build Coastguard Worker 	case IPC_INFO:
246*49cdfc7eSAndroid Build Coastguard Worker 	case SEM_INFO:
247*49cdfc7eSAndroid Build Coastguard Worker 		va_start(va, cmd);
248*49cdfc7eSAndroid Build Coastguard Worker 		un = va_arg(va, union semun);
249*49cdfc7eSAndroid Build Coastguard Worker 		va_end(va);
250*49cdfc7eSAndroid Build Coastguard Worker 	}
251*49cdfc7eSAndroid Build Coastguard Worker 
252*49cdfc7eSAndroid Build Coastguard Worker 	rval = semctl(semid, semnum, cmd, un);
253*49cdfc7eSAndroid Build Coastguard Worker 
254*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
255*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
256*49cdfc7eSAndroid Build Coastguard Worker 		"semctl(%i, %i, %i,...) failed", semid, semnum, cmd);
257*49cdfc7eSAndroid Build Coastguard Worker 	} else if (sem_ret_check(cmd, rval)) {
258*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
259*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid semctl(%i, %i, %i,...) return value %d", semid,
260*49cdfc7eSAndroid Build Coastguard Worker 			semnum, cmd, rval);
261*49cdfc7eSAndroid Build Coastguard Worker 	}
262*49cdfc7eSAndroid Build Coastguard Worker 
263*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
264*49cdfc7eSAndroid Build Coastguard Worker }
265*49cdfc7eSAndroid Build Coastguard Worker 
safe_semop(const char * file,const int lineno,int semid,struct sembuf * sops,size_t nsops)266*49cdfc7eSAndroid Build Coastguard Worker int safe_semop(const char *file, const int lineno, int semid, struct sembuf *sops,
267*49cdfc7eSAndroid Build Coastguard Worker 		size_t nsops)
268*49cdfc7eSAndroid Build Coastguard Worker {
269*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
270*49cdfc7eSAndroid Build Coastguard Worker 
271*49cdfc7eSAndroid Build Coastguard Worker 	rval = semop(semid, sops, nsops);
272*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
273*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
274*49cdfc7eSAndroid Build Coastguard Worker 			"semop(%d, %p, %zu) failed", semid, sops, nsops);
275*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
276*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
277*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid semop(%d, %p, %zu) return value %d",
278*49cdfc7eSAndroid Build Coastguard Worker 			semid, sops, nsops, rval);
279*49cdfc7eSAndroid Build Coastguard Worker 	}
280*49cdfc7eSAndroid Build Coastguard Worker 
281*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
282*49cdfc7eSAndroid Build Coastguard Worker }
283