]> git.ipfire.org Git - thirdparty/util-linux.git/blame - sys-utils/ipcutils.h
wipefs: Allow explicitly enable/disablement
[thirdparty/util-linux.git] / sys-utils / ipcutils.h
CommitLineData
e5995acd
SK
1#ifndef UTIL_LINUX_IPCUTILS_H
2#define UTIL_LINUX_IPCUTILS_H
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <sys/ipc.h>
7#include <sys/msg.h>
8#include <sys/sem.h>
9#include <sys/shm.h>
10#include <sys/types.h>
11#include <time.h>
12#include <unistd.h>
13#include <grp.h>
14#include <pwd.h>
873e7a59 15#include <stdint.h>
e5995acd
SK
16
17/*
18 * SHM_DEST and SHM_LOCKED are defined in kernel headers, but inside
19 * #ifdef __KERNEL__ ... #endif
20 */
21#ifndef SHM_DEST
22 /* shm_mode upper byte flags */
23# define SHM_DEST 01000 /* segment will be destroyed on last detach */
24# define SHM_LOCKED 02000 /* segment will not be swapped */
25#endif
26
27/* For older kernels the same holds for the defines below */
28#ifndef MSG_STAT
29# define MSG_STAT 11
30# define MSG_INFO 12
31#endif
32
33#ifndef SHM_STAT
34# define SHM_STAT 13
35# define SHM_INFO 14
36struct shm_info {
37 int used_ids;
8fe76cd1
RM
38 unsigned long shm_tot; /* total allocated shm */
39 unsigned long shm_rss; /* total resident shm */
40 unsigned long shm_swp; /* total swapped shm */
41 unsigned long swap_attempts;
42 unsigned long swap_successes;
e5995acd
SK
43};
44#endif
45
46#ifndef SEM_STAT
47# define SEM_STAT 18
48# define SEM_INFO 19
49#endif
50
51/* Some versions of libc only define IPC_INFO when __USE_GNU is defined. */
52#ifndef IPC_INFO
53# define IPC_INFO 3
54#endif
55
56/*
57 * * The last arg of semctl is a union semun, but where is it defined? X/OPEN
58 * * tells us to define it ourselves, but until recently Linux include files
59 * * would also define it.
60 * */
61#ifndef HAVE_UNION_SEMUN
62/* according to X/OPEN we have to define it ourselves */
63union semun {
64 int val;
65 struct semid_ds *buf;
66 unsigned short int *array;
67 struct seminfo *__buf;
68};
69#endif
70
71/*
72 * X/OPEN (Jan 1987) does not define fields key, seq in struct ipc_perm;
73 * glibc-1.09 has no support for sysv ipc.
74 * glibc 2 uses __key, __seq
75 */
76#if defined (__GLIBC__) && __GLIBC__ >= 2
77# define KEY __key
78#else
79# define KEY key
80#endif
81
56692a67
SK
82/* Size printing in ipcs is using these. */
83enum {
84 IPC_UNIT_DEFAULT,
85 IPC_UNIT_BYTES,
86 IPC_UNIT_KB,
87 IPC_UNIT_HUMAN
88};
89
e5995acd
SK
90struct ipc_limits {
91 uint64_t shmmni; /* max number of segments */
92 uint64_t shmmax; /* max segment size */
93 uint64_t shmall; /* max total shared memory */
94 uint64_t shmmin; /* min segment size */
95
96 int semmni; /* max number of arrays */
97 int semmsl; /* max semaphores per array */
98 int semmns; /* max semaphores system wide */
99 int semopm; /* max ops per semop call */
100 unsigned int semvmx; /* semaphore max value (constant) */
101
102 int msgmni; /* max queues system wide */
f09a98de 103 uint64_t msgmax; /* max size of message */
e5995acd
SK
104 int msgmnb; /* default max size of queue */
105};
106
107extern int ipc_msg_get_limits(struct ipc_limits *lim);
108extern int ipc_sem_get_limits(struct ipc_limits *lim);
109extern int ipc_shm_get_limits(struct ipc_limits *lim);
110
058e8154
SK
111struct ipc_stat {
112 int id;
113 key_t key;
114 uid_t uid; /* current uid */
115 gid_t gid; /* current gid */
116 uid_t cuid; /* creator uid */
117 gid_t cgid; /* creator gid */
118 unsigned int mode;
119};
120
121extern void ipc_print_perms(FILE *f, struct ipc_stat *is);
873e7a59 122extern void ipc_print_size(int unit, char *msg, uint64_t size, const char *end, int width);
058e8154
SK
123
124/* See 'struct shmid_kernel' in kernel sources
125 */
126struct shm_data {
127 struct ipc_stat shm_perm;
128
129 uint64_t shm_nattch;
130 uint64_t shm_segsz;
278e7203
KZ
131 int64_t shm_atim; /* __kernel_time_t is signed long */
132 int64_t shm_dtim;
133 int64_t shm_ctim;
058e8154
SK
134 pid_t shm_cprid;
135 pid_t shm_lprid;
136 uint64_t shm_rss;
137 uint64_t shm_swp;
138
139 struct shm_data *next;
140};
141
61e14b4a 142extern int ipc_shm_get_info(int id, struct shm_data **shmds);
058e8154
SK
143extern void ipc_shm_free_info(struct shm_data *shmds);
144
1e2418a2
SK
145/* See 'struct sem_array' in kernel sources
146 */
b5504a3d
SK
147struct sem_elem {
148 int semval;
149 int ncount; /* processes waiting on increase semval */
150 int zcount; /* processes waiting on semval set to zero */
151 pid_t pid; /* process last executed semop(2) call */
152};
1e2418a2
SK
153struct sem_data {
154 struct ipc_stat sem_perm;
155
278e7203
KZ
156 int64_t sem_ctime;
157 int64_t sem_otime;
1e2418a2
SK
158 uint64_t sem_nsems;
159
b5504a3d 160 struct sem_elem *elements;
1e2418a2
SK
161 struct sem_data *next;
162};
163
164extern int ipc_sem_get_info(int id, struct sem_data **semds);
165extern void ipc_sem_free_info(struct sem_data *semds);
166
35118dfc
SK
167/* See 'struct msg_queue' in kernel sources
168 */
169struct msg_data {
170 struct ipc_stat msg_perm;
171
278e7203
KZ
172 int64_t q_stime;
173 int64_t q_rtime;
174 int64_t q_ctime;
35118dfc
SK
175 uint64_t q_cbytes;
176 uint64_t q_qnum;
177 uint64_t q_qbytes;
178 pid_t q_lspid;
179 pid_t q_lrpid;
180
181 struct msg_data *next;
182};
183
184extern int ipc_msg_get_info(int id, struct msg_data **msgds);
185extern void ipc_msg_free_info(struct msg_data *msgds);
186
e5995acd 187#endif /* UTIL_LINUX_IPCUTILS_H */