diff options
Diffstat (limited to 'contrib/sendmail/libsm/shm.c')
-rw-r--r-- | contrib/sendmail/libsm/shm.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/contrib/sendmail/libsm/shm.c b/contrib/sendmail/libsm/shm.c index 4cef8929e283e..b68f7c689d5ec 100644 --- a/contrib/sendmail/libsm/shm.c +++ b/contrib/sendmail/libsm/shm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001, 2003 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2001, 2003, 2005 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #include <sm/gen.h> -SM_RCSID("@(#)$Id: shm.c,v 1.16 2003/06/13 21:18:08 ca Exp $") +SM_RCSID("@(#)$Id: shm.c,v 1.18 2005/02/09 01:54:51 ca Exp $") #if SM_CONF_SHM # include <stdlib.h> @@ -104,4 +104,38 @@ sm_shmstop(shm, shmid, owner) } +/* +** SM_SHMSETOWNER -- set owner/group/mode of shared memory segment. +** +** Parameters: +** shmid -- id. +** uid -- uid to use +** gid -- gid to use +** mode -- mode to use +** +** Returns: +** 0 on success. +** < 0 on failure. +*/ + +int +sm_shmsetowner(shmid, uid, gid, mode) + int shmid; + uid_t uid; + gid_t gid; + mode_t mode; +{ + int r; + struct shmid_ds shmid_ds; + + memset(&shmid_ds, 0, sizeof(shmid_ds)); + if ((r = shmctl(shmid, IPC_STAT, &shmid_ds)) < 0) + return r; + shmid_ds.shm_perm.uid = uid; + shmid_ds.shm_perm.gid = gid; + shmid_ds.shm_perm.mode = mode; + if ((r = shmctl(shmid, IPC_SET, &shmid_ds)) < 0) + return r; + return 0; +} #endif /* SM_CONF_SHM */ |