shmget_msg
struct shmget_msg msg;
shmget_existing(struct shmget_msg *shmget_msg, int mode,
if ((shmget_msg->shmflg & (IPC_CREAT | IPC_EXCL)) == (IPC_CREAT | IPC_EXCL))
if (shmget_msg->size && (shmget_msg->size > shmseg->shm_segsz))
shmget_allocate_segment(pid_t pid, struct shmget_msg *shmget_msg,
if (shmget_msg->type == UNDOGET) {
if ((long)shmget_msg->size < shminfo.shmmin)
size = round_page(shmget_msg->size);
shmseg->shm_perm.key = shmget_msg->key;
handle->type = shmget_msg->type;
handle->fd = create_sysv_file(shmget_msg, size, shmseg);
shmseg->shm_segsz = shmget_msg->size;
if (shmget_msg->type == UNDOGET) {
handle_shmget(pid_t pid, struct shmget_msg *shmget_msg,
mode = shmget_msg->shmflg & ACCESSPERMS;
sysvd_print("ask for key = %ld\n", shmget_msg->key);
shmget_msg->key = (shmget_msg->key & 0x3FFF) |
(shmget_msg->type << 30);
sysvd_print("ask for key = %ld\n", shmget_msg->key);
if (shmget_msg->key != IPC_PRIVATE) {
segnum = shm_find_segment_by_key(shmget_msg->key);
error = shmget_existing(shmget_msg, mode, segnum, cred);
if ((shmget_msg->shmflg & IPC_CREAT) == 0) {
error = shmget_allocate_segment(pid, shmget_msg, mode, cred);
create_sysv_file(struct shmget_msg *msg, size_t size,
int handle_shmget(pid_t, struct shmget_msg *, struct cmsgcred *);
struct shmget_msg shmget_msg;
receive_msg_with_cred(fd_recv, (char *)&shmget_msg,
sizeof(shmget_msg), &cred);
&shmget_msg, &cred);