140266059SGregory Neil Shapiro /* 240266059SGregory Neil Shapiro * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro */ 940266059SGregory Neil Shapiro 1040266059SGregory Neil Shapiro #include <sm/gen.h> 1140266059SGregory Neil Shapiro SM_RCSID("@(#)$Id: shm.c,v 1.10 2001/12/14 00:22:58 ca Exp $") 1240266059SGregory Neil Shapiro 1340266059SGregory Neil Shapiro #if SM_CONF_SHM 1440266059SGregory Neil Shapiro # include <stdlib.h> 1540266059SGregory Neil Shapiro # include <unistd.h> 1640266059SGregory Neil Shapiro # include <errno.h> 1740266059SGregory Neil Shapiro # include <sm/shm.h> 1840266059SGregory Neil Shapiro 1940266059SGregory Neil Shapiro /* 2040266059SGregory Neil Shapiro ** SM_SHMSTART -- initialize shared memory segment. 2140266059SGregory Neil Shapiro ** 2240266059SGregory Neil Shapiro ** Parameters: 2340266059SGregory Neil Shapiro ** key -- key for shared memory. 2440266059SGregory Neil Shapiro ** size -- size of segment. 2540266059SGregory Neil Shapiro ** shmflag -- initial flags. 2640266059SGregory Neil Shapiro ** shmid -- pointer to return id. 2740266059SGregory Neil Shapiro ** owner -- create segment. 2840266059SGregory Neil Shapiro ** 2940266059SGregory Neil Shapiro ** Returns: 3040266059SGregory Neil Shapiro ** pointer to shared memory segment, 3140266059SGregory Neil Shapiro ** NULL on failure. 3240266059SGregory Neil Shapiro ** 3340266059SGregory Neil Shapiro ** Side Effects: 3440266059SGregory Neil Shapiro ** attaches shared memory segment. 3540266059SGregory Neil Shapiro */ 3640266059SGregory Neil Shapiro 3740266059SGregory Neil Shapiro void * 3840266059SGregory Neil Shapiro sm_shmstart(key, size, shmflg, shmid, owner) 3940266059SGregory Neil Shapiro key_t key; 4040266059SGregory Neil Shapiro int size; 4140266059SGregory Neil Shapiro int shmflg; 4240266059SGregory Neil Shapiro int *shmid; 4340266059SGregory Neil Shapiro bool owner; 4440266059SGregory Neil Shapiro { 4540266059SGregory Neil Shapiro int save_errno; 4640266059SGregory Neil Shapiro void *shm = SM_SHM_NULL; 4740266059SGregory Neil Shapiro 4840266059SGregory Neil Shapiro /* default: user/group accessible */ 4940266059SGregory Neil Shapiro if (shmflg == 0) 5040266059SGregory Neil Shapiro shmflg = SHM_R|SHM_W|(SHM_R>>3)|(SHM_W>>3); 5140266059SGregory Neil Shapiro if (owner) 5240266059SGregory Neil Shapiro shmflg |= IPC_CREAT|IPC_EXCL; 5340266059SGregory Neil Shapiro *shmid = shmget(key, size, shmflg); 5440266059SGregory Neil Shapiro if (*shmid < 0) 5540266059SGregory Neil Shapiro goto error; 5640266059SGregory Neil Shapiro 5740266059SGregory Neil Shapiro shm = shmat(*shmid, (void *) 0, 0); 5840266059SGregory Neil Shapiro if (shm == SM_SHM_NULL) 5940266059SGregory Neil Shapiro goto error; 6040266059SGregory Neil Shapiro 6140266059SGregory Neil Shapiro return shm; 6240266059SGregory Neil Shapiro 6340266059SGregory Neil Shapiro error: 6440266059SGregory Neil Shapiro save_errno = errno; 6540266059SGregory Neil Shapiro if (shm != SM_SHM_NULL || *shmid >= 0) 6640266059SGregory Neil Shapiro sm_shmstop(shm, *shmid, owner); 6740266059SGregory Neil Shapiro *shmid = SM_SHM_NO_ID; 6840266059SGregory Neil Shapiro errno = save_errno; 6940266059SGregory Neil Shapiro return (void *) 0; 7040266059SGregory Neil Shapiro } 7140266059SGregory Neil Shapiro 7240266059SGregory Neil Shapiro /* 7340266059SGregory Neil Shapiro ** SM_SHMSTOP -- stop using shared memory segment. 7440266059SGregory Neil Shapiro ** 7540266059SGregory Neil Shapiro ** Parameters: 7640266059SGregory Neil Shapiro ** shm -- pointer to shared memory. 7740266059SGregory Neil Shapiro ** shmid -- id. 7840266059SGregory Neil Shapiro ** owner -- delete segment. 7940266059SGregory Neil Shapiro ** 8040266059SGregory Neil Shapiro ** Returns: 8140266059SGregory Neil Shapiro ** 0 on success. 8240266059SGregory Neil Shapiro ** < 0 on failure. 8340266059SGregory Neil Shapiro ** 8440266059SGregory Neil Shapiro ** Side Effects: 8540266059SGregory Neil Shapiro ** detaches (and maybe removes) shared memory segment. 8640266059SGregory Neil Shapiro */ 8740266059SGregory Neil Shapiro 8840266059SGregory Neil Shapiro int 8940266059SGregory Neil Shapiro sm_shmstop(shm, shmid, owner) 9040266059SGregory Neil Shapiro void *shm; 9140266059SGregory Neil Shapiro int shmid; 9240266059SGregory Neil Shapiro bool owner; 9340266059SGregory Neil Shapiro { 9440266059SGregory Neil Shapiro int r; 9540266059SGregory Neil Shapiro 9640266059SGregory Neil Shapiro if (shm != SM_SHM_NULL && (r = shmdt(shm)) < 0) 9740266059SGregory Neil Shapiro return r; 9840266059SGregory Neil Shapiro if (owner && shmid >= 0 && (r = shmctl(shmid, IPC_RMID, NULL)) < 0) 9940266059SGregory Neil Shapiro return r; 10040266059SGregory Neil Shapiro return 0; 10140266059SGregory Neil Shapiro } 10240266059SGregory Neil Shapiro #endif /* SM_CONF_SHM */ 103