xref: /aosp_15_r20/external/ltp/libs/libltpnewipc/libnewipc.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) 2016 Xiao Yang <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  */
5*49cdfc7eSAndroid Build Coastguard Worker 
6*49cdfc7eSAndroid Build Coastguard Worker /*
7*49cdfc7eSAndroid Build Coastguard Worker  * DESCRIPTION
8*49cdfc7eSAndroid Build Coastguard Worker  * common routines for the IPC system call tests.
9*49cdfc7eSAndroid Build Coastguard Worker  */
10*49cdfc7eSAndroid Build Coastguard Worker 
11*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
12*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
13*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
14*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
15*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
16*49cdfc7eSAndroid Build Coastguard Worker #include <sys/ipc.h>
17*49cdfc7eSAndroid Build Coastguard Worker #include <sys/msg.h>
18*49cdfc7eSAndroid Build Coastguard Worker #include <sys/shm.h>
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker #define	TST_NO_DEFAULT_MAIN
21*49cdfc7eSAndroid Build Coastguard Worker 
22*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
23*49cdfc7eSAndroid Build Coastguard Worker #include "libnewipc.h"
24*49cdfc7eSAndroid Build Coastguard Worker #include "tst_safe_stdio.h"
25*49cdfc7eSAndroid Build Coastguard Worker #include "tst_safe_sysv_ipc.h"
26*49cdfc7eSAndroid Build Coastguard Worker 
27*49cdfc7eSAndroid Build Coastguard Worker #define BUFSIZE 1024
28*49cdfc7eSAndroid Build Coastguard Worker 
getipckey(const char * file,const int lineno)29*49cdfc7eSAndroid Build Coastguard Worker key_t getipckey(const char *file, const int lineno)
30*49cdfc7eSAndroid Build Coastguard Worker {
31*49cdfc7eSAndroid Build Coastguard Worker 	char buf[BUFSIZE];
32*49cdfc7eSAndroid Build Coastguard Worker 	key_t key;
33*49cdfc7eSAndroid Build Coastguard Worker 	int id;
34*49cdfc7eSAndroid Build Coastguard Worker 	static int count;
35*49cdfc7eSAndroid Build Coastguard Worker 
36*49cdfc7eSAndroid Build Coastguard Worker 	safe_getcwd(file, lineno, NULL, buf, BUFSIZE);
37*49cdfc7eSAndroid Build Coastguard Worker 
38*49cdfc7eSAndroid Build Coastguard Worker 	id = count % 26 + (int) 'a';
39*49cdfc7eSAndroid Build Coastguard Worker 	count++;
40*49cdfc7eSAndroid Build Coastguard Worker 
41*49cdfc7eSAndroid Build Coastguard Worker 	key = ftok(buf, id);
42*49cdfc7eSAndroid Build Coastguard Worker 	if (key == -1) {
43*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk(TBROK | TERRNO,
44*49cdfc7eSAndroid Build Coastguard Worker 			"ftok() failed at %s:%d", file, lineno);
45*49cdfc7eSAndroid Build Coastguard Worker 	}
46*49cdfc7eSAndroid Build Coastguard Worker 
47*49cdfc7eSAndroid Build Coastguard Worker 	return key;
48*49cdfc7eSAndroid Build Coastguard Worker }
49*49cdfc7eSAndroid Build Coastguard Worker 
get_used_sysvipc(const char * file,const int lineno,const char * sysvipc_file)50*49cdfc7eSAndroid Build Coastguard Worker int get_used_sysvipc(const char *file, const int lineno, const char *sysvipc_file)
51*49cdfc7eSAndroid Build Coastguard Worker {
52*49cdfc7eSAndroid Build Coastguard Worker 	FILE *fp;
53*49cdfc7eSAndroid Build Coastguard Worker 	int used = -1;
54*49cdfc7eSAndroid Build Coastguard Worker 	char buf[BUFSIZE];
55*49cdfc7eSAndroid Build Coastguard Worker 
56*49cdfc7eSAndroid Build Coastguard Worker 	fp = safe_fopen(file, lineno, NULL, sysvipc_file, "r");
57*49cdfc7eSAndroid Build Coastguard Worker 
58*49cdfc7eSAndroid Build Coastguard Worker 	while (fgets(buf, BUFSIZE, fp) != NULL)
59*49cdfc7eSAndroid Build Coastguard Worker 		used++;
60*49cdfc7eSAndroid Build Coastguard Worker 
61*49cdfc7eSAndroid Build Coastguard Worker 	fclose(fp);
62*49cdfc7eSAndroid Build Coastguard Worker 
63*49cdfc7eSAndroid Build Coastguard Worker 	if (used < 0) {
64*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk(TBROK, "can't read %s to get used sysvipc resource total at "
65*49cdfc7eSAndroid Build Coastguard Worker 			"%s:%d", sysvipc_file, file, lineno);
66*49cdfc7eSAndroid Build Coastguard Worker 	}
67*49cdfc7eSAndroid Build Coastguard Worker 
68*49cdfc7eSAndroid Build Coastguard Worker 	return used;
69*49cdfc7eSAndroid Build Coastguard Worker }
70*49cdfc7eSAndroid Build Coastguard Worker 
probe_free_addr(const char * file,const int lineno)71*49cdfc7eSAndroid Build Coastguard Worker void *probe_free_addr(const char *file, const int lineno)
72*49cdfc7eSAndroid Build Coastguard Worker {
73*49cdfc7eSAndroid Build Coastguard Worker 	void *addr;
74*49cdfc7eSAndroid Build Coastguard Worker 	int shm_id = -1;
75*49cdfc7eSAndroid Build Coastguard Worker 	key_t probe_key = 0;
76*49cdfc7eSAndroid Build Coastguard Worker 
77*49cdfc7eSAndroid Build Coastguard Worker 	probe_key = GETIPCKEY();
78*49cdfc7eSAndroid Build Coastguard Worker 
79*49cdfc7eSAndroid Build Coastguard Worker 	shm_id = safe_shmget(file, lineno, probe_key, SHMLBA * 2,
80*49cdfc7eSAndroid Build Coastguard Worker 			     SHM_RW | IPC_CREAT | IPC_EXCL);
81*49cdfc7eSAndroid Build Coastguard Worker 	addr = safe_shmat(file, lineno, shm_id, NULL, 0);
82*49cdfc7eSAndroid Build Coastguard Worker 	safe_shmdt(file, lineno, addr);
83*49cdfc7eSAndroid Build Coastguard Worker 	safe_shmctl(file, lineno, shm_id, IPC_RMID, NULL);
84*49cdfc7eSAndroid Build Coastguard Worker 
85*49cdfc7eSAndroid Build Coastguard Worker 	addr = (void *)(((unsigned long)(addr) + (SHMLBA - 1)) & ~(SHMLBA - 1));
86*49cdfc7eSAndroid Build Coastguard Worker 
87*49cdfc7eSAndroid Build Coastguard Worker 	return addr;
88*49cdfc7eSAndroid Build Coastguard Worker }
89