summaryrefslogtreecommitdiff
path: root/contrib/sendmail/libsm/shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/libsm/shm.c')
-rw-r--r--contrib/sendmail/libsm/shm.c38
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 */